Grupeerimine
SQL päringute tulemusi on võimalik grupeerida. Tulemuste grupeerimine on vajalik, kui sa soovid pärida korraga mitut veergu, kus vähemalt ühele veerule on rakendatud agregeerivat funktsiooni. Grupeerida tuleb veerge, mille peal on kasutatud mitteagregeerivaid funktsioone või mis esinevad lihtsalt päringus koos agregeeriva funktsiooniga. Vastasel juhul viskab SQL konsool errori.
Näiteks lause:
SELECT linn, AVG(juhatajaid) FROM lemmikloomapoed
viskab errori, mis väidab, et veerg linn peab olema kasutuses GROUP BY
osas.
SELECT linn, AVG(juhatajaid) FROM lemmikloomapoed GROUP BY linn
Lauset jooksutades näed, et tulemuseks on kaks veergu, kus iga linna kohta on nähe selle keskmise juhatajaid väärtus. Mitteagregeerivat funktsiooni kasutades tuleb see veerg panna samamoodi kirja ka GROUP BY osas.
SELECT LEFT(riik, 2), COUNT(*) FROM lemmikloomapoed GROUP BY LEFT(riik, 2)
või
SELECT LEFT(riik, 2) AS riik, COUNT(*) FROM lemmikloomapoed GROUP BY riik
GROUP BY
lause osas saab panna peale ka piiranguid agregeeriva funktsiooni väärtustele (umbes nagu WHERE piirang). Seda tehakse märksõnaga HAVING
.
SELECT LEFT(riik, 2) AS riik, COUNT(*) FROM lemmikloomapoed GROUP BY riik HAVING COUNT(*) > 2
Järjestamine
Päringute tulemusi saab järjestada kasvavas ja kahanevas järjekorras. Järjestamiseks kasutatakse ORDER BY
märksõna. PostgreSQL'is toimub järjestamine vaikimisi kasvavalt.
SELECT * FROM lemmikloomad ORDER BY synnipaev DESC
Päring kuvab tabeli kirjed kahanevalt järjestatud veeru synnipaev põhjal. Selleks, et järjestada tulemusi kasvavalt tuleb kasutada DESC
asemel ASC
märget.
Järjestamiseks on kasulik veel teada LIMIT
lauseosa. Sellega saab määrata kindla arvu kirjeid, mida SQL konsoolil kuvatakse. Seda on mõistlik kasutada, kui on näiteks vaja leida mingist tabelist mingi veeru 10 suurimat väärtust. LIMIT
osa tuleb alati kasutada koos ORDER BY
märkega.
SELECT riik, COUNT(*) FROM lemmikloomapoed GROUP BY riik ORDER BY COUNT(*) DESC LIMIT 3
Mitmest tabelist korraga pärimine
Erinevatest tabelite andmeid on võimalik kombineerida. Võimalik on kombineerida ükskõik kui palju tabeleid. Nii saab luua palju kasulikke päringuid, kui tabelite vahel on mingi seos. Näiteks saame vaadata, millised loomad on mingis linnas asuvas poes.
SELECT lemmikloomad.liik, lemmikloomapoed.linn FROM lemmikloomad, lemmikloomapoed WHERE lemmikloomad.poeid = lemmikloomapoed.id
SELECT lause esimeses osas täpsustame, milliseid veerge tahame pärida. Näites näed, et veergude juures on täpsustatud ka, millisest tabelist veerg pärit on. Üldiselt ei ole vaja seda märkida, vaid saab ka lihtsalt veeru nime välja kirjutada, aga mõnikord on seda selguse mõttes hea teha, kui kahel tabelil on näiteks sama nimega veerg. Lause FROM osas täpsustame, millistest tabelitest me infot soovime saada. Lõpuks tuleb WHERE osas märkida, kuidas need tabelid omavahel seotud on, mille tulemusena ühendati kõigi lemmikloomade liigid poodide ID-de võrdumise alusel vastavate poodide linnadega. Siin on alamtabelil tunnus PoeID ning ülemtabelil tunnus ID.
Agregeerivaid funktsioone ja piiranguid saab ka selliste päringute juures kasutada.
SELECT DISTINCT liik, linn FROM lemmikloomad, lemmikloomapoed WHERE lemmikloomad.poeid = lemmikloomapoed.id AND liik='koer'
SELECT liik, MAX(töötajate_arv) FROM lemmikloomad, lemmikloomapoed WHERE lemmikloomad.poeid = lemmikloomapoed.id GROUP BY liik ORDER BY MAX(töötajate_arv) DESC
Üldjuhul saab jälgida järgnevaid punkte mitut tabelit siduvate päringute loomiseks:
- SELECT lause esimenes osas pane kirja otsitavad tunnused (vajadusel koos funktsioonidega).
- FROM osas on kirjas kõik tabelid, mille tunnuseid sa pärid.
- WHERE osas pane alguses kirja, kuidas tabelid omavahel seotud on. Ülemtabeli primaarvõti on seotud alamtabeli välisvõtmega. Neil peab olema sama andmetüüp.
- Vajadusel lisa piiranguid.
Päringud ja funktsioonid | Tabelite loomine. Kirjete lisamine ja muutmine |