O subcerere este o cerere imbricată în alta — folosită în WHERE, FROM, SELECT sau cu EXISTS. Îți permite să folosești rezultatul unei cereri în alta, permițând filtrare complexă și calcule.
O subcerere este o cerere imbricată în alta — folosită în WHERE, FROM, SELECT sau cu EXISTS. Îți permite să folosești rezultatul unei cereri în alta, permițând filtrare complexă și calcule.
-- 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
O subcerere în WHERE oferă valori pentru filtrare — o listă (cu IN) sau o singură valoare (cu operatori de comparație).
-- 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)
);
O subcerere corelată referențiază cererea exterioară — se execută o dată pe fiecare rând exterior (potențial mai lent). O subcerere necorelată se execută o singură dată.
-- 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 verifică dacă o subcerere returnează orice rânduri — adesea mai eficient decât IN pentru verificări de existență (poate opri la prima potrivire).
-- 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.
Subcererile sunt o tehnică SQL importantă pentru interogări complexe — utilizarea rezultatului unei cereri în alta permite filtrare și calcule pe care cererile simple nu le pot exprima, deci înțelegerea lor este valoroasă pentru scrierea de cereri din lumea reală.
Cunoașterea formelor — subcereri în WHERE (filtrare după o listă cu IN sau o singură valoare cu comparații), subcereri corelate (referențiând cererea exterioară, rulând pe fiecare rând), EXISTS (verificări eficiente de existență) și subcereri în FROM (tabele derivate) — acoperă modelele comune pentru exprimarea logicii complexe.
Înțelegerea distincției între subcererile corelate și necorelate este importantă pentru performanță (subcererile corelate se execută o dată pe fiecare rând exterior și pot fi lente).
La fel de valoroasă este cunoașterea relației cu JOINurile și CTE-urile: multe subcereri pot fi rescrise ca JOINuri (adesea mai eficiente și mai citibile) sau CTE-uri (mai curate pentru cazuri complexe), deci înțelegerea când să folosești fiecare — subcereri pentru claritate de filtrare/agregare, JOINuri pentru combinarea datelor — este o abilitate practică.
Deoarece cererile din lumea reală necesită adesea imbricare (filtrare după rezultate agregate, verificări de existență, comparare cu valori calculate), și deoarece înțelegerea subcererilor, a caracteristicilor lor de performanță (mai ales cele corelate) și a relației lor cu JOINurile/CTE-urile este importantă pentru scrierea de cereri complexe eficiente și eficace, stăpânirea subcererilor este cunoștințe valoroase și frecvent aplicate pentru SQL dincolo de interogările de bază și este un subiect frecvent la interviuri care demonstrează capacitatea de a exprima cerințe de date complexe.