Podupiti je upit ugniježđen unutar drugog upita — koristi se u WHERE, FROM, SELECT ili sa EXISTS. Omogućava ti korištenje rezultata jednog upita unutar drugog, omogućavajući složeno filtriranje i računanja.
Podupiti je upit ugniježđen unutar drugog upita — koristi se u WHERE, FROM, SELECT ili sa EXISTS. Omogućava ti korištenje rezultata jednog upita unutar drugog, omogućavajući složeno filtriranje i računanja.
-- 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
Podupiti u WHERE pruža vrijednosti za filtriranje — popis (sa IN) ili jednu vrijednost (sa operatorima usporedbe).
-- 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)
);
Korelirani podupiti referenca vanjski upiti — pokreće se jednom po vanjskom redu (potencijalno sporije). Nekoreliran podupiti se pokreće jednom.
-- 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 provjerava vraća li podupiti bilo koje redove — često učinkovitije od IN za provjere postojanja (može se zaustaviti pri prvoj podudarnosti).
-- 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.
Podupiti su važna SQL tehnika za složene upite — korištenje rezultata jednog upita unutar drugog omogućava filtriranje i računanja koje jednostavni upiti ne mogu izraziti, pa je razumijevanje njih vrijedne za pisanje upita u stvarnom svijetu.
Znanje oblika — podupiti u WHERE (filtriranje po popisu sa IN ili jednom vrijednosti sa usporedbe), korelirani podupiti (referenca vanjski upiti, pokretanje po redu), EXISTS (učinkovite provjere postojanja) i podupiti u FROM (izvedene tablice) — pokriva uobičajene obrasce za izražavanje složene logike.
Razumijevanje razlike između koreliranih i nekoreliranih podupita je važno za performanse (korelirani podupiti se pokraću jednom po vanjskom redu i mogu biti spori).
Jednako vrijedna je i znanja o odnosu prema JOIN-ovima i CTE-ima: mnogi podupiti mogu se prepisati kao JOIN-ovi (često učinkovitiji i čitljiviji) ili CTE-evi (čišće za složene slučajeve), pa razumijevanje kada koristiti svaki — podupiti za jasnoću filtriranja/agregacije, JOIN-ovi za kombiniranje podataka — je praktična vještina.
Budući da upiti u stvarnom svijetu često zahtijevaju ugniježđivanje (filtriranje po agregirani rezultatima, provjere postojanja, usporedba sa izračunatim vrijednostima), i budući da je razumijevanje podupita, njihove karakteristike performansi (posebno korelirani), i njihov odnos prema JOIN-ovima/CTE-ima važno za pisanje učinkovitih, učinkovitih složenih upita, savladavanje podupita je vrijedna, često primijenjena znanja za SQL izvan osnovnog upitavanja i česta tema intervjua koja pokazuje mogućnost izražavanja složenih zahtjeva podataka.