/Podzapytania

Z Brain-wiki

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.