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

Sissejuhatus andmebaasidesse 2022/23 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äringud
  4. Päringud ja funktsioonid
  5. Päringud mitmest tabelist
  6. Tabelite loomine. Kirjete lisamine ja muutmine
  7. Tabelite muutmine
  8. Vaated
  9. Kordamine
  • Paaristöö: Oma mudel
  • Viited


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 funktsioonidTabelite loomine. Kirjete lisamine ja muutmine
  • 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