# Učenje jezika SQL – Vodnik s primeri kode

Sintaksa jezika SQL temelji na **relacijski algebri**, zaradi česar se ta programski jezik razlikuje od drugih jezikov. Seznanjanje s sintakso prek praktičnih primerov vam lahko pomaga pri učinkovitem učenju jezika SQL.

## Kaj je sintaksa jezika SQL?

V programiranju se izraz »sintaksa« nanaša na **način zapisovanja programskega jezika**. Sintaksa določa osnovne konstrukte kode in način njihovega povezovanja. Razumevanje sintakse je temeljna predpostavka za branje in pisanje kode v programskih jezikih.

Najpomembnejši sintaktični elementi v jeziku SQL so **SQL-izjave, ki lahko vsebujejo tudi klavzule**. Oboje se pogosto imenuje »SQL-ukazi«, čeprav to s tehničnega vidika ni povsem točno. To pa niso edini sintaktični elementi v jeziku SQL. V spodnji tabeli najdete pregled sintaktičnih elementov jezika SQL.

<table>
  <thead>
    <tr>
      <th><strong>Izraz v jeziku SQL</strong></th>
      <th><strong>Razlaga</strong></th>
      <th><strong>Primer</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Izjava</td>
      <td>Naroči DBMS, naj izvede dejanje; konča se s podpičjem</td>
      <td>`CREATE TABLE People;`</td>
    </tr>
    <tr>
      <td>Klavzula</td>
      <td>Spreminja izjavo; se lahko pojavi le znotraj izjav</td>
      <td>`WHERE, HAVING`</td>
    </tr>
    <tr>
      <td>Izraz</td>
      <td>Pri izračunu vrne vrednost</td>
      <td>`6 * 7`</td>
    </tr>
    <tr>
      <td>Identifikator</td>
      <td>Ime objekta v bazi podatkov, spremenljivke ali postopka; lahko je kvalificirano ali nekvalificirano</td>
      <td>`dbname.tablename / tablename`</td>
    </tr>
    <tr>
      <td>Predikat</td>
      <td>Izraz, katerega vrednost je `TRUE, FALSE` ali `UNKNOWN`</td>
      <td>`Age < 42`</td>
    </tr>
    <tr>
      <td>Poizvedba</td>
      <td>Posebna izjava; vrne najden niz zapisov</td>
      <td>`SELECT Name FROM People WHERE Age < 42;`</td>
    </tr>
    <tr>
      <td>Funkcija</td>
      <td>Obdeluje eno ali več vrednosti; običajno ustvari novo vrednost</td>
      <td>`UPPER('text') -- returns 'TEXT'`</td>
    </tr>
    <tr>
      <td>Komentar</td>
      <td>Uporablja se za komentarje v kodi SQL; RDBMS ga ignorira</td>
      <td>`-- Comment up to end of line / /*multiline comment if necessary*/`</td>
    </tr>
  </tbody>
</table>

Note SQL-ukazi, kot sta SELECT in CREATE TABLE, se običajno pišejo z veliko začetnico. Vendar pa jezik SQL ne razlikuje med velikimi in malimi črkami. Uporaba velikih začetnic pri ukazih je le splošno sprejeta konvencija.

## Kako se izvaja koda SQL?

SQL-koda obstaja kot izvorna koda v besedilnih datotekah. Koda zaživi šele v ustreznem izvedbenem okolju. Izvorno kodo prebere **SQL-interpreter** in jo pretvori v ukaze za sistem za upravljanje relacijskih baz podatkov (RDBMS). Pri tem obstajata dva osnovna pristopa:

**1. Interaktivno izvajanje kode SQL**Pri tem pristopu se koda**SQL**vnese ali kopira neposredno v besedilno okno. Koda SQL se izvede, rezultat pa se prikaže. Kodo lahko prilagodite in jo ponovno izvedete. Hitra zaporedja spreminjanja kode in prikazovanja rezultatov pomenijo, da je ta pristop najbolj primeren za učenje in ustvarjanje zapletenih poizvedb. **2. Izvedba SQL kode kot**skripta Pri tem pristopu se celotna datoteka izvorne kode, ki vsebuje SQL kodo, izvede vrstico po vrstico. Po potrebi se povratne informacije uporabniku pošljejo šele ob koncu izvedbe. Ta pristop je najbolj primeren za avtomatizacijo procesov in za uvoz varnostnih kopij baze podatkov MySQL z MySQL dump.

