Sintaksa jezika SQL temelji na re­la­cij­ski algebri, zaradi česar se ta pro­gram­ski jezik razlikuje od drugih jezikov. Se­zna­nja­nje s sintakso prek prak­tič­nih primerov vam lahko pomaga pri učin­ko­vi­tem učenju jezika SQL.

Kaj je sintaksa jezika SQL?

V pro­gra­mi­ra­nju se izraz »sintaksa« nanaša na način za­pi­so­va­nja pro­gram­ske­ga jezika. Sintaksa določa osnovne kon­struk­te kode in način njihovega po­ve­zo­va­nja. Ra­zu­me­va­nje sintakse je temeljna pred­po­stav­ka za branje in pisanje kode v pro­gram­skih jezikih.

Naj­po­memb­nej­ši sin­tak­tič­ni elementi v jeziku SQL so SQL-izjave, ki lahko vsebujejo tudi klavzule. Oboje se pogosto imenuje »SQL-ukazi«, čeprav to s teh­nič­ne­ga vidika ni povsem točno. To pa niso edini sin­tak­tič­ni elementi v jeziku SQL. V spodnji tabeli najdete pregled sin­tak­tič­nih elementov jezika SQL.

Izraz v jeziku SQL Razlaga Primer
Izjava Naroči DBMS, naj izvede dejanje; konča se s podpičjem CREATE TABLE People;
Klavzula Spreminja izjavo; se lahko pojavi le znotraj izjav WHERE, HAVING
Izraz Pri izračunu vrne vrednost 6 * 7
Iden­ti­fi­ka­tor Ime objekta v bazi podatkov, spre­men­ljiv­ke ali postopka; lahko je kva­li­fi­ci­ra­no ali ne­kva­li­fi­ci­ra­no dbname.tablename / tablename
Predikat Izraz, katerega vrednost je TRUE, FALSE ali UNKNOWN Age < 42
Poizvedba Posebna izjava; vrne najden niz zapisov SELECT Name FROM People WHERE Age < 42;
Funkcija Obdeluje eno ali več vrednosti; običajno ustvari novo vrednost UPPER('text') -- returns 'TEXT'
Komentar Uporablja se za ko­men­tar­je v kodi SQL; RDBMS ga ignorira -- Comment up to end of line / /*multiline comment if necessary*/
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 kon­ven­ci­ja.

Kako se izvaja koda SQL?

SQL-koda obstaja kot izvorna koda v be­se­dil­nih datotekah. Koda zaživi šele v ustreznem iz­ved­be­nem okolju. Izvorno kodo prebere SQL-in­ter­pre­ter in jo pretvori v ukaze za sistem za upra­vlja­nje re­la­cij­skih baz podatkov (RDBMS). Pri tem obstajata dva osnovna pristopa:

1. In­te­rak­tiv­no izvajanje kode SQLPri tem pristopu se kodaSQLvnese ali kopira ne­po­sre­dno v besedilno okno. Koda SQL se izvede, rezultat pa se prikaže. Kodo lahko pri­la­go­di­te in jo ponovno izvedete. Hitra zaporedja spre­mi­nja­nja kode in pri­ka­zo­va­nja re­zul­ta­tov pomenijo, da je ta pristop najbolj primeren za učenje in ustvar­ja­nje za­ple­te­nih poizvedb. 2. Izvedba SQL kode kotskripta Pri tem pristopu se celotna datoteka izvorne kode, ki vsebuje SQL kodo, izvede vrstico po vrstico. Po potrebi se povratne in­for­ma­ci­je upo­rab­ni­ku pošljejo šele ob koncu izvedbe. Ta pristop je najbolj primeren za av­to­ma­ti­za­ci­jo procesov in za uvoz var­no­stnih kopij baze podatkov MySQL z MySQL dump.

Vmesnik Opis Primeri
Vmesnik ukazne vrstice (CLI) Besedilni vmesnik; vnese in izvede se koda SQL, rezultat se prikaže v besedilni obliki mysql, psql, mysqlsh
Grafični upo­rab­ni­ški vmesnik (GUI) SQL koda se vnese v besedilno okno in/ali se generira kot odziv na in­te­rak­ci­jo upo­rab­ni­ka; SQL koda se izvede, rezultat se prikaže v obliki tabel phpMyAd­min, MySQL Workbench, HeidiSQL
Vmesnik za pro­gra­mi­ra­nje aplikacij (API) Omogoča ne­po­sre­dno ko­mu­ni­ka­ci­jo z RDBMS; koda SQL je vključena in izvedena kot niz v kodi pro­gram­ske­ga jezika; rezultati so na voljo kot po­dat­kov­ne strukture za nadaljnjo uporabo PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API

Kako vzpo­sta­vi­ti sistem za upra­vlja­nje izdelkov z uporabo jezika SQL

Najlažji način za učenje pro­gram­ske­ga 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-in­ter­pre­ter s spletne strani sql.js. Če želite slediti vodiču, obiščite spletno stran in na­do­me­sti­te ž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 upra­vlja­nje 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 shra­nju­je­mo datum naročila in podatke o osebi, ki je oddala naročilo, ter o naročenih izdelkih in količini.

Te zahteve se pre­tvo­ri­jo v ab­strak­ten opis in nato v kodo SQL:

  1. Ustvari model
  2. Opre­de­li­te shemo
  3. Vnesite zapise podatkov
  4. Opre­de­li­te poizvedbe

