Oletame, et meil on sellise kontseptuaalse struktuuriga andmebaas:
[Hotell]-1------------0..*-[Reserveerimine]
Ülesanne: Leia reserveerimised, mis on tehtud Tallinna linnas olevas hotellis.
SELECT *
FROM Reserveerimine
WHERE
hotelli_nr IN (SELECT hotelli_nr
FROM Hotell
WHERE linn = 'Tallinn' );
Sulgudes oleva alampäringuga leitakse hotellide numbrid, mille korral on täidetud tingimus linn = 'Tallinn'. Tulemuseks on hulk (1,2,8).
Iga rea korral tabelist Reserveerimine leitakse sellest reast hotelli number ja kontrollitakse, kas see number sisaldub alampäringuga leitud hulgas.
Näiteks reserveerimisel hotellis 3 kontrollitakse:
Kas on tõsi, et väärtus 3 sisaldub hulgas (1,2,8). Vastus - ei ole tõsi. Järelikult sellise hotelli numbriga reserveerimine ei ole tulemuses.
Näiteks reserveerimisel hotellis 2 kontrollitakse:
Kas on tõsi, et väärtus 2 sisaldub hulgas (1,2,8). Vastus - jah, on tõsi. Järelikult sellise hotelli numbriga reserveerimine on tulemuses.
Ülesanne: Leia reserveerimised, mis ei ole tehtud Tallinna linnas olevas hotellis.
SELECT *
FROM Reserveerimine
WHERE
hotelli_nr NOT IN (SELECT hotelli_nr
FROM Hotell
WHERE linn = 'Tallinn');
Sulgudes oleva alampäringuga leitakse hotellide numbrid, mille korral on täidetud tingimus linn = 'Tallinn' . Tulemuseks on hulk (1,2,8).
Iga rea korral tabelist Reserveerimine leitakse sellest reast hotelli number ja kontrollitakse, kas see number ei sisaldu alampäringuga leitud hulgas.
Näiteks reserveerimisel hotellis 3 kontrollitakse:
Kas on tõsi, et väärtus 3 ei sisaldu hulgas (1,2,8). Vastus - jah, on tõsi. Järelikult sellise hotelli numbriga reserveerimine on tulemuses.
Näiteks reserveerimisel hotellis 2 kontrollitakse:
Kas on tõsi, et väärtus 2 ei sisaldu hulgas (1,2,8). Vastus - ei ole tõsi. Järelikult sellise hotelli numbriga reserveerimine ei ole tulemuses.
Juhul, kui alampäring võib tagastada NULLi, siis tuleks kirjutada:
SELECT *
FROM Reserveerimine
WHERE
hotelli_nr NOT IN (SELECT hotelli_nr
FROM Hotell
WHERE linn = 'Tallinn' AND hotelli_nr IS NOT NULL);
Ilma selleta juhtuks nii, et kui alampäring tagastaks NULLi, siis poleks põhipäringu tulemuses ühtegi rida. Miks see nii juhtub?
Vaatame järgmist näidet. Sulgudes oleva alampäringuga leitakse hotellide numbrid, mille korral on täidetud tingimus linn = 'Tallinn' . Tulemuseks on hulk (1,2,8, NULL).
Iga rea korral tabelist Reserveerimine leitakse sellest reast hotelli number ja kontrollitakse kas see number ei sisaldu alampäringuga leitud hulgas.
Näiteks reserveerimisel hotellis 3 kontrollitakse:
Kas on tõsi, et väärtus 3 ei sisaldu hulgas (1,2,8, NULL). Vastus - ei tea. NULL on nagu suletud karp, mille sisse ei näe. Võibolla on seal karbis 3 võibolla mitte. Järelikult sellise hotelli numbriga reserveerimine ei ole tulemuses.
Näiteks reserveerimisel hotellis 2 kontrollitakse:
Kas on tõsi, et väärtus 2 ei ole hulgas (1,2,8, NULL). Vastus - ei ole tõsi. Järelikult sellise hotelli numbriga reserveerimine ei ole tulemuses.
Antud juhul polnud seda tingimust (hotelli_nr IS NOT NULL) tingimata vaja kirja panna (ehki kirjapanek poleks ka viga), sest hotelli_nr tabelis Hotell on primaarvõti ja seega ka kohustuslik veerg.
Hinda postitust:
Keskmine hinne : Pole veel hinnanguid!