Subquery je dotaz vnořený v jiném dotazu — používá se v WHERE, FROM, SELECT nebo s EXISTS. Umožňuje vám použít výsledek jednoho dotazu v jiném, což umožňuje komplexní filtrování a výpočty.
Subquery je dotaz vnořený v jiném dotazu — používá se v WHERE, FROM, SELECT nebo s EXISTS. Umožňuje vám použít výsledek jednoho dotazu v jiném, což umožňuje komplexní filtrování a výpočty.
-- 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
Subquery v WHERE poskytuje hodnoty, podle kterých se filtruje — seznam (s IN) nebo jednu hodnotu (s operátory porovnání).
-- 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)
);
Korelovaná subquery odkazuje na vnější dotaz — spouští se jednou za každý řádek vnějšího dotazu (potenciálně pomalejší). Nekorelovaná subquery se spouští jednou.
-- 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 kontroluje, zda subquery vrátí nějaké řádky — často je efektivnější než IN pro kontrolu existence (může se zastavit na prvním shodě).
-- 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.
Subquery jsou důležitou SQL technikou pro komplexní dotazování — použití výsledku jednoho dotazu v jiném umožňuje filtrování a výpočty, které jednoduché dotazy nemohou vyjádřit, takže jejich porozumění je cenné pro psaní reálných dotazů.
Znalost jednotlivých forem — subquery v WHERE (filtrování podle seznamu s IN nebo jedné hodnoty s porovnáním), korelované subquery (odkazování na vnější dotaz, spouštění za řádek), EXISTS (efektivní kontrola existence) a subquery v FROM (odvozené tabulky) — pokrývá běžné vzory pro vyjádření komplexní logiky.
Porozumění rozdílu mezi korelovanými a nekorelovanými subquery je důležité pro výkon (korelované subquery se spouštějí jednou za každý řádek vnějšího dotazu a mohou být pomalé).
Rovnocenně cenné je znalost vztahu k JOINům a CTE: mnohé subquery lze přepsat jako JOINy (často efektivnější a čitelnější) nebo CTE (čistší pro komplexní případy), takže pochopení, kdy použít každý přístup — subquery pro jasnost filtrování/agregace, JOINy pro kombinování dat — je praktická dovednost.
Protože reálné dotazy často vyžadují vnořování (filtrování podle agregovaných výsledků, kontrolu existence, porovnání s vypočítanými hodnotami) a protože porozumění subquery, jejich charakteristikám výkonu (zejména korelovaným) a jejich vztahu k JOINům/CTE je důležité pro psaní efektivních a komplexních dotazů, zvládnutí subquery je cenné a často používané znalosti pro SQL mimo základní dotazování a běžné téma v rozhovorech, které ukazuje schopnost vyjádřit komplexní datové požadavky.