# Iemācies SQL – apmācība ar programmēšanas piemēriem

SQL sintakse balstās uz **relatīvo algebru**, kas šo programmēšanas valodu atšķir no citām valodām. Iepazīstoties ar sintaksi, izmantojot praktiskus piemērus, jūs varat efektīvi apgūt SQL.

## Kas ir SQL sintakse?

Programmēšanā sintakse attiecas uz **to, kā tiek rakstīta programmēšanas valoda**. Sintakse nosaka koda pamatelementus un to savienošanas veidu. Sintakses izpratne ir pamatprasība, lai varētu lasīt un rakstīt kodu programmēšanas valodās.

Svarīgākās sintakses konstrukcijas SQL ir **SQL teikumi, kuros var būt arī klauzulas**. Abas šīs vienības parasti dēvē par „SQL komandām“, lai gan no tehniskā viedokļa tas nav pilnīgi precīzi. Tomēr tās nav vienīgās SQL sintakses konstrukcijas. Zemāk atrodas tabula, kas sniedz pārskatu par SQL sintakses konstrukcijām.

<table>
  <thead>
    <tr>
      <th><strong>SQL termins</strong></th>
      <th><strong>Paskaidrojums</strong></th>
      <th><strong>Piemērs</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Teikums</td>
      <td>Norāda DBMS veikt darbību; beidzas ar semikolu</td>
      <td>`CREATE TABLE People;`</td>
    </tr>
    <tr>
      <td>Klausula</td>
      <td>Modificē teikumu; var parādīties tikai teikumos</td>
      <td>`WHERE, HAVING`</td>
    </tr>
    <tr>
      <td>Izteiksme</td>
      <td>Atgriež vērtību, to izvērtējot</td>
      <td>`6 * 7`</td>
    </tr>
    <tr>
      <td>Identifikators</td>
      <td>Datu bāzes objekta, mainīgā vai procedūras nosaukums; var būt kvalificēts vai nekvalificēts</td>
      <td>`dbname.tablename / tablename`</td>
    </tr>
    <tr>
      <td>Predikāts</td>
      <td>Izteiksme, kuras vērtība ir `TRUE, FALSE` vai `UNKNOWN`</td>
      <td>`Age < 42`</td>
    </tr>
    <tr>
      <td>Vaicājums</td>
      <td>Īpaša instrukcija; atgriež atrasto ierakstu kopu</td>
      <td>`SELECT Name FROM People WHERE Age < 42;`</td>
    </tr>
    <tr>
      <td>Funkcija</td>
      <td>Apstrādā vienu vai vairākas vērtības; parasti izveido jaunu vērtību</td>
      <td>`UPPER('text') -- returns 'TEXT'`</td>
    </tr>
    <tr>
      <td>Komentārs</td>
      <td>Izmanto, lai komentētu SQL kodu; RDBMS to ignorē</td>
      <td>`-- Comment up to end of line / /*multiline comment if necessary*/`</td>
    </tr>
  </tbody>
</table>

Note SQL komandas, piemēram, SELECT un CREATE TABLE, parasti raksta ar lielajiem burtiem. Tomēr SQL neņem vērā lielos un mazos burtus. Komandu rakstīšana ar lielajiem burtiem ir vienkārši plaši izplatīta prakse.

## Kā tiek izpildīts SQL kods?

SQL kods pastāv kā avota kods teksta failos. Kods sāk darboties tikai piemērotā izpildes vidē. Avota kodu nolasa **SQL interpretators** un pārvērš RDBMS darbībās. Šajā gadījumā ir divas pamatpieejas:

**1. SQL koda interaktīva izpilde**Šajā pieejā SQL kods tiek ievadīts vai kopēts tieši teksta logā. SQL kods tiek izpildīts, un tiek parādīts rezultāts. Jūs varat pielāgot kodu un izpildīt to atkārtoti. Ātrā koda apstrāde un rezultātu parādīšana padara šo pieeju vispiemērotāko sarežģītu vaicājumu apguvei un izveidei. **2. SQL koda izpilde kā**skripts Šajā pieejā viss avota koda fails, kas satur SQL kodu, tiek izpildīts rindu pa rindai. Ja nepieciešams, atgriezeniskā saite tiek nosūtīta lietotājam tikai izpildes beigās. Šī pieeja ir vispiemērotākā procesu automatizēšanai un MySQL datubāzes dublējumu importēšanai ar MySQL dump.

