|
![]() | Výběr úseku záznamů | ![]() | Dotazy | Operace nad daty z dotazu | ![]() |
SQL umožňuje, aby součást obecného výrazu resp. zobecněné tabulky tvořil další dotazový výraz, nazývaný zde zjednodušeně subdotaz. Subdotaz musí být uzavřen v kulatých závorkách. Jako subdotaz může stát kompletní dotazový výraz včetně dalších vnořených subdotazů. Uvnitř subdotazů lze použít i klauzuli LIMIT (obvykle spolu s ORDER BY).
Subdotazy lze rozlišovat podle různých kritérií. Např. podle počtu řádků a sloupců se rozlišují na tři druhy:
Příklad 1:
Vybrat firmy, které mají faktury za více než 10000 Kč (subdotaz v podmínce)
SELECT A.nazev
FROM Firmy A
WHERE 10000 < (SELECT SUM(B.castka)
FROM FAKTURY B
WHERE A.cislo=B.firma)
Příklad 2:
Vybrat faktury, které jsou větší než průměrné (subdotaz v podmínce)
SELECT *
FROM Faktury
WHERE castka > (SELECT AVG(castka) FROM Faktury)
Příklad 3:
Vybrat firmy, které mají alespoň jednu fakturu větší než 5000 (subdotaz jakožto výraz)
SELECT DISTINCT (SELECT nazev
FROM Firmy
WHERE Firmy.cislo=Faktury.firma) AS Nazev
FROM Faktury
WHERE castka > 5000
Příklad 4:
Vybrat faktury firem z Prahy (subdotaz v podmínce)
SELECT Faktury.cislo,Faktury.firma
FROM Faktury
WHERE firma IN (SELECT cislo
FROM Firmy
WHERE mesto LIKE 'Praha%')
Příklad 5:
Vybrat ty zaměstnance, kteří mají plat větší než všichni zaměstnanci z Prahy (subdotaz v podmínce)
SELECT TAB1.jmeno,TAB1.plat
FROM Lidi TAB1
WHERE plat > ALL (SELECT plat
FROM Lidi
WHERE adresa LIKE 'Praha%')
Příklad 6:
Vyberte firmy, které nemají žádné faktury (subdotaz v podmínce)
SELECT nazev
FROM Firmy F
WHERE NOT EXISTS (SELECT * FROM Faktury A
WHERE A.nazev=F.nazev)
Příklad 7:
Vyberte firmy, které mají faktury za více než 10000,- Kč (subdotaz ve FROM)
SELECT nazev, suma
FROM Firmy A JOIN (SELECT firma,SUM(castka) AS suma
FROM Faktury B
GROUP BY B.firma)
ON (A.cislo=B.firma)
WHERE 10000 < suma
Jak je vidět z příkladů, subdotaz v dotazovém výrazu může být použit v části SELECT, FROM i WHERE. Použití subdotazů není omezeno jen na dotazové výrazy, ale jako výraz může být využit v mnoha jiných konstrukcích, jako např.:
IF EXISTS (SELECT admin_enabled FROM System WHERE (admin_name=usr)AND(admin_password=pwd)AND(admin_enabled IS TRUE)) THEN ...
Často se používá ještě jedno dělení subdotazů: ty, které se vyhodnotí jednou (jako příklady 2 nebo 4) a ty, které se vyhodnocují opakovaně (nazývané také Correlated Subqueries, jako příklady 1 nebo 3)
![]() | Výběr úseku záznamů | ![]() | Dotazy | Operace nad daty z dotazu | ![]() |