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

Rate this article

Jmenuji se Honza Zedníček a nejčastěji se se mnou v civilu můžete potkat v kancelářích Kentico Software 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 jako finanční controller třeba v Aero Vodochody a Sberbank nebo jako manažer dluhopisového programu v investiční skupině Unicapital. Po práci si rád zahraju tenis, volejbal, šachy, zajdu do posilovny a rád ochutnávám dobré rumy. 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. Nebojte se položit dotaz nebo reagovat do komentáře. Přihlašte se do naší nové Excel facebook skupiny Excel CZ/SK diskuse »

Category: SQL operátory

About Ing. Jan Zedníček - BI Developer, Finance controller

Jmenuji se Honza Zedníček a nejčastěji se se mnou v civilu můžete potkat v kancelářích Kentico Software 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 jako finanční controller třeba v Aero Vodochody a Sberbank nebo jako manažer dluhopisového programu v investiční skupině Unicapital. Po práci si rád zahraju tenis, volejbal, šachy, zajdu do posilovny a rád ochutnávám dobré rumy. 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. Nebojte se položit dotaz nebo reagovat do komentáře. Přihlašte se do naší nové Excel facebook skupiny Excel CZ/SK diskuse »

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.