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 peamisesSELECT
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.
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 |