SELECT lause
SELECT
lause esimeste osadega tutvusite juba. Selles materjalis vaatame päringulause teisi osi. Täielik SELECT
lause on kujul:
SELECT {<veeruavaldised>} FROM {<tabel>} [WHERE {<tingimus>}] [GROUP BY {<veerg>}] [HAVING {<tingimus>}] [ORDER BY {<veerg>}] [LIMIT n];
Järgnevalt vaatame lause osi GROUP BY
, HAVING
, ORDER BY
ja LIMIT
ükshaaval. Lisaks jätke meelde päringulause osade järjekord, sest seda ei tohi muuta.
Grupeerimine - GROUP BY
Oleme kasutanud funktsioone SUM
, MIN
, COUNT
. Rääkisime, et neid nimetatakse agregeeritud funktsioonideks (annavad ühe tulemuse) ning neid ei saa seepärast kasutada päringus koos mitteagregeeritud funktsioonide (näiteks LENGTH
, LEFT
, YEAR
jms) või veerunimedega. Selleks on vajalik kasutada grupeerimist. Grupid tekivad agregeerimisfunktsiooni rakendamisest mingile väljale.
SELECT {<veeruavaldised>} FROM {<tabel>} [WHERE {<tingimus>}] [GROUP BY {<veerg>}];
Näiteks soovides teada, kui palju on omanike hulgas mehi, kui palju naisi, saab kirjutada:
SELECT sugu, COUNT(sugu) AS arv FROM omanikud GROUP BY sugu;
Kuna siin sugu on agregeerimata (atribuudi sugu väärtuste arv on sama, mis olemite arv tabelis) ja COUNT(sugu)
on agregeeritud funktsioon, siis agregeerimata veerg peab olema GROUP BY
järel. Kui naissoost omanikud on kodeeritud 'n'
ja meessoost 'm'
, siis tulemustabel võiks välja näha selline:
Siin päringus kirjutasime COUNT(sugu) AS arv
ning näeme, et tulemustabeli pealkirjaks sai ka arv
. AS
abil me saame veeru või avaldise ümber nimetada. Kui on tegemist ühe sõnaga, võime selle kirjutada jutumärke kasutamata, kui aga on mitu sõna, siis peame panema selle jutumärkide vahele.
Tingimus grupile - HAVING
SELECT
lause järgmine osa HAVING
on samuti tingimus, millega piiratakse päringusse tulevaid kirjeid, kuid kui WHERE
piirang rakendub olemile (tabeli reale), siis HAVING
rakendub grupile.
SELECT {<veeruavaldised>} FROM {<tabel>} [WHERE {<tingimus>}] [GROUP BY {<veerg>}] [HAVING {<tingimus>}];
Näiteks kui soovime kirjutada päringu, millega leiame naiste eesnimede esitähed, mida esineb enam kui neljal korral. Paneme tähele, et siin GROUP BY juurde ei kirjutanud me pikalt terve avaldise LEFT(eesnimi,1), vaid algustäht
, sest me nimetasime selle avaldise SELECT juures nii ümber. HAVING juures kahjuks ümbernimetatud veeru/avaldise nime kasutada ei saa (saab GROUP BY ja ORDER BY juures).
SELECT LEFT(eesnimi,1) AS algustäht, count(eesnimi) AS arv FROM omanikud WHERE sugu='n' GROUP BY algustäht HAVING count(eesnimi)>4;
Selle tulemus võiks välja näha selline:
Andmebaasi juhtimissüsteem rakendab esmalt WHERE
piirangut ja peale seda GROUP BY
kirjetele, mis WHERE piirangu tulemusena alles jäävad.
Järjestamine - ORDER BY
SELECT {<veeruavaldised>} FROM {<tabel>} [WHERE {<tingimus>}] [GROUP BY {<veerg>}] [HAVING {<tingimus>}]; [ORDER BY {<veerg> [ ASC | DESC ] } ];
Järjestada on võimalik nii kasvavalt (mittekahanevalt) ASC
kui ka kahanevalt (mittekasvavalt) DESC
. Näiteks kui me eelmise näite korral tahame ka järjestada kirjutades esimeseks eesnime esitähe, millega on kõige enam naisi, siis näeb lause välja selline:
SELECT Left(eesnimi,1) AS algustäht, count(eesnimi) AS arv FROM isikud WHERE sugu='n' GROUP BY algustäht HAVING count(eesnimi)>4 ORDER BY arv DESC;
Oleks võinud kirjutada ka ORDER BY 2 DESC
, sest arv
on SELECT
osas teisel positsioonil. Tulemus näeks välja selline:
Piiramine - LIMIT
Kui ei soovi väljastada kõiki tingimustele vastavaid kirjeid, vaid ainult teatud arvu, siis saab kasutada SELECT lauseosa LIMIT
.
SELECT {<veeruavaldised>} FROM {<tabel>} [WHERE {<tingimus>}] [GROUP BY {<veerg>}] [HAVING {<tingimus>}]; [ORDER BY {<veerg> [ ASC | DESC ] } ] [LIMIT n];
Siin n
on ridade (kirjete) arv, mida soovitakse väljastada. Näiteks soovime väljastada viie kõige noorema (ehk siis sünniaasta on kõige suurem) andmed. NB! LIMIT
osa saab kasutada ainult koos ORDER BY
ga. Vastasel juhul annab see suvalised viis kirjet. Seega viie noorima omaniku väljastamiseks peame esmalt tulemuse järjestama kahanevalt (DESC
) ja siis sealt valima 5 esimest:
SELECT * FROM omanikud ORDER BY synniaasta DESC LIMIT 5;
Leidmaks viite kõige vanemat omanikku oleks sama lause, ainult järjestamine oleks olnud kasvav (ASC
), sest siis peaks ju sünniaastad olema kõige väiksemad.
Mõelge, mida võiks aga väljastada selline päringulause:
SELECT * FROM omanikud ORDER BY synniaasta DESC LIMIT 5 OFFSET 2;
Siin väljastatakse küll viis noorimat omanikku, kuid alates kolmandast positsioonist ehk siis kahte kõige paremat mängijat ei tule tulemustabelisse, vaid need, kes on paremuselt 3.-7. positsioonil.
Kui soovid oma teadmisi päringulause kohta kontrollida, ava test.
AVA TEST
Päringulause SELECT jätkuvideo:
Päringud funktsioonidega | Päringud mitmest tabelist |