13 Lihtsad päringud
Peatselt hakkame uurima ja jooksutama oma esimesi päringuid. Definitsiooni kohaselt on päring informatsiooni leidmise korraldus. Kujult sarnanevad need muude juba õpitud SQL-i lausetega.
Enne seda lisame aga näidisandmebaasi tabelitesse veidi rohkem andmeid. Selleks avame taaskord konsooli, mille abil jooksutasime eelmises peatükis näiteks tabelite loomise lauseid.
Tuleta vajadusel eelmise peatüki abil meelde, kuidas konsooli avamine ja lausete jooksutamine käis.
Jooksuta nüüd järgnevaid lauseid, et täita tabelit Kursused andmetega:
INSERT INTO kursused (nimi, maht_tundides)
VALUES ('Programmeerimine', 10);
INSERT INTO kursused (nimi, maht_tundides)
VALUES ('Tarkvaraarendus', 30);
INSERT INTO kursused (nimi, maht_tundides)
VALUES ('Programmeerimine II', 10);
INSERT INTO kursused (id, nimi, maht_tundides)
VALUES (3, 'Primaarvõtmete meeldetuletus', 5);
Kas lausete jooksutamise käigus esines vigasid? Kui jah, siis proovi lause ja Statistics vaates esitatud veateate põhjal mõista, mis läks valesti. Paranda seejärel vigane lause ning jooksuta parandatud versiooni uuesti.
Seejärel jooksuta järgnevaid lauseid, et täita ka tabelit Oppimine andmetega:
INSERT INTO oppimine (opilase_id, kursuse_id)
VALUES (1, 1);
INSERT INTO oppimine (opilase_id, kursuse_id)
VALUES (1, 2);
INSERT INTO oppimine (opilase_id, kursuse_id)
VALUES (1, 3);
INSERT INTO oppimine (opilase_id, kursuse_id)
VALUES (2, 3);
Kontrolli siinkohal tabeleid Kursused ja Oppimine ning vaata üle, kas andmeid said edukalt sisestatud.
Nüüd jooksutamegi oma esimese päringu. Päringute jooksutamine käib täpselt samamoodi nagu muude SQL-i lausete jooksutamine, mida me siiani teinud oleme.
Esimene päringulause on järgmine:
SELECT * FROM kursused;
Pärast päringu edukat jooksutamist peaks DBeaveri vaade välja nägema sarnane. Pane tähele, et konsooli vaate (pealkirjaga <postgres> Console) all on näha kõiki andmeridu, mis vastavad jooksutatud päringule. Teisisõnu on seal näha päringu tulemust.
Kui soovid meelde tuletada mõisteid nagu olemi eksemplar ja tunnus, vaata üle vastav peatükk eelmisest moodulist.
Jooksutame nüüd uut, teistsugust päringut:
SELECT nimi FROM kursused;
Pärast päringu jooksutamist näeme päringu tulemuses, et iga andmerea kohta on näha vaid veeru nimi
väärtus ning et veerge id
ja maht_tundides
enam ei kuvata.
Seega näeme, et märksõnade SELECT
ja FROM
vahel saame täpsustada nende tunnuste nimesid, mida soovime pärida. Kui soovime pärida mitut tunnust, eraldame need omavahel komadega.
Näiteks, kui soovime näha õpilaste tunnuseid eesnimi
ja perekonnanimi
, kuid mitte tunnust id
, siis saame seda teha jooksutades järgnevat päringut:
SELECT eesnimi, perekonnanimi FROM õpilased;
Katseta kõiki siiani õpitud päringutüüpe ka teiste tabelite peal ning mõtiskle, mida nende päringute tulemustest välja lugeda saab.
Õpime nüüd veel ühe uue pärimise viisi ära. Jooksutame selleks kõigepealt järgnevat päringut:
SELECT opilase_id FROM õppimine;
Päringu tulemusest saame välja lugeda seda, mitmel kursusel iga õpilane õpib. Seda selle järgi, mitu korda mingi õpilase ID tulemuses esineb. Kui andmed on sisestatud nii nagu ülaltoodud näidetes, peaks õpilase ID väärtusega 1 esinema 3 korda. See tähendabki seda, et see õpilane õpib parasjagu 3 kursusel.
Jooksutame nüüd uut märksõna DISTINCT
sisaldavat päringut:
SELECT DISTINCT opilase_id FROM õppimine;
Kas märkad erinevust võrreldes eelneva päringu tulemusega? Mõtiskle, mida me uue päringu tulemuses näeme.
Jooksutage nüüd järgmist kahte välja toodud päringut ja võrrelge ka nende tulemusi:
SELECT id, opilase_id FROM õppimine;
SELECT DISTINCT id, opilase_id FROM õppimine;
Peale andmeridade järjestuse ei tohiks kahe viimase päringu tulemuste vahel erinevusi olla. Mõtiskle, miks andmeridade arv seekord ei erinenud.
Eelnevalt tutvustatud päringu SELECT DISTINCT opilase_id FROM õppimine;
tulemusest saime teada, mitu õpilast parasjagu üldse õpivad. Kuigi seda võis lugeda välja ka algsest päringust, kus märksõna DISTINCT
ei kasutatud, tegi DISTINCT
kasutamine meile selle lihtsamaks, kuna korduvaid väärtuseid enam ei kuvatud.
Teise päringupaari puhul oli päringu tulemuses ka tunnus id
, mistõttu ei saanud päringu tulemuses olnud andmeread korduda. Seda seetõttu on tunnus id
on primaarvõti ehk selle väärtus on tabelis Oppimine igal real alati erinev. Seega ei muutnud märksõna DISTINCT
päringusse lisamine andmeridade arvu.
Tasub teada, et DISTINCT
kasutamine teeb päringu jooksutamise märksa aeglasemaks, sest sisemiselt tehakse võrdlusi, millega leitakse kattuvaid ridu. Kuigi niivõrd lihtsate päringute puhul ei ole ajakulu märgatav, tuleks seda siiski vaid vajadusel kasutada.
Erinevaid päringuid, sh ise koostatuid, võib alati julgelt katsetada ning ei tasu karta, et päringute jooksutamise tõttu midagi katki läheb. Isegi kui päring on vigane, ei muuda see andmebaasi struktuuri ega seal hoiustatavaid andmeid.
Nüüd oleme õppinud lihtsas näidisandmebaasis lihtsaid päringuid jooksutama ning saame andmeid suurest Netflixi teemalisest andmebaasist pärima hakata. Samuti saame õppida oma päringuid piirama selleks, et päringu tulemuses ei kuvataks üleliigset infot.