# Õpi SQL-i – õpetus koos koodinäidetega

SQL-i süntaks põhineb **relatsioonilisel algebraal**, mis eristab seda programmeerimiskeelt teistest keeltest. Süntaksiga tutvumine praktiliste näidete abil aitab sul SQL-i tõhusalt omandada.

## Mis on SQL-süntaks?

Programmeerimises tähendab süntaks seda, **kuidas programmeerimiskeelt kirjutatakse**. Süntaks määrab kindlaks koodi põhielemendid ja nende omavahelise ühendamise viisi. Süntaksi mõistmine on programmeerimiskeelte koodi lugemise ja kirjutamise põhitingimus.

SQL-i kõige olulisemad süntaksielemendid on **SQL-käskud, mis võivad sisaldada ka klausleid**. Mõlemat nimetatakse tavaliselt „SQL-käskudeks“, kuigi tehnilisest seisukohast ei ole see päris täpne. Need ei ole aga ainsad SQL-i süntaksielemendid. Allpool on tabel, mis annab ülevaate SQL-i süntaksielementidest.

<table>
  <thead>
    <tr>
      <th><strong>SQL-termin</strong></th>
      <th><strong>Selgitus</strong></th>
      <th><strong>Näide</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Lause</td>
      <td>Käsib DBMS-il teostada tegevust; lõpeb semikooloniga</td>
      <td>`CREATE TABLE People;`</td>
    </tr>
    <tr>
      <td>Klausel</td>
      <td>Muudab käsku; võib esineda ainult käskude sees</td>
      <td>`WHERE, HAVING`</td>
    </tr>
    <tr>
      <td>Väljend</td>
      <td>Annab väärtuse, kui seda hinnatakse</td>
      <td>`6 * 7`</td>
    </tr>
    <tr>
      <td>Identifikaator</td>
      <td>Andmebaasi objekti, muutuja või protseduuri nimi; võib olla kvalifitseeritud või kvalifitseerimata</td>
      <td>`dbname.tablename / tablename`</td>
    </tr>
    <tr>
      <td>Predikaat</td>
      <td>Väljend, mille tulemuseks on `TRUE, FALSE` või `UNKNOWN`</td>
      <td>`Age < 42`</td>
    </tr>
    <tr>
      <td>Päring</td>
      <td>Eriline käsk; tagastab leitud andmete kogumi</td>
      <td>`SELECT Name FROM People WHERE Age < 42;`</td>
    </tr>
    <tr>
      <td>Funktsioon</td>
      <td>Töötleb ühte või mitut väärtust; loob tavaliselt uue väärtuse</td>
      <td>`UPPER('text') -- returns 'TEXT'`</td>
    </tr>
    <tr>
      <td>Kommentaar</td>
      <td>Kasutatakse SQL-koodi kommenteerimiseks; RDBMS ignoreerib seda</td>
      <td>`-- Comment up to end of line / /*multiline comment if necessary*/`</td>
    </tr>
  </tbody>
</table>

Note SQL-käskudele nagu SELECT ja CREATE TABLE kirjutatakse tavaliselt suurtähed. SQL ei tee siiski vahet suurtähe ja väiketähe vahel. Käsude suurtähekasutus on lihtsalt laialt levinud tava.

## Kuidas SQL-koodi täidetakse?

SQL-kood on tekstifailides allikakoodina. Kood saab elu alles sobivas täitmiskeskkonnas. Allikakoodi loeb **SQL-tõlgendaja** ja teisendab selle relatsioonilise andmebaasi haldussüsteemi (RDBMS) toiminguteks. Siin on kaks põhilist lähenemisviisi:

**1. SQL-koodi interaktiivne käivitamine**Selle meetodi puhul sisestatakse või kopeeritakse SQL-kood otse tekstiaknasse. SQL-kood käivitatakse ja tulemus kuvatakse. Koodi saab muuta ja uuesti käivitada. Kiire koodi muutmine ja tulemuste kuvamine teeb selle meetodi kõige sobivamaks keerukate päringute õppimiseks ja loomiseks. **2. SQL-koodi käivitamine skriptina**Selle meetodi puhul käivitatakse kogu SQL-koodi sisaldav lähtekoodifail rida-realt. Vajaduse korral saadetakse kasutajale tagasiside alles käivitamise lõpus. See meetod sobib kõige paremini protsesside automatiseerimiseks ja MySQL-andmebaasi varukoopiate importimiseks MySQL dump’iga.

