Arvutiteaduse instituut
  1. Kursused
  2. 2023/24 sügis
  3. Sissejuhatus andmebaasidesse (MTAT.03.105)
EN
Logi sisse

Sissejuhatus andmebaasidesse 2023/24 sügis

  • Kursuse korraldus
  • Loengud
    • Loenguid toetav õpik (autorid: Karl Taal & Piret Luik)
  • Praktikumid
    • Praktikume toetavad materjalid (autorid: Uku Roio & Piret Luik)
  1. Tarkvara paigaldamine
  2. Mis faile on vaja esitada iseseisvate tööde jaoks?
  3. Päringulause (algus)
  4. LIKE operaator
  5. Päringud funktsioonidega
  6. Päringulause (jätk)
  7. Päringud mitmest tabelist
  8. Tabelite loomine. Kirjete lisamine ja muutmine
  9. Tabelite muutmine
  10. Vaated
  11. Kordamine
  • Paaristöö: Oma mudel
  • Viited


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 BYga. 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 funktsioonidegaPäringud mitmest tabelist
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Courses’i keskkonna kasutustingimused