<table>
  <thead>
    <tr>
      <th><strong>Vmesnik</strong></th>
      <th><strong>Opis</strong></th>
      <th><strong>Primeri</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Vmesnik ukazne vrstice (CLI)</td>
      <td>Besedilni vmesnik; vnese in izvede se koda SQL, rezultat se prikaže v besedilni obliki</td>
      <td>mysql, psql, mysqlsh</td>
    </tr>
    <tr>
      <td>Grafični uporabniški vmesnik (GUI)</td>
      <td>SQL koda se vnese v besedilno okno in/ali se generira kot odziv na interakcijo uporabnika; SQL koda se izvede, rezultat se prikaže v obliki tabel</td>
      <td>phpMyAdmin, MySQL Workbench, HeidiSQL</td>
    </tr>
    <tr>
      <td>Vmesnik za programiranje aplikacij (API)</td>
      <td>Omogoča neposredno komunikacijo z RDBMS; koda SQL je vključena in izvedena kot niz v kodi programskega jezika; rezultati so na voljo kot podatkovne strukture za nadaljnjo uporabo</td>
      <td>PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API</td>
    </tr>
  </tbody>
</table>

## Kako vzpostaviti sistem za upravljanje izdelkov z uporabo jezika SQL

Najlažji način za učenje programskega jezika je, da kodo napišete in izvedete sami. V tem vodiču bomo **ustvarili mini bazo podatkov in v njej izvedli poizvedbe**. Za to bomo uporabili [spletni SQL-interpreter](https://sql.js.org/examples/GUI/ "sql.js demo: Online SQL interpreter") s spletne strani *sql.js*. Če želite slediti vodiču, obiščite spletno stran in nadomestite že vneseno kodo SQL s kodo iz naših primerov. Kodo izvajajte po delih, da se prikažejo rezultati.

### Nastavite SQL-bazo podatkov

V tem primeru bomo razvili **sistem za upravljanje** trgovskih **izdelkov** za trgovino. Zahteve so naslednje:

- Na voljo je več izdelkov, od vsakega pa imamo na zalogi določeno količino.
- Naša baza strank vključuje veliko strank in kupcev.
- Naročila, ki jih oddajo stranke, lahko vsebujejo več izdelkov.
- Za vsako naročilo shranjujemo datum naročila in podatke o osebi, ki je oddala naročilo, ter o naročenih izdelkih in količini.

Te zahteve se pretvorijo v **abstrakten opis in nato v kodo SQL**:

1. Ustvari model
2. Opredelite shemo
3. Vnesite zapise podatkov
4. Opredelite poizvedbe

### Ustvarite model entitet in odnosov

Prvi korak poteka na papirju ali s posebnimi orodji za modeliranje. Zberemo podatke o sistemu, ki ga želimo **modelirati, da bi izpeljali entitete in relacije**. Ta korak se pogosto izvede v obliki diagramov entitetno-relacijskih modelov (ER).

Katere entitete obstajajo in kako so med seboj povezane? **Entitete so razredi stvari**. V našem primeru sistema za upravljanje izdelkov so entitete izdelki, stranke in naročila. Za vsako entiteto je potrebna tabela. Zaradi posebnosti relacijskega modela se za modeliranje odnosov dodajo dodatne tabele. Za razumevanje tega in pravilno izvedbo je potrebna izkušnja.

Osrednje vprašanje, na katerega je treba odgovoriti, je, kako so entitete med seboj povezane. Pri tem moramo upoštevati **obe smeri odnosa** in razlikovati med **ednino in množino**. Tukaj je primer, ki vključuje avtomobile in lastnike avtomobilov:

1. En lastnik lahko ima več avtomobilov.
2. Avtomobil lahko pripada le enemu lastniku.

Med tema dvema subjektoma se kažejo**trije možni vzorci odnosov**:

<table>
  <thead>
    <tr>
      <th><strong>Odnos</strong></th>
      <th><strong>Entitete</strong></th>
      <th><strong>Z leve</strong></th>
      <th><strong>Z desne</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Razmerje 1:1</td>
      <td>Avto:smernik</td>
      <td>Avtomobil lahko ima le eno smerno svetilko.</td>
      <td>Smernik lahko pripada le enemu avtomobilu.</td>
    </tr>
    <tr>
      <td>Razmerje 1:n</td>
      <td>Lastnik:avtomobil</td>
      <td>Lastnik lahko ima več avtomobilov.</td>
      <td>Avtomobil lahko pripada le enemu lastniku.</td>
    </tr>
    <tr>
      <td>Razmerje m:n</td>
      <td>Avtomobil:ulica</td>
      <td>Avtomobil lahko vozi po več cestah.</td>
      <td>Po eni cesti lahko vozi več avtomobilov.</td>
    </tr>
  </tbody>
</table>

### Vpeljava izdelkov

Najprej bomo vzpostavili tabelo »products«. Za to moramo opredeliti shemo, vnesti podatkovne zapise in za namene testiranja izvesti nekaj preprostih poizvedb.

#### Opredeli shemo

Osnovni SQL-ukaz za opredeljevanje tabel v bazi podatkov je CREATE TABLE. Ta ukaz omogoča **ustvarjanje tabele z imenom in določanje lastnosti stolpcev**. Hkrati se opredelijo podatkovni tipi in, če je potrebno, omejitve za vrednosti, ki se shranijo:

```sql
DROP TABLE IF EXISTS Products;
CREATE TABLE Products ( product_id int, product_name text, stocked int, price int );
```

Note Pred opredelitvijo tabele uporabimo ukaz DROP TABLE IF EXISTS. S tem se odstrani morebitna obstoječa tabela, kar omogoča večkratno izvajanje istega SQL-koda brez pojava napak.

#### Dodaj zbirke podatkov

Sedaj bomo ustvarili nekaj **testnih zapisov**. Za izpolnitev polj bomo uporabili SQL-ukaz INSERT INTO ter funkcijo VALUES:

```sql
INSERT INTO Products VALUES (10, 'ABC Product', 74, 1050);
INSERT INTO Products VALUES (20, 'KLM Product', 23, 750);
INSERT INTO Products VALUES (30, 'XYZ Product', 104, 350);
```

#### Opredelite poizvedbe

Da **bi preverili stanje tabele »Products«**, bomo napisali preprosto poizvedbo. Uporabimo ukaz SELECT FROM in izpišemo celotno tabelo:

```sql
SELECT * FROM Products;
```

Sedaj bomo napisali nekoliko bolj zapleteno poizvedbo, ki izračuna **skupno vrednost izdelkov, ki jih imamo na zalogi**:

```sql
SELECT product_name AS 'Name', (stocked * price) AS 'Value' FROM Products;
```

### Dodajte dodatne tabele

Nato bomo **ustvarili preostale tabele, ki jih potrebujemo**. Uporabili bomo enake korake kot pri tabeli »Products«. Najprej ustvarimo tabelo »Customers«:

```sql
DROP TABLE IF EXISTS Customers;
CREATE TABLE Customers ( customer_id int, customer_name text, contact text );
```

Nato vnesemo podatke za dva vzorčna stranka:

```sql
INSERT INTO Customers VALUES (100, 'EDC Customer', 'ED@example.com');
INSERT INTO Customers VALUES (200, 'WVU Customer', 'WV@example.com');
```

Da bi preverili, ali je delovalo, bomo izpisali tabelo strank:

```sql
SELECT * FROM Customers;
```

Naslednji korak je ustvarjanje tabele »Naročila«:

```sql
DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders ( order_id int, customer_id int, order_date text );
```

Sedaj bomo **vnesli tri vzorčna naročila**. Prvi vrednosti v zapisih bomo dodelili ID kot primarni ključ. Druga vrednost je namenjena ID-jem obstoječih strank, ki delujejo kot tuji ključi. Nato shranimo datum naročila:

```sql
INSERT INTO Orders VALUES (1000, 100, '2022-05-03');
INSERT INTO Orders VALUES (1001, 100, '2022-05-04');
INSERT INTO Orders VALUES (1002, 200, '2022-05-08');
```

Da bi to preizkusili, bomo izdali naslednja ukaza:

```sql
SELECT * FROM Orders;
```

Nazadnje potrebujemo tabelo za **izdelke v naročilu skupaj z njihovimi količinami**. Gre za razmerje m:n, saj lahko naročilo vsebuje več izdelkov, en izdelek pa se lahko pojavi v več naročilih. Opredelili bomo tabelo, ki vsebuje ID-je naročil in izdelkov kot tuje ključe:

```sql
DROP TABLE IF EXISTS OrderItems;
CREATE TABLE OrderItems ( orderitem_id int, order_id int, product_id int, count int );
```

Sedaj bomo vnesli nekaj izdelkov, ki so bili naročeni. Izberemo identifikacijske številke naročil in izdelkov tako, da bo eno naročilo vsebovalo dva izdelka, drugo pa le enega:

```sql
INSERT INTO OrderItems VALUES (10001, 1000, 10, 3);
INSERT INTO OrderItems VALUES (10002, 1000, 20, 2);
INSERT INTO OrderItems VALUES (10003, 1002, 30, 12);
```

Da bi to preverili, bomo izdali naročene izdelke:

```sql
SELECT * FROM OrderItems;
```

### Pisati zapletena poizvedovanja

Če ste izvedli vse doslej prikazane odlomke kode, bi morali razumeti strukturo naše testne zbirke podatkov. Sedaj se lotimo bolj zapletenih poizvedb, ki prikazujejo moč jezika SQL. Najprej **napišimo poizvedbo, ki združi podatke, razporejene po več tabelah**. Uporabili bomo ukaz SQL JOIN, da združimo tabele, ki vsebujejo podatke o strankah in naročilih. Pri tem bomo poimenovali stolpce in kot pogoj JOIN nastavili ujemajočo se ID stranke. Upoštevajte, da uporabljamo kvalificirane identifikatorje za razlikovanje med stolpci obeh tabel:

```sql
SELECT customers.customer_name as 'Customer', customers.customer_id, orders.order_id, orders.order_date AS 'Date' FROM Customers JOIN Orders ON Orders.customer_id = Customers.customer_id ORDER BY Customers.customer_id;
```

Sedaj bomo z uporabo še enega ukaza JOIN izračunali **skupne stroške naročenih izdelkov**:

```sql
SELECT OrderItems.order_id, OrderItems.orderitem_id AS 'Order Item', Products.product_name AS 'Product', Products.price AS 'Unit Price', OrderItems.count AS 'Count', (OrderItems.count * Products.price) AS 'Total' FROM OrderItems JOIN Products ON OrderItems.product_id = Products.product_id;
```

Tip Želite izvedeti več o [tem, kaj je SQL](https://www.ionos.com/sl-si/digitalguide/streznik/nastavitve/uvod-v-sql-s-primeri/), ali potrebujete pomoč pri reševanju težave, povezane s tem jezikom za upravljanje podatkovnih baz? Ali pa morda preprosto želite razširiti svoje znanje o SQL. Kakorkoli že, v našem digitalnem vodniku najdete številne članke o SQL in MySQL:

- Vodnik po MySQL
- MariaDB proti MySQL
- Kako namestiti in uporabljati MariaDB/MySQL
- Povezava z bazo podatkov MySQL/MariaDB s PHP na strežniku v oblaku, ki deluje na sistemu Linux
- Rešitev napake »Preveč povezav« v MySQL/MariaDB
- Kako ponastaviti geslo root za MySQL/MariaDB


This is a markdown version of: [https://www.ionos.com/sl-si/digitalguide/streznik/nastavitve/uvod-v-sql-s-primeri/](https://www.ionos.com/sl-si/digitalguide/streznik/nastavitve/uvod-v-sql-s-primeri/) for AI/LLM consumption.