Używamy cookies, żeby zwiększyć Twoje doświadczenia na stronie
CodeWorlds

EXISTS i NOT EXISTS

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 - czy coś jest?

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 - czego brakuje?

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.

EXISTS to podzapytanie skorelowane

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

Przejdź do CodeWorlds