Co zrobić, gdy podzapytanie zwraca wiele wierszy? Wtedy nie porównamy ich pojedynczym
=. Z pomocą przychodzi operator IN, który sprawdza, czy wartość znajduje się na liście zwróconej przez podzapytanie.1SELECT tytul
2FROM ksiazki
3WHERE autor_id IN (SELECT id FROM autorzy WHERE kraj = 'Polska');Najpierw podzapytanie zwraca listę
id wszystkich autorów z Polski. Następnie zapytanie zewnętrzne wybiera te książki, których autor_id znajduje się na tej liście. W ten sposób jednym zapytaniem łączymy dwa regały: ksiazki i autorzy.Bez podzapytania musielibyśmy najpierw spisać
id polskich autorów, a potem ręcznie wkleić je do zapytania:1SELECT tytul FROM ksiazki WHERE autor_id IN (1, 4, 7);Podzapytanie robi to za nas - i samo aktualizuje listę, gdy w Bibliotece przybywa autorów.
Operator
NOT IN działa odwrotnie - wybiera wiersze, których wartość nie znajduje się na liście:1SELECT tytul
2FROM ksiazki
3WHERE kategoria_id NOT IN (SELECT id FROM kategorie WHERE nazwa = 'Poezja');Tak odnajdziemy wszystkie księgi spoza działu poezji.
@name