/Podzapytania
TI:WTBD/Podzapytania
Podzapytania, inaczej -- zagnieżdżone instrukcje SELECT, mają prawo występować w szeregu miejsc:
- w instrukcji INSERT
- INSERT INTO tabela (kol1, kol2, ...) SELECT ... ;
tutaj oczywiście liczba kolumn wyniku SELECT musi się zgadzać z liczbą wstawianych pól. Listę pól można pominąć, wówczas SELECT musi dawać wynik zgodny z definicją tabeli.
- w instrukcji SELECT, w klauzuli FROM elementem złączenia źródłowego może być kolejny SELECT (nawiasy są obowiązkowe):
- SELECT wynik FROM (SELECT ...)
wynik podzapytania jest traktowany tak samo, jak każda tabela źródłowa. Niektóre implementacje SQL wymagają, by podzapytania w klauzuli FROM miały nadane aliasy (nie były anonimowe) -- SQLite tego nie wymaga.
- w wyrażeniach, a więc w definicjach zbiorów wynikowych i w konstrukcji warunków, dozwolone są tzw. podzapytania skalarne, czyli o zbiorze wynikowym składającym się z 1 kolumny. Wartością takiego wyrażenia (podzapytania skalarnego) jest wówczas wartość z pierwszego wiersza wyniku -- ewent. dalsze są ignorowane, lub NULL jeśli zbiór wynikowy jest pusty (SQLite); inne systemy (MySQL) traktują jako błąd, jeśli podzapytanie skalarne użyte w takim kontekście nie zwróci dokładnie jednego wiersza -- należy więc użyć jawnej klauzuli LIMIT w podzapytaniu.
- w warunkach, w połączeniu z operatorem EXISTS:
- SELECT ... WHERE EXISTS (SELECT ...) ... ;
warunek EXISTS jest prawdziwy wtedy i tylko wtedy, gdy zagnieżdżony SELECT zwraca niepusty zbiór wynikowy.
- w warunkach, w połączeniu z operatorem IN:
- SELECT ... WHERE X IN (SELECT ...) ... ;
tutaj dozwolone jest jedynie podzapytanie skalarne, i brane są pod uwagę wszystkie wiersze jego wyniku. Warunek taki jest prawdziwy wtedy, gdy wartość wyrażenia X jest jedną z wartości zwróconych przez zagnieżdżony SELECT. Uwaga: uważać trzeba na sytuację, gdy po jednej lub drugiej stronie operatora IN pojawią się wartości NULL, wynik wtedy może być nieoczywisty.
- Po prawej stronie operatora IN można postawić również jawną listę wyrażeń w postaci (wyr1, wyr2, ...).
Podzapytania zagnieżdżone w instrukcji SELECT mogą być skorelowane -- to znaczy odwoływać się do kolumn złączenia źródłowego zapytania zewnętrznego. Wynik podzapytania skorelowanego musi być obliczony na nowo dla każdego wiersza złączenia źródłowego -- uwaga: to może bardzo istotnie wydłużyć czas wykonania zapytania.