Najgłębszy zaułek Labiryntu to operatory EXISTS i NOT EXISTS. Nie interesuje ich, ile wierszy zwróci podzapytanie ani jakie mają wartości - pytają tylko: czy w ogóle coś istnieje?
EXISTS zwraca prawdę, gdy podzapytanie zwróci co najmniej jeden wiersz:1SELECT imie, nazwisko
2FROM autorzy
3WHERE EXISTS (
4 SELECT 1 FROM ksiazki WHERE ksiazki.autor_id = autorzy.id
5);To zapytanie zwróci autorów, którzy mają przynajmniej jedną książkę. Zauważ
SELECT 1 - przy EXISTS nie liczy się, co wybieramy, bo operator patrzy tylko, czy jakiś wiersz w ogóle się pojawi.NOT EXISTS jest odwrotnością - prawda, gdy podzapytanie nic nie zwróci:1SELECT imie, nazwisko
2FROM autorzy
3WHERE NOT EXISTS (
4 SELECT 1 FROM ksiazki WHERE ksiazki.autor_id = autorzy.id
5);Tak odnajdziemy "milczących" twórców - autorów, po których nie został w Bibliotece żaden zwój.
Zwróć uwagę na warunek
ksiazki.autor_id = autorzy.id. EXISTS niemal zawsze współpracuje z podzapytaniem skorelowanym - dla każdego autora z zewnątrz sprawdza, czy istnieje powiązany wiersz wewnątrz. Często działa szybciej niż IN, bo Biblioteka może przerwać poszukiwania, gdy tylko znajdzie pierwszy pasujący zwój.@name