Operator EXISTS
W odniesieniu do podzapytań skorelowanych możliwe jest także zastosowanie specjalnego operatora o nazwie EXISTS. Operator ten pozwala ustalić, czy pożądane przez nas dane znajdują się w wyniku podzapytania skorelowanego. Powiedzmy, że chcemy dowiedzieć się, którzy użytkownicy dokonali jakichkolwiek transakcji. Jednym ze sposobów realizacji takiego wymagania jest zbudowanie następującej instrukcji z użyciem operatora EXISTS:
SELECT
NazwaUżytkownika as 'Nazwa użytkownika'
FROM Użytkownicy
WHERE EXISTS
(SELECT *
FROM Transakcje
WHERE Użytkownicy.IDUżytkownika = Transakcje.IDUżytkownika)
Zwrócony wynik to:
Nazwa użytkownika |
Cecylia Romanowska |
Elżbieta Borecka |
Romuald Gawliński |
Podzapytanie w powyższym zapytaniu jest podzapytaniem skorelowanym. Nie może bowiem zostać wykonane jako odrębna instrukcja SELECT, gdyż jest powiązane z zewnętrznym zapytaniem. Słowo kluczowe EXISTS w powyższej instrukcji w odniesieniu do podzapytania zweryfikuje jego wynik jako prawdziwy, jeśli instrukcja SELECT w podzapytaniu skorelowanym zwróci jakiekolwiek dane. Zauważ, że podzapytanie wybiera wszystkie kolumny (SELECT *). Ponieważ nie ma znaczenia, jakie kolumny są wybierane w podzapytaniu, używamy symbolu gwiazdki, aby zwrócone zostały wszystkie kolumny. Interesuje nas natomiast to, czy podzapytanie zwraca jakiekolwiek dane. W wyniku otrzymujemy zatem listę wszystkich użytkowników oprócz Anny Wodeckiej, która nie dokonała żadnych transakcji.
Tak jak w dotychczas omawianych przypadkach, tę samą logikę, zawartą w powyższej instrukcji, można również wyrazić w inny sposób. Poniżej znajduje się instrukcja, w której razem z podzapytaniem zastosowano operator IN. Zwraca ona te same wyniki co zapytanie powyżej.
SELECT
NazwaUżytkownika AS 'Nazwa użytkownika'
FROM Użytkownicy
WHERE IDUżytkownika IN
(SELECT IDUżytkownika
FROM Transakcje)
Składnia tej instrukcji wydaje się być mniej skomplikowana. Te same dane otrzymamy również, budując następującą instrukcję niezawierającą podzapytania:
SELECT
NazwaUżytkownika AS 'Nazwa użytkownika'
FROM Użytkownicy
INNER JOIN Transakcje
ON Użytkownicy.IDUżytkownika = Transakcje.IDUżytkownika
GROUP BY NazwaUżytkownika
W powyższym zapytaniu zastosowano klauzulę INNER JOIN, dzięki której wybierani są wyłącznie użytkownicy istniejący również w tabeli Transakcje. Zauważ ponadto, że konieczne było użycie w tej instrukcji klauzuli GROUP BY, aby w wyniku pojawił się tylko jeden wiersz dla każdego użytkownika.
Język SQL. Przyjazny podręcznik. Wydanie II Autor: Larry Rockoff Wydawnictwo: Helion