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?

  1. WHERE podmínkách

  2. FROM částech

  3. Při INSERT/UPDATE/DELETE

  4. 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ů

  1. ❌ Nelze použít datové typy ntext/image

  2. 🔢 Může vracet jen jeden sloupec (pokud není s IN/EXISTS)

  3. ⚠️ DISTINCT problém s GROUP BY

  4. 📊 ORDER BY jen s TOP

  5. 🔄 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í

  1. Vnořené dotazy jsou mocný nástroj, ale…

  2. Používejte je s rozvahou

  3. Pro složité dotazy preferujte JOIN

  4. Sledujte výkon dotazů

  5. Testujte na malých datech před nasazením

Zlaté pravidlo: “Pokud dotaz vypadá příliš složitě, pravděpodobně je!”