SQL – pokročilé dotazy
V dnešním desátém článku o SQL si prohloubíme znalosti o vnořování SQL dotazů, zejména o použití mocného operátoru EXISTS a přejdeme tak ke tvorbě pokročilých dotazů. K pochopení všech příkladů uváděných v tomto článku, je potřeba mít znalosti v rozsahu všech předchozích dílů. V závěru článku je pro vás připravena malá prověrka znalostí.
Operátor EXISTS
V minulém díle jsem se bavili o jednoduchých vnořených SQL dotazech, pomocí nichž jsme si nejprve zjistili nějakou informaci z databáze a na základě jí jsme pak hledali informace další. Charakteristické pro tyto vnořené dotazy bylo, že vnořený dotaz zapsaný v příkazu SELECT se vyhodnotil pouze jednou a server si vrácené hodnoty zapamatoval. Ke čtveřici operátorů pro vnořené SQL dotazy si přidáme ještě jeden, poslední. Je jím operátor EXISTS. Tento operátor nám vrací pravdivostní hodnotu TRUE nebo FALSE na základě toho, zdali vnořený SQL dotaz vrací nějakou hodnotu. Syntaxe se od předchozích operátorů se trochu liší:
|
To znamená, že jej neaplikujeme na žádný sloupec, ani hodnotu. Pakliže vnořený SQL dotaz vrátí alespoň jeden řádek, operátor EXISTS nám vrátí TRUE. Má ještě jednu zvláštnost. Vnořený SQL dotaz v argumentu operátoru EXISTS se vyhodnocuje zvlášť pro každý řádek. Proto je potřeba uvážit použití operátoru EXISTS, neboť při špatně navržených dotazech by mohlo dojít k relativně velkému zatížení SQL serveru.
Zatímco u ostatních operátorů pro vnořené SQL dotazy jsme nebyli nuceni používat aliasy na jména tabulek, u operátoru EXISTS to bude téměř nutností. To vyplývá z toho, že vnořený dotaz se vyhodnocuje pro každý řádek zvlášť a tam se nám nesmí dostat do kolize dva tytéž názvy tabulek. Ale dost bylo teorie, pojďme se podívat na nějaké příklady.
Základní použití operátoru EXISTS
Vezměme si náš databázový systém knihovny z 5. dílu a představme si následující situaci. Záznamy o knihách nám do systému zadávají naše sekretářky a my jako vedoucí si chceme zkontrolovat, zdali u každé knihy jsou zadáni autoři. Chceme tedy dotaz na seznam knih, u kterých nemáme zadaného žádného autora:
|
Všimněte si, že jsem v příkladu nepoužil aliasů tabulek – jsou samozřejmě zbytečné, neboť ke kolizi jmen tabulek nám zde nedochází. Pár slov k tomuto příkladu, jak pracuje. Zaprvé je nutné si uvědomit, jakou vypovídací schopnost má tabulka NAPSANÉ_KNIHY. V našem případě velmi klíčovou, neboť existence alespoň jednoho záznamu v této tabulce nám potvrzuje, že k dané knize je přiřazen alespoň jeden autor. To znamená, že pokud sekretářka do našeho systému zapomene uvést autora k dané knize, tak se to projeví neexistencí záznamu v tabulce NAPSANÉ_KNIHY pro hodnotu KNIHA_ID dané knihy.
Vnější SELECT by nám vrátil všechny řádky z tabulky KNIHA. Než je nám ale každý řádek vrácen, operátorem EXISTS si server zjistí, zdali ke konkrétnímu řádku (resp. ID knihy) existuje záznam v tabulce NAPSANÉ_KNIHY. Pokud ne, vnořený SELECT nevrátí žádnou hodnotu a tedy EXISTS se vyhodnotí na FALSE, následne NOT EXISTS na TRUE a tento řádek je nám ve výpisu vrácen.
Příklad 1
Vzpomínáte si na příklad v 8. díle, kde jsem měli dotaz: „vypište seznam knih, kteří napsali autoři Jan Novák a Petr Nový“? V závorce jsem uváděl větu „a možná někdo další, ale to už nás nezajímá“. Nyní máme situaci jinou. Chceme dotaz na seznam knih, kteří napsali právě autoři Jan Novák a Petr Nový. Připomeňme si, jak vypadal náš dotaz, když jsme uvážili, že nějakou knihu mohli kromě těchto dvou, napsat ještě další autoři:
|
Zápis SQL dotazu jsem uvedl z důvodu následného srovnání. Co znamená slovní vyjádření „právě autoři Jan Novák a Petr Nový“. Vyjděme z uvedeného dotazu. V řeči databáze to znamená, že budeme opět dělat průnik, kde nejprve sesbíráme knihy autora Jana Nováka a pak knihy Petra Nového, ale v každé větvi tohoto složeného SQL dotazu budeme testovat podmínku, že počet autorů je roven právě dvěma. V průniku nám pak zůstanou pouze ty knihy, které napsali tito dva zmínění autoři a nikdo jiný. SQL dotaz vypadá tedy následovně:
|
Pěkné, že? Tento dotaz je značně netriviální, neboť jsme zde využili skládání a vnořování dotazů, spolu s agregačními funkcemi. Možná se ptáte, co znamená SELECT 1. Protože se operátorem EXISTS ptáme pouze na existenci alespoň jednoho záznamu, je jedno, jaké konkrétní hodnoty nám vnořený SELECT vrací. A tedy, pokud má něco vracet, nechť je to číslo 1. Komu by tam jednička vadila, může uvést libovolný sloupec z tabulek, které jsou v subdotazu uvedeny, v našem případě např. PUBLIKACE_ID.
Příklad 2
Na závěr uvedu ještě jeden příklad, už bez podrobnějších komentářů, k samostatnému prostudování.
Vypište jména autorů, kteří samostatně (bez pomocí jiných) napsali alespoň 5 knih:
|
Zadání příkladů – cvičení
Pro ty, kteří by si chtěli procvičit sestavování složitějších SQL dotazů, je určeno následující zadání několika příkladů.
- a) Vypište seznam knih, které napsal pan Horáček samostatně (tj. ne jako spoluautor).
- b) Vypište seznam knih, které byly vydány v devadesátých letech, a to alespoň třemi různými nakladatelstvími.
- c) Formulujte slovní dotaz, na nějž odpověď obdržíme následujícím SELECTem:
|
Jejich řešení se dozvíte na začátku příštího dílu. Mezitím mi ovšem můžete svá řešení posílat e-mailem a já je budu s vámi konzultovat. (Použité tabulky jsou definovány v 5. díle seriálu o SQL.)
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.
Mohlo by vás také zajímat
-
Vlastní web: Jak nainstalovat WordPress?
24. června 2024 -
AI v programování: Jak používat GitHub Copilot (část 2)
19. února 2024 -
Aukce CZ domén: Jak vydražit expirovanou CZ doménu?
12. června 2024 -
Jak si vyzkoušet Apple Intelligence v EU
2. srpna 2024
Nejnovější
-
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024 -
OpenAI představilo novou funkci ChatGPT Search
6. listopadu 2024
Ondřej Merta
Srp 5, 2014 v 11:07Nějak si nedovedu v praxi představit takhle složitý dotaz. Jistě funguje to, ale používá se to?