Ustvarite model entitet in odnosov

Prvi korak poteka na papirju ali s posebnimi orodji za mo­de­li­ra­nje. Zberemo podatke o sistemu, ki ga želimo mo­de­li­ra­ti, da bi izpeljali entitete in relacije. Ta korak se pogosto izvede v obliki diagramov entitetno-re­la­cij­skih modelov (ER).

Katere entitete obstajajo in kako so med seboj povezane? Entitete so razredi stvari. V našem primeru sistema za upra­vlja­nje izdelkov so entitete izdelki, stranke in naročila. Za vsako entiteto je potrebna tabela. Zaradi po­seb­no­sti re­la­cij­ske­ga modela se za mo­de­li­ra­nje odnosov dodajo dodatne tabele. Za ra­zu­me­va­nje tega in pravilno izvedbo je potrebna izkušnja.

Osrednje vprašanje, na katerega je treba od­go­vo­ri­ti, je, kako so entitete med seboj povezane. Pri tem moramo upo­šte­va­ti obe smeri odnosa in raz­li­ko­va­ti med ednino in množino. Tukaj je primer, ki vključuje av­to­mo­bi­le in lastnike av­to­mo­bi­lov:

  1. En lastnik lahko ima več av­to­mo­bi­lov.
  2. Avtomobil lahko pripada le enemu lastniku.

Med tema dvema su­bjek­to­ma se kažejotrije možni vzorci odnosov:

Odnos Entitete Z leve Z desne
Razmerje 1:1 Avto:smernik Avtomobil lahko ima le eno smerno svetilko. Smernik lahko pripada le enemu av­to­mo­bi­lu.
Razmerje 1:n Lastnik:avtomobil Lastnik lahko ima več av­to­mo­bi­lov. Avtomobil lahko pripada le enemu lastniku.
Razmerje m:n Avtomobil:ulica Avtomobil lahko vozi po več cestah. Po eni cesti lahko vozi več av­to­mo­bi­lov.

Vpeljava izdelkov

Najprej bomo vzpo­sta­vi­li tabelo »products«. Za to moramo opre­de­li­ti shemo, vnesti po­dat­kov­ne zapise in za namene te­sti­ra­nja izvesti nekaj pre­pro­stih poizvedb.

Opredeli shemo

Osnovni SQL-ukaz za opre­de­lje­va­nje tabel v bazi podatkov je CREATE TABLE. Ta ukaz omogoča ustvar­ja­nje tabele z imenom in določanje lastnosti stolpcev. Hkrati se opre­de­li­jo po­dat­kov­ni tipi in, če je potrebno, omejitve za vrednosti, ki se shranijo:

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

Pred opre­de­li­tvi­jo 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 iz­pol­ni­tev polj bomo uporabili SQL-ukaz INSERT INTO ter funkcijo VALUES:

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

Opre­de­li­te poizvedbe

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

SELECT * FROM Products;
sql

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

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

Dodajte dodatne tabele

Nato bomo ustvarili preostale tabele, ki jih po­tre­bu­je­mo. Uporabili bomo enake korake kot pri tabeli »Products«. Najprej ustvarimo tabelo »Customers«:

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

Nato vnesemo podatke za dva vzorčna stranka:

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

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

SELECT * FROM Customers;
sql

Naslednji korak je ustvar­ja­nje tabele »Naročila«:

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

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

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

Da bi to pre­iz­ku­si­li, bomo izdali naslednja ukaza:

SELECT * FROM Orders;
sql

Nazadnje po­tre­bu­je­mo tabelo za izdelke v naročilu skupaj z njihovimi ko­li­či­na­mi. Gre za razmerje m:n, saj lahko naročilo vsebuje več izdelkov, en izdelek pa se lahko pojavi v več naročilih. Opre­de­li­li bomo tabelo, ki vsebuje ID-je naročil in izdelkov kot tuje ključe:

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

Sedaj bomo vnesli nekaj izdelkov, ki so bili naročeni. Izberemo iden­ti­fi­ka­cij­ske številke naročil in izdelkov tako, da bo eno naročilo vsebovalo dva izdelka, drugo pa le enega:

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

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

SELECT * FROM OrderItems;
sql

Pisati zapletena po­i­zve­do­va­nja

Če ste izvedli vse doslej prikazane odlomke kode, bi morali razumeti strukturo naše testne zbirke podatkov. Sedaj se lotimo bolj za­ple­te­nih poizvedb, ki pri­ka­zu­je­jo moč jezika SQL. Najprej napišimo poizvedbo, ki združi podatke, raz­po­re­je­ne po več tabelah. Uporabili bomo ukaz SQL JOIN, da združimo tabele, ki vsebujejo podatke o strankah in naročilih. Pri tem bomo po­i­me­no­va­li stolpce in kot pogoj JOIN nastavili ujemajočo se ID stranke. Upo­šte­vaj­te, da upo­ra­blja­mo kva­li­fi­ci­ra­ne iden­ti­fi­ka­tor­je za raz­li­ko­va­nje med stolpci obeh tabel:

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

Sedaj bomo z uporabo še enega ukaza JOIN iz­ra­ču­na­li skupne stroške naročenih izdelkov:

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;
sql
Go to Main Menu