Kodulehed
[386] - Andmebaasid I (ITI0206) (kevad 2024)
Esiletöstetud Kiirvalik
Lisainfo Kõige olulisemate tegevuste kiirvalik. Failide saatmiseks valige Vastamine alt sobiv ülesanne.
Üldist
Materjalid
LisainfoMaterjalide kataloogid
Isiklik
Lisainfo Info ainult Sulle - teised kasutajad seda ei näe
Abi
Lisainfo Võimalus küsida õppejõult abi (nagu foorum, kus saab küsida küsimusi ja kommenteerida vastuseid)
Mitmesugust
Abi / Kasutajatugi / SQL

Avalikud küsimused ja vastused:

Küsimuste teemade nimekiri

Anonüümne (06.04.2024 10:55):
Kuidas töötavad SQLis tingimused IN ja NOT IN?
Vastus (06.04.2024 11:11):

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 vastust:

Keskmine hinne : Pole veel hinnanguid!