Subužklausa yra užklausa, įdėta į kitą užklausą — naudojama WHERE, FROM, SELECT arba su EXISTS. Ji leidžia naudoti vienos užklauso rezultatą kitoje užklausoje, suteikdama galimybę atlikti kompleksą filtravimą ir skaičiavimus.
Subužklausa yra užklausa, įdėta į kitą užklausą — naudojama WHERE, FROM, SELECT arba su EXISTS. Ji leidžia naudoti vienos užklauso rezultatą kitoje užklausoje, suteikdama galimybę atlikti kompleksą filtravimą ir skaičiavimus.
-- 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
Subužklausa WHERE teikia reikšmes, pagal kurias filtruoti — sąrašą (su IN) arba vieną reikšmę (su palyginimo operatoriais).
-- 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)
);
Susijusi subužklausa nukreipia į išorinę užklausą — ji vykdoma kartą kiekvienai išorinės eilutei (potencialiai lėčiau). Nesusijusi subužklausa vykdoma vieną kartą.
-- 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 patikrina, ar subužklausa grąžina bet kokias eilutes — dažnai efektyviau nei IN egzistencijos patikrinimams (gali sustoti pirmame sutapime).
-- 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.
Subužklausos yra svarbi SQL technika kompleksiam užklausimui — vienos užklauso rezultato naudojimas kitoje užklausoje suteikia galimybę atlikti filtravimą ir skaičiavimus, kurių paprasta užklausa negali išreikšti, todėl jų supratimas yra vertingas tinklamų užklausoms rašyti.
Žinoti formas — subužklausos WHERE (filtravimas pagal sąrašą su IN arba vieną reikšmę su palyginimais), susijusios subužklausos (nukreipiant į išorinę užklausą, vykdant kartą per eilutę), EXISTS (efektyvūs egzistencijos patikrinimas) ir subužklausos FROM (išvestinės lentelės) — apima bendruosius šablonų variantus kompleksinei logiikai išreikšti.
Suvokti skirtumą tarp susijusių ir nesusijusių subužklausų yra svarbu dėl našumo (susijusios subužklausos vykdomos kartą per kiekvieną išorinę eilutę ir gali būti lėtos).
Tolygiai vertinga yra žinoti ryšį su JOINs ir CTEs: daugelį subužklausų galima perrašyti kaip JOINs (dažnai efektyviau ir lengviau skaityti) arba CTEs (puikiau sudėtingiems atvejams), todėl suprasti, kada naudoti kiekvieną — subužklausos filtravimui/agregavimui patikslinti, JOINs duomenims sujungti — yra praktinis įgūdis.
Kadangi realaus pasaulio užklausos dažnai reikalauja įdėjimo (filtravimo pagal susumuotus rezultatus, egzistencijos patikrinimu, palyginimo su apskaičiuotomis reikšmėmis) ir kadangi subužklausų supratimas, jų našumo charakteristikos (ypač susijusios) ir ryšys su JOINs/CTEs yra svarbus efektyviosu, greikiems kompleksinėms užklausoms rašyti, subužklausų įvaldymas yra vertingas, dažnai taikomas žinojimas SQL srityje, viršijantis bazinį užklausimą, ir dažnas pokalbio klausimas, kuris parodo sugebėjimą išreikšti kompleksias duomenų reikalavimus.