<table>
  <thead>
    <tr>
      <th><strong>Saskarnes</strong></th>
      <th><strong>Apraksts</strong></th>
      <th><strong>Piemēri</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Komandrindas interfeiss (CLI)</td>
      <td>Teksta interfeiss; tiek ievadīts un izpildīts SQL kods, rezultāts tiek parādīts tekstā</td>
      <td>mysql, psql, mysqlsh</td>
    </tr>
    <tr>
      <td>Grafiskā lietotāja saskarne (GUI)</td>
      <td>SQL kods tiek ievadīts teksta logā un/vai ģenerēts atbildē uz lietotāja darbībām; SQL kods tiek izpildīts, rezultāts tiek parādīts tabulu veidā</td>
      <td>phpMyAdmin, MySQL Workbench, HeidiSQL</td>
    </tr>
    <tr>
      <td>Lietojumprogrammu programmēšanas interfeiss (API)</td>
      <td>Ļauj tieši sazināties ar RDBMS; SQL kods tiek iekļauts un izpildīts kā virkne programmēšanas valodas kodā; rezultāti ir pieejami kā datu struktūras turpmākai izmantošanai</td>
      <td>PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API</td>
    </tr>
  </tbody>
</table>

## Kā izveidot produktu pārvaldības sistēmu, izmantojot SQL

