Arvutiteaduse instituut
  1. Kursused
  2. 2024/25 kevad
  3. Andmebaasid (LTAT.03.004)
EN
Logi sisse

Andmebaasid 2024/25 kevad

  • Kursuse korraldus
  • Loengud
  • Praktikumid
  • Kodulugemised (autorid: Margus Roo ja Piret Luik)
  1. Kuidas teha oma andmebaasist backup'i
  2. Päringulause (algus)
  3. Andmetüübid
  4. Päringulause (jätk)
  5. Alampäringud
  6. Operaatorid UNION ja JOIN
  7. Tabelite loomine ja välisvõti
  8. Vaadete loomine
  9. Vaadete muutmine ja vaate kaudu põhitabeli andmete muutmine
  10. Funktsioonide loomine
  11. Protseduuride loomine
  12. Indeksite loomine
  13. Trigerite loomine
  • Rühmatöö

Operaatorid Alampäringud

Alampäring e subselect

Alampäring on päringu esitamine teise päringu sees. Neid kasutatakse andmaks andmeid seda päringut ümbritsevale päringule. Alampäringud (sisemised päringud) võivad tulemuseks anda nii üksiku väärtuse kui ka kirjete loendi. Alampäringud võib kasutada päringus erinevatel viisidel ja erinevates kohtades.

Alampäringute kasutamisel tuleb järgida mõningaid juhiseid:

  • Alampäring peab olema ümarsulgudes.
  • Alampäring tuleb paigutada võrdlusoperaatorist paremale.
  • Alampäringutes ei saa kasutada järjestamist kui pole tegemist SELECT TOP'iga. Järjestamist kasutada peamises SELECT lauses.
  • Kui alampäring tagastab välisele päringule (põhipäringule) nullväärtuse, ei tagasta väline päring ühtegi rida kui seda alampäringut kasutatakse WHERE osa võrdluses.

Näiteks soovime saada klubisse Areng kuuluvate isikute nimekirja (ees- ja perenimed), kuid me ju ei tea, mis id-ga klubi Areng Klubide tabelis on. Selleks kirjutame päringu (alampäring on hallil taustal):

SELECT eesnimi, perenimi 
FROM isikud
WHERE klubi =
    (SELECT id 
     FROM klubid
     WHERE nimi='Areng')

Selliselt kirjutatud päring koosneb:
Põhipäringust, milles leitakse isikute ees ja perenimed isikute tabelist - SELECT eesnimi, perenimi FROM isikud WHERE klubi =
Alampäringust, milles leitakse, milline id number on klubil nimega Areng - SELECT id FROM klubid WHERE nimi = 'Areng'. Pannes selle kokku saamegi päringu, kus isikute tabeli väli klubi võrdsustatakse alampäringu abil saadud id-le vastava arvuga.

Erialases kirjanduses nimetatakse põhipäringut ka väliseks päringuks (ingl outer query) ja alampäringut sisemiseks päringuks (ingl inner query). Samuti kohtab väljendeid vasakpoolne päring (ingl lefthand query), mida kasutatakse põhipäringu kohta ja parempoolne päring (ingl righthand query), mida kasutatakse alampäringu kohta.

Alampäring võib olla ka võrratusena ja sisaldada mitut alampäringut. Näiteks tahame teada, milliste riikide rahvaarvud on väiksemad kui Jaapanis, kuid suuremad kui Kanada. Ühe päringuga saame teada Jaapani rahvaarvu ja teisega Kanada oma ning paneme mõlemad päringulausesse:

SELECT name, population 
FROM world 
WHERE population < 
    (SELECT population 
     FROM world
     WHERE name='Japan') 
AND population > 
    (SELECT population 
     FROM world 
     WHERE name='Canada')

Püüa nüüd kirjutada ise päringulauset, mis väljastaks mängijate ees- ja perenimed, kes on saanud valgetega mängides enam punkte kui Maria Murakas valgetega. Kui ei õnnestu, ava test ja püüame seda alampäringut koos kirjutada.
AVA TEST

EXISTS operaator

Kui operaatorid =, <, >, !=, mida me ülevalpool kasutasime, eeldavad alampäringu tulemuses ühte rida, siis EXISTS operaator sellist piirangut ei sea.
EXISTS operaator töötab nagu lüliti, kui alampäring tagastab vähemalt ühe rea (võib ka rohkem), siis on lüliti lahti (true) ja täidetakse põhipäring, kui alampäring ei tagasta midagi, siis on lüliti kinni (false) ja põhipäringut ei täideta.

EXISTS kasutamisel ei võrrelda põhipäringu tingimuses alampäringu poolt tagastatavat.
EXISTS puhul põhipäring täidetakse, kui alampäring tagastab true.
EXISTS puhul põhipäringut ei täideta, kui alampäring tagastab false.

EXISTS operaatoriga alampäringu koostamise formaat on:

SELECT */veeruavaldised
FROM <tabelid>
WHERE EXISTS
    (SELECT veeruavaldised 
     FROM <tabelid> 
     WHERE piirangud);

Näiteks soovime turniiride andmeid, mil mängiti partii, mille üheks mängijaks (kas mustadega või valgetega mängija) on isik, kelle id on 72:

SELECT * 
FROM turniirid
WHERE EXISTS 
    (SELECT * 
     FROM partiid 
     WHERE partiid.turniir = turniirid.id AND (valge = 72 OR must = 72));

Kui soovid kontrollida, kas said aru EXISTS operaatori kasutamisest, ava test.

AVA TEST

Alampäringu lisavõimalusi PostgreSQL-id saad vaadata siit: https://www.postgresql.org/docs/15/functions-subquery.html

Päringulause (jätk)Operaatorid UNION ja JOIN
  • 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