<table>
  <thead>
    <tr>
      <th><strong>Kasutajaliides</strong></th>
      <th><strong>Kirjeldus</strong></th>
      <th><strong>Näited</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Käsurealiides (CLI)</td>
      <td>Tekstipõhine liides; sisestatakse ja täidetakse SQL-kood, tulemus kuvatakse tekstina</td>
      <td>mysql, psql, mysqlsh</td>
    </tr>
    <tr>
      <td>Graafiline kasutajaliides (GUI)</td>
      <td>SQL-kood sisestatakse tekstiaknasse ja/või genereeritakse vastusena kasutaja tegevusele; SQL-kood täidetakse, tulemus kuvatakse tabelitena</td>
      <td>phpMyAdmin, MySQL Workbench, HeidiSQL</td>
    </tr>
    <tr>
      <td>Rakendusliides (API)</td>
      <td>Võimaldab otsest suhtlust RDBMS-iga; SQL-kood lisatakse ja täidetakse stringina programmeerimiskeele koodis; tulemused on kättesaadavad andmestruktuuridena edasiseks kasutamiseks</td>
      <td>PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API</td>
    </tr>
  </tbody>
</table>

## Kuidas luua tootehaldussüsteem SQL-i abil

Programmeerimiskeele õppimise lihtsaim viis on ise koodi kirjutada ja seda käivitada. Selles õpetuses **loome väikese andmebaasi ja teeme selle põhjal päringuid**. Selleks kasutame veebisaidil *sql.js* asuvat [veebipõhist SQL-tõlget](https://sql.js.org/examples/GUI/ "sql.js demo: Online SQL interpreter"). Õpetuse järgimiseks mine veebisaidile ja asenda sinna juba sisestatud SQL-kood meie näidete koodiga. Käivita kood tükkhaaval, et tulemused kuvataks.

### SQL-andmebaasi seadistamine

Selles näites loome poe jaoks kaubandusliku **tootehaldussüsteemi**. Nõuded on järgmised:

- Meil on mitmeid tooteid ja igast tootest on laos teatud kogus.
- Meie klientuur hõlmab paljusid kliente.
- Klientide esitatud tellimused võivad sisaldada mitut toodet.
- Iga tellimuse kohta salvestame tellimuse kuupäeva ja tellija andmed, samuti tellitud tooted ja kogused.

Need nõuded vormistatakse **abstraktseks kirjelduseks ja seejärel SQL-koodiks**:

1. Loo mudel
2. Määratle skeem
3. Sisesta andmeid
4. Määrake päringud

### Loo entiteetide ja seoste mudel

Esimene etapp toimub paberil või spetsiaalsete modelleerimistööriistade abil. Kogume **modelleeritava** süsteemi kohta teavet, **et tuletada välja entiteedid ja suhted**. See etapp viiakse sageli ellu entiteedi-suhe (ER) diagrammina.

Millised entiteedid on olemas ja kuidas need omavahel seotud on? **Entiteedid on asjade klassid**. Meie tootehaldussüsteemi näites on entiteetideks tooted, kliendid ja tellimused. Iga entiteedi jaoks on vaja eraldi tabelit. Relatsioonimudeli eripärast tulenevalt lisatakse suhete modelleerimiseks täiendavaid tabeleid. Selle mõistmine ja nõuetekohane rakendamine nõuab kogemust.

Peamine küsimus, millele tuleb vastata, on see, kuidas objektid omavahel seotud on. Siin tuleb arvesse võtta **suhte mõlemat suunda** ning teha vahet **ainsuse ja mitmuse** vahel. Siin on näide, kus kasutatakse autosid ja autoomanikke:

1. Ühel omanikul võib olla mitu autot.
2. Auto võib kuuluda ainult ühele omanikule.

Nende kahe üksuse vahel ilmnevad**kolm võimalikku suhete mudelit**:

<table>
  <thead>
    <tr>
      <th><strong>Suhted</strong></th>
      <th><strong>Entiteedid</strong></th>
      <th><strong>Vasakult</strong></th>
      <th><strong>Paremalt</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1:1 suhe</td>
      <td>Auto:suunatulelatern</td>
      <td>Autol võib olla ainult üks suunatulelaterna.</td>
      <td>Suunatulelamp võib kuuluda ainult ühe auto juurde.</td>
    </tr>
    <tr>
      <td>1:n suhe</td>
      <td>Omanik:auto</td>
      <td>Omanikul võib olla mitu autot.</td>
      <td>Auto võib kuuluda ainult ühele omanikule.</td>
    </tr>
    <tr>
      <td>m:n suhe</td>
      <td>Auto:tänav</td>
      <td>Auto võib sõita mitmel teel.</td>
      <td>Ühel teel võib sõita mitu autot.</td>
    </tr>
  </tbody>
</table>

### Tooted kasutusele võtta

Esmalt loome toodete tabeli. Selleks peame määratlema skeemi, sisestama andmeid ja katsetamise eesmärgil tegema mõned lihtsad päringud.

#### Määra skeem

Andmebaasi tabelite määratlemise peamine SQL-käsk on CREATE TABLE. Selle käsu abil saab **luua tabeli, määrata sellele nime ja määratleda veergude omadused**. Samal ajal määratletakse andmetüübid ja vajaduse korral ka salvestatavate väärtuste piirangud:

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

Note Enne tabeli määratlemist kasutame käsku DROP TABLE IF EXISTS. See eemaldab kõik olemasolevad tabelid ja võimaldab sama SQL-koodi mitu korda täita, ilma et see põhjustaks veateateid.

#### Lisa andmekogumid

Nüüd loome mõned **testkirjed**. Kasutame väljade täitmiseks SQL-käsku INSERT INTO ning funktsiooni 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);
```

#### Määratle päringud

**Tabel „Products“ seisundi kontrollimiseks** kirjutame lihtsa päringu. Kasutame käsku SELECT FROM ja kuvame kogu tabeli:

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

Nüüd kirjutame veidi keerulisema päringu, mis arvutab **laos olevate toodete koguväärtuse**:

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

### Lisada täiendavad tabelid

Järgmiseks **loome ülejäänud vajalikud tabelid**. Jälgime samu samme, mida kasutasime tabeli „Products“ puhul. Esmalt loome tabeli „Customers“:

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

Seejärel sisestame kahe näidiskliendi andmed:

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

Et kontrollida, kas see töötas, kuvame klienditabeli:

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

Järgmine samm on luua tabel „Tellimused“:

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

Nüüd **sisestame kolm näidisostutellimust**. Esimesele väärtusele määrame ID-numbri kui põhivõtme. Teine väärtus on olemasolevate klientide ID-numbrid, mis toimivad võõrvõtmetena. Seejärel salvestame tellimuse kuupäeva:

```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');
```

Selle katsetamiseks anname järgmised käsud:

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

Lõpuks vajame tabelit, mis sisaldab **tellimuses olevaid tooteid koos nende kogustega**. Tegemist on m:n-suhtes, sest üks tellimus võib sisaldada mitut toodet ja üks toode võib esineda mitmes tellimuses. Määratleme tabeli, mis sisaldab tellimuste ja toodete ID-sid võõrvõtmetena:

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

Nüüd sisestame mõned tellitud tooted. Valime tellimuste ja toodete ID-d nii, et üks tellimus sisaldaks kahte toodet ja teine ainult ühte toodet:

```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);
```

Selle kontrollimiseks väljastame tellitud tooted:

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

### Kirjuta keerukaid päringuid

Kui olete kõik seni näidatud koodilõigud läbi viinud, peaksite suutma aru saada meie testandmebaasi struktuurist. Nüüd läheme edasi keerulisemate päringute juurde, mis näitavad SQL-i võimsust. Esmalt **kirjutame päringu, mis ühendab mitmes tabelis paiknevad andmed**. Kasutame SQL-käsku JOIN, et ühendada tabelid, mis sisaldavad kliendiandmeid ja tellimusi. Selle käigus nimetame veerud ja seame JOIN-tingimuseks kliendi ID-de kokkulangevuse. Pange tähele, et kasutame kvalifitseeritud identifikaatoreid kahe tabeli veergude eristamiseks:

```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;
```

Nüüd kasutame veel ühte JOIN-käsku, et arvutada **tellitud toodete kogumaksumus**:

```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 Kas soovid rohkem teada saada, [mis on SQL](https://www.ionos.com/et-ee/digitalguide/server/seadistused/sql-i-sissejuhatus-naeidetega/), või vajad abi andmebaasikeelega seotud probleemi lahendamisel? Või ehk soovid lihtsalt oma SQL-alaseid teadmisi laiendada? Mis iganes põhjus ka poleks, leiad meie digitaalsest juhendist mitmeid artikleid SQL-i ja MySQL-i kohta:

- MySQLi õpetus
- MariaDB vs. MySQL
- Kuidas installida ja kasutada MariaDB/MySQL
- Ühendage end MySQL/MariaDB andmebaasiga PHP abil Linuxi operatsioonisüsteemiga pilveserveris
- MySQL/MariaDB vea „Too many connections” lahendamine
- Kuidas taastada MySQL/MariaDB juurkasutaja parool


This is a markdown version of: [https://www.ionos.com/et-ee/digitalguide/server/seadistused/sql-i-sissejuhatus-naeidetega/](https://www.ionos.com/et-ee/digitalguide/server/seadistused/sql-i-sissejuhatus-naeidetega/) for AI/LLM consumption.