Podzapytanie to zapytanie zagnieżdżone wewnątrz innego zapytania — używane w WHERE, FROM, SELECT lub z EXISTS. Pozwala na wykorzystanie wyniku jednego zapytania wewnątrz innego, umożliwiając złożone filtrowanie i obliczenia.
Podzapytanie to zapytanie zagnieżdżone wewnątrz innego zapytania — używane w WHERE, FROM, SELECT lub z EXISTS. Pozwala na wykorzystanie wyniku jednego zapytania wewnątrz innego, umożliwiając złożone filtrowanie i obliczenia.
-- find users who have placed an order (their id is in the orders table)
SELECT name FROM users
WHERE id IN (SELECT user_id FROM orders); -- the subquery returns a list of user_ids
-- find products more expensive than the average
SELECT name, price FROM products
WHERE price > (SELECT AVG(price) FROM products); -- subquery returns a single value
Podzapytanie w WHERE dostarcza wartości do filtrowania — listę (z IN) lub pojedynczą wartość (z operatorami porównania).
-- for each user, find those with above-average orders FOR THEIR COUNTRY
SELECT name FROM users u
WHERE order_count > (
SELECT AVG(order_count) FROM users
WHERE country = u.country -- references the OUTER query's row (correlated)
);
Skorelowane podzapytanie odwołuje się do zapytania zewnętrznego — wykonuje się raz na każdy wiersz zapytania zewnętrznego (potencjalnie wolniej). Nieskorелowane podzapytanie wykonuje się raz.
-- users who have at least one order (often more efficient than IN)
SELECT name FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id -- just checks existence
);
EXISTS sprawdza, czy podzapytanie zwraca jakiekolwiek wiersze — często bardziej efektywne niż IN do sprawdzenia istnienia (może zatrzymać się na pierwszym dopasowaniu).
-- use a subquery result as a table
SELECT country, avg_age FROM (
SELECT country, AVG(age) AS avg_age FROM users GROUP BY country
) AS country_stats
WHERE avg_age > 30;
Many subqueries can be rewritten as JOINs (often more efficient/readable).
WHERE id IN (SELECT ...) → can often be a JOIN
Use subqueries for clarity in filtering/aggregation; JOINs for combining data.
CTEs (WITH) are often a cleaner alternative to complex nested subqueries.
Podzapytania są ważną techniką SQL do złożonych zapytań — wykorzystanie wyniku jednego zapytania wewnątrz innego umożliwia filtrowanie i obliczenia, które proste zapytania nie mogą wyrazić, dlatego zrozumienie ich jest wartościowe przy pisaniu rzeczywistych zapytań.
Znajomość form — podzapytań w WHERE (filtrowanie listą z IN lub pojedynczą wartością z porównaniami), podzapytań skorelowanych (odwołujące się do zapytania zewnętrznego, wykonujące się na wiersz), EXISTS (efektywne sprawdzenia istnienia) oraz podzapytań w FROM (tabele pochodne) — obejmuje typowe wzorce do wyrażania złożonej logiki.
Zrozumienie rozróżnienia między podzapytaniami skorelowanymi i nieskorелowanymi jest ważne dla wydajności (skorelowane podzapytania wykonują się raz na każdy wiersz zewnętrzny i mogą być wolne).
Również wartościowa jest znajomość związku z JOINami i CTEs: wiele podzapytań można przepisać jako JOINy (często bardziej efektywne i czytelne) lub CTEs (czystsze w złożonych przypadkach), dlatego zrozumienie, kiedy używać każdego — podzapytań do jasności filtrowania/agregacji, JOINów do łączenia danych — jest praktyczną umiejętnością.
Ponieważ rzeczywiste zapytania Often wymagają zagnieżdżenia (filtrowanie wynikami zagregowanymi, sprawdzenia istnienia, porównywanie do obliczonych wartości), a ponieważ zrozumienie podzapytań, ich charakterystyk wydajnościowych (zwłaszcza skorelowanych) i ich związku z JOINami/CTEs jest ważne dla pisania efektywnych, wydajnych złożonych zapytań, opanowanie podzapytań jest wartościową, często stosowaną wiedzą do SQL poza podstawowymi zapytaniami i częstym tematem rozmów o pracę, który demonstruje zdolność do wyrażania złożonych wymagań danych.