Õ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.
| SQL-termin | Selgitus | Näide |
|---|---|---|
| Lause | Käsib DBMS-il teostada tegevust; lõpeb semikooloniga | CREATE TABLE People;
|
| Klausel | Muudab käsku; võib esineda ainult käskude sees | WHERE, HAVING
|
| Väljend | Annab väärtuse, kui seda hinnatakse | 6 * 7
|
| Identifikaator | Andmebaasi objekti, muutuja või protseduuri nimi; võib olla kvalifitseeritud või kvalifitseerimata | dbname.tablename / tablename
|
| Predikaat | Väljend, mille tulemuseks on TRUE, FALSE või UNKNOWN
|
Age < 42
|
| Päring | Eriline käsk; tagastab leitud andmete kogumi | SELECT Name FROM People WHERE Age < 42;
|
| Funktsioon | Töötleb ühte või mitut väärtust; loob tavaliselt uue väärtuse | UPPER('text') -- returns 'TEXT'
|
| Kommentaar | Kasutatakse SQL-koodi kommenteerimiseks; RDBMS ignoreerib seda | -- Comment up to end of line / /*multiline comment if necessary*/
|
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äivitamineSelle 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 skriptinaSelle 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.
| Kasutajaliides | Kirjeldus | Näited |
|---|---|---|
| Käsurealiides (CLI) | Tekstipõhine liides; sisestatakse ja täidetakse SQL-kood, tulemus kuvatakse tekstina | mysql, psql, mysqlsh |
| Graafiline kasutajaliides (GUI) | SQL-kood sisestatakse tekstiaknasse ja/või genereeritakse vastusena kasutaja tegevusele; SQL-kood täidetakse, tulemus kuvatakse tabelitena | phpMyAdmin, MySQL Workbench, HeidiSQL |
| Rakendusliides (API) | Võimaldab otsest suhtlust RDBMS-iga; SQL-kood lisatakse ja täidetakse stringina programmeerimiskeele koodis; tulemused on kättesaadavad andmestruktuuridena edasiseks kasutamiseks | PHP Data Objects (PDO), Connector/J (Java), Connector/Python, C API |
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. Õ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:
- Loo mudel
- Määratle skeem
- Sisesta andmeid
- 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:
- Ühel omanikul võib olla mitu autot.
- Auto võib kuuluda ainult ühele omanikule.
Nende kahe üksuse vahel ilmnevadkolm võimalikku suhete mudelit:
| Suhted | Entiteedid | Vasakult | Paremalt |
|---|---|---|---|
| 1:1 suhe | Auto:suunatulelatern | Autol võib olla ainult üks suunatulelaterna. | Suunatulelamp võib kuuluda ainult ühe auto juurde. |
| 1:n suhe | Omanik:auto | Omanikul võib olla mitu autot. | Auto võib kuuluda ainult ühele omanikule. |
| m:n suhe | Auto:tänav | Auto võib sõita mitmel teel. | Ühel teel võib sõita mitu autot. |
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:
DROP TABLE IF EXISTS Products;
CREATE TABLE Products ( product_id int, product_name text, stocked int, price int );sqlEnne 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:
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);sqlMääratle päringud
Tabel „Products“ seisundi kontrollimiseks kirjutame lihtsa päringu. Kasutame käsku SELECT FROM ja kuvame kogu tabeli:
SELECT * FROM Products;sqlNüüd kirjutame veidi keerulisema päringu, mis arvutab laos olevate toodete koguväärtuse:
SELECT product_name AS 'Name', (stocked * price) AS 'Value' FROM Products;sqlLisada täiendavad tabelid
Järgmiseks loome ülejäänud vajalikud tabelid. Jälgime samu samme, mida kasutasime tabeli „Products“ puhul. Esmalt loome tabeli „Customers“:
DROP TABLE IF EXISTS Customers;
CREATE TABLE Customers ( customer_id int, customer_name text, contact text );sqlSeejärel sisestame kahe näidiskliendi andmed:
INSERT INTO Customers VALUES (100, 'EDC Customer', 'ED@example.com');
INSERT INTO Customers VALUES (200, 'WVU Customer', 'WV@example.com');sqlEt kontrollida, kas see töötas, kuvame klienditabeli:
SELECT * FROM Customers;sqlJärgmine samm on luua tabel „Tellimused“:
DROP TABLE IF EXISTS Orders;
CREATE TABLE Orders ( order_id int, customer_id int, order_date text );sqlNüü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:
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');sqlSelle katsetamiseks anname järgmised käsud:
SELECT * FROM Orders;sqlLõ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:
DROP TABLE IF EXISTS OrderItems;
CREATE TABLE OrderItems ( orderitem_id int, order_id int, product_id int, count int );sqlNüüd sisestame mõned tellitud tooted. Valime tellimuste ja toodete ID-d nii, et üks tellimus sisaldaks kahte toodet ja teine ainult ühte toodet:
INSERT INTO OrderItems VALUES (10001, 1000, 10, 3);
INSERT INTO OrderItems VALUES (10002, 1000, 20, 2);
INSERT INTO OrderItems VALUES (10003, 1002, 30, 12);sqlSelle kontrollimiseks väljastame tellitud tooted:
SELECT * FROM OrderItems;sqlKirjuta 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:
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;sqlNüüd kasutame veel ühte JOIN-käsku, et arvutada tellitud toodete kogumaksumus:
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