Stosowanie podzapytań
Podzapytanie, to nic innego jak zapytanie umieszczone w innym zapytaniu - w takiej sytuacji mamy zagnieżdżenie zapytań.
Podzapytanie podstawowe
Polega na zastosowaniu wyniku jednego zapytania jako danych porównawczych dla drugiego zapytania
Ćwiczenie 4_2_9_1. Wyszukanie w tabeli zamowienia, zamówień o największej wartości
Napierw zajrzyj do tabel bazy. Zastosuj zapytanie SQL:
SELECT klient_id, wartosc
FROM zamowienia
WHERE wartosc = (SELECT MAX(wartosc) FROM zamowienia);
Podzapytanie SELECT MAX(wartosc) FROM zamowienia zwraca wartość maksymalną, która następnie jest wartością porównawczą dla zapytania zewnętrznego. Wyników podzapytań można tak samo stosować w połączeniu zw wszystkimi podstawowymi operatorami porównań. Ponadto istnieją specjalne operatory podzapytań, które zostały omówione dalej.
Podzapytania i operatory
Polega na zastosowaniu wyniku jednego zapytania jako danych porównawczych dla drugiego zapytania
| Nazwa | Przykład | Opis |
|---|---|---|
ANY
|
SELECT k1 FROM t1
|
Zwraca true, jeżeli porównanie będzie miało wartość true dla dowolnego wiersza z podzapytania
|
IN
|
SELECT k1 FROM t1
|
Równoważnik konstrukcjiSELECT k1 FROM t1
|
SOME
|
SELECT k1 FROM t1
|
Alias dla ANY. Wkraczamy w niuanse języka angielskiego. Widocznie niektórzy wolą stosować ANY, a niektórzy SOME
|
ALL
|
SELECT k1 FROM t1
|
Zwraca true, jeżeli porównanie będzie miało wartość true dla wszystkich wierszy z podzapytania.
|
Chyba nie muszę zwracać uwagę na fakt, że w pokazanych przykładach, zastosowano literkę k od kolumny, natomiast t od tabeli.
Podzapytania skorelowane
W tym rodzaju podzapytań, elementy z zapytania zewnętrznego można używać w zapytaniu wewnętrznym.
Ćwiczenie 4_2_9_2. Wyszukanie książek, które nigdy nie zostały zamówione
Zastosuj zapytanie SQL:
SELECT isbn, tytul
FROM ksiazki
WHERE NOT EXISTS
(SELECT * FROM ksiazki_zamowione WHERE ksiazki_zamowione.isbn=ksiazki.isbn);
Zastosowaliśmy w tym przykładzie jeszcze jeden operator podzapytań EXISTS, który jest stosowany zazwyczaj w podzapytaniach skorelowanych. W wewnętrznym zapytaniu na liście FROM, wyszczególniona została tylko jedna tabela ksiazki_zamowione, ale odwołujemy się w tym zapytaniu także do kolumny ksiazki.isbn, tak więc zapytanie wewnętrzne odwołuje się do danych z zapytania zewnętrznego. Możemy teraz zdefiniować podzapytanie skorelowane - jest to zapytanie, które wyszukuje wiersze wewnętrzne pasujące (lub jak w naszym przykładzie niepasujace) do wierszy zewnętrznych. Operator EXISTS zwróci wartość true, jeżeli w podzapytaniu znajduje się co najmniej jeden pasujący wiersz, natomiast NOT EXISTS, zróci true, jeżeli żaden wiersz z podzapytania nie będzie pasował.