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.
| 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
|
| Identifikator | Ime objekta v bazi podatkov, spremenljivke ali postopka; lahko je kvalificirano ali nekvalificirano | 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 komentarje v kodi SQL; RDBMS ga ignorira | -- Comment up to end of line / /*multiline comment if necessary*/
|
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 SQLPri tem pristopu se kodaSQLvnese 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 kotskripta 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.
| 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 uporabniški vmesnik (GUI) | 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 | phpMyAdmin, MySQL Workbench, HeidiSQL |
| Vmesnik za programiranje aplikacij (API) | 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 | PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API |
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 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:
- Ustvari model
- Opredelite shemo
- Vnesite zapise podatkov
- 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:
- En lastnik lahko ima več avtomobilov.
- Avtomobil lahko pripada le enemu lastniku.
Med tema dvema subjektoma 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 avtomobilu. |
| Razmerje 1:n | Lastnik:avtomobil | Lastnik lahko ima več avtomobilov. | Avtomobil lahko pripada le enemu lastniku. |
| Razmerje m:n | Avtomobil:ulica | Avtomobil lahko vozi po več cestah. | Po eni cesti lahko vozi več avtomobilov. |
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:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products ( product_id int, product_name text, stocked int, price int );sqlPred 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:
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);sqlOpredelite poizvedbe
Da bi preverili stanje tabele »Products«, bomo napisali preprosto poizvedbo. Uporabimo ukaz SELECT FROM in izpišemo celotno tabelo:
SELECT * FROM Products;sqlSedaj 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;sqlDodajte dodatne tabele
Nato bomo ustvarili preostale tabele, ki jih potrebujemo. 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 );sqlNato 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');sqlDa bi preverili, ali je delovalo, bomo izpisali tabelo strank:
SELECT * FROM Customers;sqlNaslednji korak je ustvarjanje tabele »Naročila«:
DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders ( order_id int, customer_id int, order_date text );sqlSedaj 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:
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');sqlDa bi to preizkusili, bomo izdali naslednja ukaza:
SELECT * FROM Orders;sqlNazadnje 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:
DROP TABLE IF EXISTS OrderItems;
CREATE TABLE OrderItems ( orderitem_id int, order_id int, product_id int, count int );sqlSedaj 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:
INSERT INTO OrderItems VALUES (10001, 1000, 10, 3);
INSERT INTO OrderItems VALUES (10002, 1000, 20, 2);
INSERT INTO OrderItems VALUES (10003, 1002, 30, 12);sqlDa bi to preverili, bomo izdali naročene izdelke:
SELECT * FROM OrderItems;sqlPisati 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:
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;sqlSedaj bomo z uporabo še enega ukaza JOIN izračunali 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