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


LIKE operaator

LIKE operaator on ka üks võimalikest operaatoritest, mida saab kasutada koos WHERE märksõnaga. LIKE operaator pakub võimalust täpsustada enda järel mingit mustrit, mille põhjal saab veergude väärtuseid piirata. Tihtipeale kasutatakse seda sõnede juures, kus otsitakse tabelist kirjeid, kus veeru väärtus sisaldab mingit kindlat sümbolite kombinatsiooni. Aga sellega saab ka teisi andmetüüpe piirata.

Näiteks:

  • SELECT riik FROM lemmikloomapoed WHERE riik LIKE 'Ees%';

Selles lauses on kasutatud mustrit 'Ees%'. 'Ees' osa mustris tähendab, et käsk otsib veerust riik sõnesid, mis algavad nende sümbolitega. % märk aga tähendab, et selle asemel võib olla ükskõik kui palju igasuguseid sümboleid (isegi 0 sümbolit). Ehk näide tagastab meile kõik veeru riik kirjed, kus riigiks on Eesti. Pane tähele, et muster eristab ka suuri- ja väiketähtesid.

Eesti riiki saab pärida ka näiteks lausega:

  • SELECT riik FROM lemmikloomapoed WHERE riik LIKE '%sti';

LIKE mustris saab ka kasutada alakriipsu _. Alakriips tähendab, et selle asemel võib olla üks ükskõik milline sümbol. Alakriipse võib ka järjest mitu olla ning neid saab kombineerida ka sümboliga %.

  • SELECT riik FROM lemmikloomapoed WHERE riik LIKE 'Eest_';

PostgreSQL'i LIKE operaator töötab ainult sõnedega. Seega, kui me tahame operaatorit kasutatada veergude juures, kus andmetüübiks on number, peame me SELECT lauses andmetüübi teisendama sõneks. Seda saab teha, kirjutades WHERE osas veeru nime taha kaks koolonit ning uue andmetüübi.

  • SELECT * FROM lemmikloomapoed WHERE töötajate_arv::text LIKE '5'


Aritmeetilised tehted veeruavaldistena

SQL pakub võimalust andmete pärimise ajal tabeli veergudega teha aritmeetilisi tehteid. Seda saab kasutada näiteks selleks, et tabelis hoida ruumi kokku. Selle asemel, et teha tabelisse uus veerg uue tunnusega, saame hoopis kasutada juba olemasolevaid veerge ning kuvada soovitav tulemus aritmeetilise tehtega. Veergudega saab teha tehteid omavahel või mõne konstandiga.

  • SELECT linn, töötajate_arv + 5 FROM lemmikloomapoed
  • SELECT töötajate_arv * 5 FROM lemmikloomapoed

Käskusid jooksutades võid tähele panna, et veergudel, millega on tehtud mõni tehe, pole normaalsel kujul nime. See juhtub, kuna DBeaver ei tea, mida veeruga tehtud tehte tulemus peaks tähistama. Selleks, et veerule anda tema väärtuseid illustreeriv pealkiri saab kasutada AS võtmesõna.

  • SELECT linn, töötajate_arv + 5 AS tootajaid_jouludel FROM lemmikloomapoed


Mitteagregeerivad funktsioonid

Veeruavaldistena saab veel lisaks kasutada PostgreSQL'i poolt pakutavaid sisseehitatud funktsioone. Need jaotatakse kaheks - mitteagregeerivad ja agregeerivad funktsioonid. Kõigepealt räägime mitteagreveerivatest funktsioonidest.

Mitteagreveerivaid funktsioone on palju ning nende kõikide kohta saab lugeda PostgreSQL dokumentatsioonist. Siin peatükis vaatame läbi mõned kasulikumad nendest.

Stringitüüpi tunnustele saab rakendada järgmiseid funktsioone:

  • LENGTH (<veerg>)
  • LEFT (<veerg>, arv)
  • RIGHT (<veerg>, arv)
  • UPPER (<veerg>)
  • SUBSTRING(<veerg>,arv,arv)

LEFT ja RIGHT funktsioone kasutatakse sellest, et saada veeru kirjest kätte mingi kindel arv sümboleid, alustades sümbolite loendamist veerus, kas vasakulkt või paremalt. Arv parameeter funktsioonis määrabki ära sümbolite arvu.

  • SELECT LEFT(riik, 2) FROM lemmikloomapoed
  • SELECT RIGHT(riik, 2) FROM lemmikloomapoed

LENGTH funktsiooni kasutatakse peamiselt päringu WHERE osas ning sellega saab otsida andmeid veeru kirje tähemärkide arvu põhjal.

  • SELECT linn FROM lemmikloomapoed WHERE LENGTH(linn) > 5

UPPER funktsioon teisendab kõik veerus olevad väiketähed suurtähtedeks. SUBSTRING töötab sarnaselt LEFT ja RIGHT funktsioonidele. Erinevus seisneb selles, et me saame täpsemalt valida, kust me tahame veeru kirjet tükeldada.

  • SELECT UPPER(linn) FROM lemmikloomapoed
  • SELECT SUBSTRING(riik, 1, 2) FROM lemmikloomapoed

Ehk eelmine käsk annab meile veeru riik kirjete esimesed kaks sümbolit. Esimene number funktsioonis määrab ära, millisest indeksist algab tükeldamine. Eelnevas näites on see 1, ehk tükeldamine algab esimesest kirje sümbolist. Teine number määrab ära kui pikk see tükeldatud osa peab olema. Meie näite puhul on see kaks sümbolit.

