Slide 1: Co jsou vnořené dotazy?
-
SQL dotaz uvnitř jiného dotazu
-
Funguje jako “matrjoška” - dotaz v dotazu
-
Vždy uzavřen v závorkách
-
Synonyma: poddotaz, vnitřní dotaz, subquery
Příklad:
SELECT jmeno FROM zaměstnanci
WHERE plat > (SELECT AVG(plat) FROM zaměstnanci);Slide 2: Kde můžeme vnořené dotazy použít?
-
V WHERE podmínkách
-
V FROM částech
-
Při INSERT/UPDATE/DELETE
-
V SELECT seznamech
Praktické příklady:
sql
Copy
-- WHERE
SELECT * FROM produkty
WHERE cena > (SELECT AVG(cena) FROM produkty);
-- FROM
SELECT * FROM
(SELECT * FROM zakaznici WHERE stat = 'CZ') AS ceski_zakaznici;Slide 3: Omezení vnořených dotazů
-
❌ Nelze použít datové typy ntext/image
-
🔢 Může vracet jen jeden sloupec (pokud není s IN/EXISTS)
-
⚠️ DISTINCT problém s GROUP BY
-
📊 ORDER BY jen s TOP
-
🔄 Zobrazení s poddotazy nelze aktualizovat
Doporučení: Vždy pojmenovávejte sloupce explicitně!
Slide 4: Problémy a nevýhody
-
🐢 Pomalé - špatně využívají indexy
-
💾 Náročné na paměť - vytváří dočasné tabulky
-
🐛 Těžké na ladění - složité identifikovat chyby
-
🤯 Složitost - při vnořování do sebe
Příklad problémového dotazu:
SELECT * FROM tab1
WHERE id IN (SELECT id FROM tab2 WHERE id IN (SELECT...));
--Vícenásobně vnořené IN dotazy jsou problémové, protože výrazně degradují výkon (každé vnoření vytváří dočasnou tabulku) a optimalizátor databáze s nimi špatně pracuje - raději použijte JOIN, který je efektivnější a čitelnější.Slide 5: Kdy použít a kdy se vyhnout?
✅ Použít když:
-
Jednoduché filtry
-
Malé objemy dat
-
Čitelnější než JOIN
❌ Raději ne když:
-
Velké tabulky
-
Složité business logiky
-
Lze použít JOIN
Alternativa:
sql
Copy
-- Místo:
SELECT * FROM tab1 WHERE id IN (SELECT id FROM tab2);
-- Raději:
SELECT tab1.* FROM tab1 JOIN tab2 ON tab1.id = tab2.id;
-- JOIN je efektivnější než vnořený IN, protože lépe využívá indexy a optimalizátor dotazů, navíc je přehlednější a snáze se rozšiřuje o další tabulky nebo podmínky.
Slide 6: Shrnutí a doporučení
-
Vnořené dotazy jsou mocný nástroj, ale…
-
Používejte je s rozvahou
-
Pro složité dotazy preferujte JOIN
-
Sledujte výkon dotazů
-
Testujte na malých datech před nasazením
Zlaté pravidlo: “Pokud dotaz vypadá příliš složitě, pravděpodobně je!”