15.2.2015
Tietokannat: Alikyselyt
Alikyselyt
- Voidaan käyttää SELECT, INSERT, UPDATE ja DELETE-lauseissa
- Sisin kysely suoritetaan ensiksi
- Voi palauttaa vain yhden sarakkeen ja sille yhden tai useamman
arvon
- vertailuoperaattori “=“: alikysely voi palauttaa vain yhden
arvon
- IN-operaattori tai vertailuoperaattori ANY tai ALL -ehdon
kanssa sallii alikyselyn palauttavan useita arvoja
- Oltava aina suluissa ja haettavana saa olla vain yksi sarake
- Käyttää automaattisesti distinct-määrettä
Esimerkki 1
Hae sen henkilön nimi, joka myy solmioita
SELECT HenkNimi
FROM henkilo
WHERE HenkID =
(SELECT MyyjaID FROM tuote WHERE TuoteNimi = ‘Solmio');
Esimerkki 2 (koostefunktion käyttö)
- Alikyselyissä etsitään usein arvoa koostefunktiolla (palauttaa
aina yhden arvon)
- Tyypillistä on hakea alikyselyssä jokin koostefunktion palauttama
arvo ja verrata sitä toiseen joukkoon
SELECT tuotenimi,hinta,myyja
FROM tuote -- hakuehto:
WHERE hinta > -- ne myydyt tuotteet myyjineen
(SELECT AVG(hinta) -- jotka ovat
FROM tuote -- kalliimpia kuin Arskan
WHERE myyja = 'Arska'); -- keskimäärin myymät
Esimerkki 3 (IN)
- Hae niiden tuotteiden nimet ja hinnat, joita myy laiteosastolla
olevat henkilöt:
SELECT tuotenimi, hinta
FROM tuote
WHERE myyjaID IN
(SELECT myyjaID
FROM myyja
WHERE osasto = 'laite');
- Myös NOT IN usein käyttökelpoinen
Esimerkki 4 (ANY ja ALL)
- Jos käytetään vertailuoperaattoreita > tai <, niin IN ei käy
- Hae ne tuotteet myyjineen, jotka ovat kalliimpia kuin halvin
Arskan myymä tuote
SELECT tuotenimi, hinta, myyja
FROM tuote
WHERE hinta > ANY
(SELECT hinta
FROM tuote
WHERE myyja = 'Arska');
- Myös NOT IN usein käyttökelpoinen
- ANY: Mikä tahansa arvo täyttää ehdon
- ALL: Jokaisen arvon tulee täyttää ehdon
Esimerkki 5 (EXISTS)
- EXISTS
- TOSI, jos alikysely palauttaa ainakin yhden rivin
- EPÄTOSI, jos alikysely ei palauta yhtään riviä
Olkoon taulut:
Tuote |
Id (pk) |
TuoteNimi |
ToimittajaId |
Hinta |
Toimittaja |
Id (pk) |
FirmaNimi |
Osoite |
Email |
- Hae niiden toimittajien nimet, jotka toimittavat jotakin yli 300 euron tuotetta
SELECT FirmaNimi
FROM Toimittaja
WHERE EXISTS
(SELECT TuoteNimi
FROM Tuote
WHERE ToimittajaId = Toimittaja.Id
AND Hinta > 300);
- Kyseessä on korreloitu (kytketty) alikysely, jossa
alikysely viittaa ympäröivän (ylemmän tason) kyselyn tietoihin (Toimittaja.Id)
Osa materiaalista on muokattu Jouni Huotarin materiaalista.