Vienkāršākais veids, kā apgūt programmēšanas valodu, ir pašam rakstīt un izpildīt kodu. Šajā apmācībā mēs **izveidosim nelielu datu bāzi un izpildīsim tajā vaicājumus**. Lai to izdarītu, izmantosim [tiešsaistes SQL interpretatoru](https://sql.js.org/examples/GUI/ "sql.js demo: Online SQL interpreter") no vietnes *sql.js*. Lai sekotu līdzi apmācībai, dodieties uz šo vietni un aizstājiet jau ievadīto SQL kodu ar kodu no mūsu piemēriem. Izpildiet kodu pa daļām, lai redzētu rezultātus.

### Izveidot SQL datubāzi

Šajā piemērā mēs izveidosim komerciālu **produktu pārvaldības sistēmu** veikalam. Šādas ir prasības:

- Mums ir vairāki produkti, un katra produkta krājumā ir noteikts daudzums.
- Mūsu klientu lokā ir daudz klientu un patērētāju.
- Klientu veiktajos pasūtījumos var būt vairāki produkti.
- Par katru pasūtījumu mēs uzglabājam pasūtījuma datumu un pasūtītāja datus, kā arī pasūtītos produktus un pasūtīto daudzumu.

Šīs prasības tiek pārvērstas **abstraktā aprakstā un pēc tam SQL kodā**:

1. Izveidot modeli
2. Definēt shēmu
3. Ievadiet datu ierakstus
4. Definēt vaicājumus

### Izveidot entītiju un attiecību modeli

Pirmais solis tiek veikts uz papīra vai ar speciālu modelēšanas rīku palīdzību. Mēs apkopojam informāciju par **modelējamo** sistēmu, **lai noteiktu objektus un to savstarpējās saiknes**. Šis solis bieži tiek attēlots kā objektu-saikņu (ER) diagramma.

Kādas ir entītijas un kā tās ir saistītas? **Entītijas ir objektu grupas**. Mūsu produktu pārvaldības sistēmas piemērā entītijas ir produkti, klienti un pasūtījumi. Katrai entītijai ir nepieciešama atsevišķa tabula. Relacionālā modeļa īpatnību dēļ tiek pievienotas papildu tabulas, lai modelētu savstarpējās saistības. Lai to saprastu un pareizi īstenotu, ir nepieciešama pieredze.

Galvenais jautājums, uz kuru jāatrod atbilde, ir tas, kā šīs vienības ir savstarpēji saistītas. Šeit mums jāņem vērā **abas attiecību virzienu puses** un jānošķir **vienskaitlis no daudzskaitļa**. Lūk, piemērs, kurā izmantotas automašīnas un to īpašnieki:

1. Vienam īpašniekam var piederēt vairākas automašīnas.
2. Automašīna var piederēt tikai vienam īpašniekam.

Starp abām vienībām izkristalizējas**trīs iespējamie attiecību modeļi**:

<table>
  <thead>
    <tr>
      <th><strong>Saistība</strong></th>
      <th><strong>Objekti</strong></th>
      <th><strong>No kreisās puses</strong></th>
      <th><strong>No labās puses</strong></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1:1 attiecība</td>
      <td>Auto:indikators</td>
      <td>Automašīnai var būt tikai viens indikators.</td>
      <td>Indikators var piederēt tikai vienai automašīnai.</td>
    </tr>
    <tr>
      <td>1:n attiecība</td>
      <td>Īpašnieks:automobilis</td>
      <td>Vienam īpašniekam var būt vairākas automašīnas.</td>
      <td>Automašīna var piederēt tikai vienam īpašniekam.</td>
    </tr>
    <tr>
      <td>m:n attiecība</td>
      <td>Automašīna:iela</td>
      <td>Automašīna var braukt pa vairākiem ceļiem.</td>
      <td>Vienā ceļā var braukt vairākas automašīnas.</td>
    </tr>
  </tbody>
</table>

### Ieviest produktus

Vispirms izveidosim produktu tabulu. Lai to izdarītu, mums jādefinē shēma, jāievada datu ieraksti un, lai pārbaudītu, jāizpilda daži vienkārši vaicājumi.

#### Definēt shēmu

Galvenā SQL komanda datu bāzes tabulu definēšanai ir CREATE TABLE. Šī komanda ļauj **izveidot tabulu ar nosaukumu un norādīt kolonnu īpašības**. Vienlaikus tiek definēti datu tipi un, ja nepieciešams, ierobežojumi attiecībā uz saglabājamiem vērtībām:

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

Note Pirms tabulas definēšanas mēs izmantojam komandu DROP TABLE IF EXISTS. Tas noņem jebkuru esošo tabulu un ļauj vienu un to pašu SQL kodu izpildīt vairākas reizes, neradot kļūdu ziņojumus.

#### Pievienot datu kopas

Tagad izveidosim dažus **testa ierakstus**. Lai aizpildītu laukus, izmantosim SQL komandu INSERT INTO, kā arī funkciju 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);
```

#### Definēt vaicājumus

Lai **pārbaudītu tabulas „Products“ stāvokli**, mēs izveidosim vienkāršu vaicājumu. Mēs izmantosim komandu SELECT FROM un izvadīsim visu tabulu:

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

Tagad mēs izveidosim nedaudz sarežģītāku vaicājumu, kas aprēķina **kopējo vērtību produktiem, kas mums ir noliktavā**:

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

### Ieviest papildu tabulas

Tālāk **izveidosim pārējās nepieciešamās tabulas**. Rīkosimies tāpat kā izveidojot tabulu „Products“. Vispirms izveidosim tabulu „Customers“:

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

Tad mēs ievadām datu ierakstus par diviem paraugklientiem:

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

Lai pārbaudītu, vai tas ir izdevies, mēs izvadīsim klientu tabulu:

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

Nākamais solis ir izveidot tabulu „Orders“:

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

Tagad **ievadīsim trīs parauga pirkuma pasūtījumus**. Ierakstu pirmajai vērtībai piešķirsim ID kā primāro atslēgu. Otrā vērtība ir esošo klientu ID, kas darbojas kā ārējās atslēgas. Tad saglabāsim pasūtījuma datumu:

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

Lai to pārbaudītu, mēs izpildīsim šādus rīkojumus:

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

Visbeidzot, mums ir nepieciešama tabula, kurā būtu uzskaitīti **pasūtījumā iekļautie produkti kopā ar to daudzumu**. Šī ir m:n attiecība, jo vienā pasūtījumā var būt vairāki produkti, un viens produkts var būt iekļauts vairākos pasūtījumos. Izveidosim tabulu, kurā pasūtījumu un produktu identifikatori tiks izmantoti kā ārējās atslēgas:

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

Tagad ievadīsim dažus pasūtītos produktus. Izvēlēsimies pasūtījumu un produktu identifikatorus tā, lai būtu viens pasūtījums ar diviem produktiem un vēl viens pasūtījums ar vienu produktu:

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

Lai to pārbaudītu, mēs izsniegsim pasūtītos produktus:

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

### Veidot sarežģītus vaicājumus

Ja esat izpildījuši visus līdz šim parādītos koda fragmentus, jums vajadzētu saprast mūsu testa datu bāzes struktūru. Tagad pievērsīsimies sarežģītākiem vaicājumiem, kas parāda SQL iespējas. Vispirms **izveidosim vaicājumu, kas apvieno datus, kuri ir izkliedēti pa vairākām tabulām**. Mēs izmantosim SQL JOIN komandu, lai apvienotu tabulas, kurās ir klientu dati un pasūtījumi. To darot, mēs nosauksim kolonnas un kā JOIN nosacījumu iestatīsim atbilstošu klienta ID. Ņemiet vērā, ka mēs izmantojam kvalificētus identifikatorus, lai atšķirtu abu tabulu kolonnas:

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

Tagad izmantosim vēl vienu JOIN komandu, lai aprēķinātu **pasūtīto preču kopējās izmaksas**:

```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 Vēlaties uzzināt vairāk par [to, kas ir SQL](https://www.ionos.com/lv-lv/digitalguide/serveris/konfiguracija/sql-ievads-ar-piemeriem/), vai arī nepieciešama palīdzība datubāzes valodas problēmas risināšanā? Vai varbūt vienkārši vēlaties paplašināt savas zināšanas par SQL? Kāds arī būtu iemesls, mūsu digitālajā ceļvedī atradīsiet virkni rakstu par SQL un MySQL:

- MySQL apmācība
- MariaDB salīdzinājumā ar MySQL
- Kā instalēt un lietot MariaDB/MySQL
- Savienojieties ar MySQL/MariaDB datu bāzi, izmantojot PHP, uz mākoņservera, kurā darbojas Linux
- Kā atrisināt MySQL/MariaDB kļūdu „Pārāk daudz savienojumu”
- Kā atiestatīt MySQL/MariaDB root paroli


This is a markdown version of: [https://www.ionos.com/lv-lv/digitalguide/serveris/konfiguracija/sql-ievads-ar-piemeriem/](https://www.ionos.com/lv-lv/digitalguide/serveris/konfiguracija/sql-ievads-ar-piemeriem/) for AI/LLM consumption.