Poddotazy jazyka SQL

Poddotaz je příkaz SELECT vnořený v příkazu SELECT, SELECT...INTO, INSERT...INTO, DELETE nebo UPDATE nebo v jiném poddotazu.

Syntaxe

Poddotaz je možné vytvořit pomocí tří tvarů syntaxe:

porovnání [ANY | ALL | SOME] (příkaz_sql)

výraz [NOT] IN (příkaz_sql)

[NOT] EXISTS (příkaz_sql)

Poddotaz má následující části:

Část

Popis

porovnání

Výraz a operátor porovnání, který porovnává výraz s výsledky poddotazu.

výraz

Výraz hledaný ve výsledné sadě poddotazu.

příkaz_sql

Příkaz SELECT, jehož formát a pravidla odpovídají ostatním příkazům SELECT. Příkaz musí být uzavřen v závorkách.


Poznámky

Poddotaz je možné použít namísto výrazu v seznamu polí příkazu SELECT nebo v klauzulích WHERE a HAVING. V poddotazu se příkaz SELECT používá pro získání sady jedné nebo několika určitých hodnot použitých při vyhodnocení výrazu v klauzuli WHERE či HAVING.

Chcete-li v hlavním dotazu načíst záznamy vyhovující porovnání s libovolným záznamem získaným v poddotazu, použijte predikát ANY nebo SOME (predikáty jsou synonyma). V následujícím příkladu jsou vráceny všechny produkty, jejichž jednotková cena je vyšší než cena produktu prodaného se slevou 25 procent a větší:

SELECT * FROM Výrobky WHERE CenaZaKus > ANY (SELECT CenaZaKus FROM RozpisObjednávek WHERE Sleva >= .25);

Chcete-li v hlavním dotazu načíst jen záznamy vyhovující porovnání se všemi záznamy získanými v poddotazu, použijte predikát ALL. Pokud v předchozím příkladu zaměníte predikát ANY za predikát ALL, budou vráceny pouze produkty, jejichž jednotková cena je vyšší než cena všech produktů prodaných se slevou 25 procent a větší. Tento predikát je více omezující.

Chcete-li v hlavním dotazu načíst jen záznamy, pro něž mezi záznamy získanými v poddotazu existuje záznam obsahující stejné hodnoty, použijte predikát IN. V následujícím příkladu jsou vráceny všechny produkty se slevou 25 procent a vyšší:

SELECT * FROM Výrobky WHERE KódProduktu IN (SELECT KódProduktu FROM RozpisObjednávek WHERE Sleva >= .25);

Predikát NOT IN můžete naopak použít, chcete-li v hlavním dotazu načíst záznamy, pro něž mezi záznamy získanými v poddotazu neexistuje záznam obsahující stejné hodnoty.

Chcete-li v logických porovnáních určit, zda poddotaz vrátí nějaké záznamy, použijte predikát EXISTS (případně s nepovinným vyhrazeným slovem NOT).

V poddotazu je možné použít Alias (SQL) tabulek odkazující na tabulky uvedené v klauzuli FROM mimo poddotaz. V následujícím příkladu jsou vrácena jména zaměstnanců, jejichž platy jsou větší nebo rovny průměrnému platu všech zaměstnanců se stejnou funkcí. Tabulce Zaměstnanci je přiřazen alias „T1“:

SELECT Příjmení, Jméno, Funkce, ZákladníPlat FROM Zaměstnanci AS T1 WHERE ZákladníPlat >= (SELECT Avg(ZákladníPlat) FROM Zaměstnanci WHERE T1.Title = Zaměstnanci.Funkce) Order by Funkce;

V předchozím příkladu je Rezervované slovo AS nepovinné.

Použít poddotazy je možné i v Křížový dotaz, ovšem pouze jako predikáty (použité v klauzuli WHERE). V křížových dotazech nejsou povoleny poddotazy ve výstupu (uvedené v seznamu SELECT).



Sdílení Facebook Facebook Twitter Twitter E-mail E-mail

Byly tyto informace užitečné?

Výborně! Je ještě něco dalšího, co byste nám chtěli dát vědět?

Jak bychom ho mohli vylepšit?

Děkujeme vám za zpětnou vazbu.

×