SQL EXISTS operátor – Test existence

Poslední aktualizace:

EXISTS je T-SQL operátor, pomocí kterého lze otestovat existenci výsledku ve vnořeném dotazu (subquery) a na základě toho provést dotaz nebo nějakou úlohu. Sql EXISTS provádí tzv. “Existence test”.

Syntaxe SQL EXISTS

1 SQL Dotaz:

SELECT Sloupce
FROM dbo.Tabulka
WHERE EXISTS
   (SELECT Sloupce
    FROM Dbo.Tabulka2
    WHERE Podminka);

(!!!) Pozor operátor provádí pouze test existence. Pokud záznamy v subquery existují, tak se provede hlavní dotaz bez omezení, výsledkem hlavního datazu budou všechny záznamy z tabulky. To se dá ošetřit úpravou syntaxe, viz. příklady

2 SQL Procedura/Routine:

IF EXISTS (SELECT 1 FROM dbo.Tabulka)
PRINT 'Záznam existuje'

Pokud je výsledkem subquery nějaký záznam, provede se hlavní dotaz nebo sekvence kroků

Příklad SQL EXISTS

Jak bylo zmíněno, sql EXISTS neprovádí omezení, ale pouze test existence. Pokud bychom chtěli otestovat, jestli existuje nenulový počet záznamů v subquery na základě podmínky a současně bychom chtěli aplikovat tuto podmínku také na hlavní dotaz, měli bychom k tomu přistoupit takto:

Definice situace – mějme 2 tabulky v databázi obchodu se sportovním vybavením:

  • Tabulka dbo.DimProduct – zde se nachází seznam produktů (celkem 606), které prodává naše firma. Každý produkt patří do nějaké produktové kategorie
  • Tabulka dbo.DimProductSubcategory – najdeme zde seznam kategorií produktů (celkem 37 kategorií)

Úkolem je najít pomocí operátoru sql EXISTS všechny produkty, které patří do kategorie “helmy”. Pokud taková kategorie neexistuje bude výsledkem prázdná tabulka.

Řešení příkladu:

SELECT EnglishProductName AS NazevProduktu, [ListPrice] AS Cena_USD
FROM dbo.DimProduct
WHERE EXISTS
     (SELECT 1
      FROM dbo.DimProductSubcategory
      WHERE ProductSubcategoryKey = dbo.DimProduct.ProductSubcategoryKey
      AND EnglishProductSubcategoryName = 'helmets')

SQL EXISTS

  • Omezení hlavního dotazu na kategorii “Helmy” je provedeno ve WHERE části propojením obou tabulek. Tímto nám prakticky vzniká INNER JOIN a dojde k aplikaci omezení i na hlavní query.
  • “SELECT 1” je použito z výkonostních důvodů
  • Stejného efektu bychom docílili i použitím SQL operátoru IN

Bylo by chybou napsat dotaz pomocí SQL EXISTS takto:

SELECT EnglishProductName AS NazevProduktu, [ListPrice] AS Cena_USD
FROM dbo.DimProduct
WHERE EXISTS
     (SELECT 1
      FROM dbo.DimProductSubcategory
      WHERE EnglishProductSubcategoryName = 'helmets')

Výsledkem by byly všechny záznamy z tabulky dbo.DimProduct

Jak se vám líbil článek?

Honza Zedníček

Jmenuji se Honza Zedníček a nejčastěji se se mnou v civilu můžete potkat v kancelářích společnosti Kentico, s.r.o v Brně, kde působím jako BI Developer. Částečně pracuji také jako freelancer. Tuto práci dělám pro různé firmy již přes 5 let, ale Kentico je moje srdcovka ♡. Před tím jsem pracoval v několika bankách na pozicích finanční controller a manažer. Po práci se měním na vášnivého hráče tenisu, šachu a ochutnávače dobrých rumů. Mým velké štěstím, koníčkem a někdy stresorem se před 3 lety stal syn Kubíček. Svoje znalosti se snažím zapisovat na tento web - abych je nezapomněl (působením rumu ^^) a sloužily i někomu dalšímu. Přidejte si mě na LinkedIn nebo se subscribněte na RSS kanál

Rubrika: SQL operátory

About Honza Zedníček

Jmenuji se Honza Zedníček a nejčastěji se se mnou v civilu můžete potkat v kancelářích společnosti Kentico, s.r.o v Brně, kde působím jako BI Developer. Částečně pracuji také jako freelancer. Tuto práci dělám pro různé firmy již přes 5 let, ale Kentico je moje srdcovka ♡. Před tím jsem pracoval v několika bankách na pozicích finanční controller a manažer. Po práci se měním na vášnivého hráče tenisu, šachu a ochutnávače dobrých rumů. Mým velké štěstím, koníčkem a někdy stresorem se před 3 lety stal syn Kubíček. Svoje znalosti se snažím zapisovat na tento web - abych je nezapomněl (působením rumu ^^) a sloužily i někomu dalšímu. Přidejte si mě na LinkedIn nebo se subscribněte na RSS kanál

Napsat komentář

Vaše emailová adresa nebude zveřejněna.

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..