Lekcje >> Podstawy MySQL
Polimax

Drukarnia w Warszawie realizująca druk wizytówek, plakatów jak również fotoksiążki, fotoobrazy i fotokalendarze - z wysyłką na terenie całego kraju.

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);
Zastosowanie podzapytania podstawowego
Rysunek 4_2_9_1. Zastosowanie podzapytania podstawowego

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

Tabela 4_2_9_1. Operatory podzapytań
Nazwa Przykład Opis
ANY SELECT k1 FROM t1
WHERE k1 >
ANY (SELECT k1 FROM t2)
Zwraca true, jeżeli porównanie będzie miało wartość true dla dowolnego wiersza z podzapytania
IN SELECT k1 FROM t1
WHERE k1 IN
ANY (SELECT k1 FROM t2)
Równoważnik konstrukcji
SELECT k1 FROM t1
WHERE k1 =
ANY (SELECT k1 FROM t2)
SOME SELECT k1 FROM t1
WHERE k1 SOME
(SELECT k1 FROM t2)
Alias dla ANY. Wkraczamy w niuanse języka angielskiego. Widocznie niektórzy wolą stosować ANY, a niektórzy SOME
ALL SELECT k1 FROM t1
WHERE k1 ALL
(SELECT k1 FROM t2)
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);
Zastosowanie podzapytań skorelowanych
Rysunek 4_2_9_2. Zastosowanie podzapytań skorelowanych

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