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ł.