Funktsioone saab ka koos kasutada.

  • SELECT UPPER(SUBSTRING(riik, 1, 2)) FROM lemmikloomapoed

Lõpuks tasuks ka teada funktsiooni DATE_PART, mida kasutatakse kuupäeva märkivate andmetüüpidega veergude töötlemiseks. Näiteks on sellega võimalik kätte saada TIMESTAMP andmetüübist ainult aasta.

  • SELECT DATE_PART('year', sisestatud) FROM lemmikloomad

DATE_PART võtab esimeseks argumendiks sõne, millega saabki märkid, millist osa kuupäevast sa soovid näha. Veel on võimalik 'year' asemel kirjutada näiteks 'month' ja 'day'.


Agregeerivad funktsioonid

Agreveerivatest funktsioonidest toome ka välja mõned tähtsamad:

  • Count(*)
  • Count(distinct <veerg>)
  • Max(<veerg>)
  • Min(<veerg>)
  • Sum(<veerg>)
  • Avg (<veerg>)

COUNT funktsiooniga saab vaadata tabelis olevate kirjete arvu. Veel saab funktsiooni sees kasutada DISTINCT märksõna.

  • SELECT Count(*) FROM lemmikloomapoed

Lause annab meile kõik tabelis lemmikloomad olevate kirjete arvu. Funktsiooniga saab otsida ka mingi kindla veeru kirjete arvu.

  • SELECT Count(riik) FROM lemmikloomapoed

MAX ja MIN funktsioonid tagastavad tabeli veeru vastavalt suurima või väikseima kirje. Funktsiooni saab kasutada nii sõnetüüpi tunnuste kui ka numbriliste tunnuste peal. Sõnede puhul vaatavad funktsioonid tähestiku järjekorda, ehk MAX tagastab tähestikus viimase kirje veerus.

  • SELECT MAX(töötajate_arv) FROM lemmikloomapoed WHERE töötajate_arv > 4
  • SELECT MIN(riik) FROM lemmikloomapoed

SUM funktsioon tagastab veerus olevate väärtuste summa ja AVG keskmise väärtuse.

  • SELECT SUM(töötajate_arv) FROM lemmikloomapoed

Mitteagreveerivate ja agreveerivate funktsioonide vahe seisneb selles, et agregeerivad funktsioonid annavad ühe tulemuse veeru kirjete kohta, millele funktsiooni rakendatakse, ehk SQL konsoolis näed tulemusena alati ühte väärtust. Mitteagreveerivad aga annavad ühe tulemuse iga veeru kirje kohta, mille peal funktsiooni kasutatakse. Mitteagreveerivaid ja agreveerivaid funktsioone ei saa korraga läbisegi kasutada.


Seosed tabelite vahel

Tabelite vahel saab luua seoseid välisvõtmetega. Välisvõtmega märgitakse, et mingi tabeli mingi tunnus viitab teise tabeli mingile tunnusele. Näiteks saab välisvõtmega määrata, et esimeses tabelis võtmega ühendatud tunnuse kirje kustutamisel kustub kirje ka teises tabelis. Välisvõtmega märgitud tunnustel peab olema sama andmetüüp.

Välisvõtme loomine näeb välja järgnev:

  • ALTER TABLE <alamtabel>
    ADD CONSTRAINT <fk_nimi>
    FOREIGN KEY ({alamtabeli_veerg})
    REFERENCES <ülemtabel>[({võtmeveerg})]
    [ON DELETE {tegevus}]
    [ON UPDATE {tegevus}];

Näiteks:

  • ALTER TABLE lemmikloomad
    ADD CONSTRAINT fk_lemmikloomad2poed
    FOREIGN KEY (PoeID)
    REFERENCES Lemmikloomapoed(id)
    ON DELETE CASCADE
    ON UPDATE CASCADE;

Loodud välisvõti tähistab, et tabeli lemmikloomad veerg PoeID viitab tabeli lemmikloomapoed veerule id. Alamtabeliks kutsutakse tavaliselt tabelit, millele luuakse välisvõti ning ülemtabeliks seda, mille primaarvõtit viidatakse. ON DELETE CASCADE tähendab, et lemmikloomapoe kustutamisel kustub automaatselt ka lemmikloom, mille PoeID väärtus oli võrdne kustutatud poe id väärtusega. ON DELETE CASCADE omadusele on veel lisaks kaks tähtsat omadust ON UPDATE CASCADE ja ON DELETE RESTRICT. ON UPDATE CASCADE tähendab, et viidatud ülemtabeli veeru muutmisel muutuvad ka alamtabeli kirjete väärtused vastavalt, ehk üleval olevas näites kui me muudaksime tabelis lemmikloomapoed mingi poe id väärtuse, siis muutuvad PoeID väärtused ka tabelis lemmikloomad. ON DELETE RESTRICT ei lase viidatud tabeli kirjeid kustutada.

Kui SQL konsoolis saad välisvõtit luues errori, siis võib selle taga olla ON UPDATE CASCADE. Tõenäoliselt on sul viidatud veerus mingi väärtus, mida teises tabelis viidatud veerus pole. Vaata, et mõlemas tabelis viidatud veergudes olevate kirjete väärtuste seas ei oleks erinevusi.

DBeaveris saad hea ülevaate tabelite vahelistest seosetest, kui liigud Schemas->public ning public vaates vajutad paremal pool aknas ER Diagram.

PäringudPä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