Një nënpyetje është një pyetje e ngulitur brenda një pyetjeje tjetër — e përdorur në WHERE, FROM, SELECT, ose me EXISTS. Ajo ju lejon të përdorni rezultatin e një pyetjeje brenda një tjetri, duke mundësuar filtrimin kompleks dhe llogaritjet.
Një nënpyetje është një pyetje e ngulitur brenda një pyetjeje tjetër — e përdorur në WHERE, FROM, SELECT, ose me EXISTS. Ajo ju lejon të përdorni rezultatin e një pyetjeje brenda një tjetri, duke mundësuar filtrimin kompleks dhe llogaritjet.
-- 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
Një nënpyetje në WHERE ofron vlera për të filtruar — një listë (me IN) ose një vlerë të vetme (me operatorë krahasimi).
-- 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)
);
Një nënpyetje e ndërlidhur referon pyetjen e jashtme — ajo ekzekutohet një herë për çdo rresht të jashtëm (potencialisht më ngadalë). Një nënpyetje e pakorreluar ekzekutohet një herë.
-- 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 kontrollon nëse një nënpyetje kthen ndonjë rresht — shpesh më efikase se IN për kontrollet e ekzistencës (mund të ndalojë në përputhjen e parë).
-- 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.
Nënpyetjet janë një teknikë e rëndësishme SQL për pyetjet komplekse — përdorimi i rezultatit të një pyetjeje brenda një tjetri mundëson filtrimin dhe llogaritjet që pyetjet e thjeshta nuk mund të shprehni, kështu që kuptimi i tyre është i vlefshëm për shkrimin e pyetjeve në botën reale.
Dija e formave — nënpyetjet në WHERE (filtrimi sipas një liste me IN ose një vlere të vetme me krahasime), nënpyetjet e ndërlidhura (referimi i pyetjes së jashtme, ekzekutimi për rresht), EXISTS (kontrollet efikase të ekzistencës), dhe nënpyetjet në FROM (tabelat e prejardhura) — mbulon modelet e zakonshme për shprehjen e logjikës komplekse.
Kuptimi i dallimit midis nënpyetjeve të ndërlidhura dhe atyre të pakorrelura është i rëndësishëm për performancën (nënpyetjet e ndërlidhura ekzekutohen një herë për çdo rresht të jashtëm dhe mund të jenë të ngadalshme).
Njësoj i vlefshëm është kuptimi i marrëdhënies me JOINat dhe CTErat: shumë nënpyetje mund të rishkruhen si JOINa (shpesh më efikase dhe më të lexueshme) ose CTEra (më të pastër për rastet komplekse), kështu që kuptimi kur të përdor secilën — nënpyetjet për qartësi filtrimi/agregimi, JOINat për kombinimin e të dhënave — është një aftësi praktike.
Meqenëse pyetjet në botën reale shpesh kërkojnë ngulimet (filtrimin sipas rezultateve të agregimit, kontrollet e ekzistencës, krahasimin me vlerat e llogarituara), dhe meqenëse kuptimi i nënpyetjeve, karakteristikave të tyre të performancës (veçanërisht ato të ndërlidhura), dhe marrëdhënies të tyre me JOINat/CTErat është i rëndësishëm për shkrimin e pyetjeve efektive dhe efikase komplekse, zotërimi i nënpyetjeve është njohuri e vlefshme dhe e aplikuar shpesh për SQL përtej pyetjeve bazike dhe një temë e zakonshme në intervista që demonstron aftësinë për të shprehur kërkesa komplekse të të dhënave.