SQL IN vs. SQL EXISTUJE
Tento článek podrobně popisuje operátory IN a EXISTS v SQL . Mezi vývojáři je častá otázka, jaký je rozdíl mezi těmito dvěma operátory. Abychom poznali rozdíl, pojďme nejprve podrobně probrat každý z těchto operátorů.
Operátor IN
Operátor IN se používá kzískání výsledků, když zadaná hodnota odpovídá hodnotě v sadě hodnot nebo je vrácena vnitřním dotazem. Tento operátor lze také použít s WHERE klauzule k určení více než jedné hodnoty. Operátor IN je často označován jako zkratka pro operátor OR, protože snižuje použití více podmínek OR v dotazech SELECT, INSERT, UPDATE nebo DELETE .
V tomto operátoru se nejprve vyřeší dílčí dotaz a tento výsledek se poté použije k vyřešení vnějšího dotazu.
Následuje obecná syntaxe operátoru IN:
SELECT column_name FROM table_name WHERE column_name IN (value1, value2, …);
Příklad:
Podívejme se na následující tabulku zákazníků.
Cust_id | Cust_name | Město | Povolání |
1 | Harry | Kalkata | Obchodní |
2 | Ron | Bombaj | Doktor |
3 | Albus | Dillí | Inženýr |
4 | Dobby | Pune | Vědec |
5 | Snape | Bangalore | Student |
Dotaz:
SELECT * FROM Customer WHERE Occupation IN ('Doctor', 'Scientist', 'Engineer');
Výše uvedený dotaz vrátí všechny zákazníky, kteří jsou buď doktor, vědec nebo inženýr.
Výstup:
Cust_id | Cust_name | Město | Povolání |
2 | Ron | Bombaj | Doktor |
3 | Albus | Dillí | Inženýr |
4 | Dobby | Pune | Vědec |
EXISTUJE operátor
Operátor EXISTS na rozdíl od operátoru IN vrací booleovskou hodnotu. Tento operátor zkontroluje výsledek vnitřního dotazu a vrátí booleovskou hodnotu, tj. buď true nebo false. Pokud vnitřní dotaz vrátí jeden nebo více záznamů, pak operátor vrátí true, jinak vrátí false, když nebudou nalezeny žádné záznamy.
Tento operátor je také efektivní, protože zastaví další zpracování, jakmile je detekována první opravdová událost.
Následuje syntaxe operátoru EXISTS:
SELECT column_names FROM table_name WHERE NOT EXISTS ( SELECT column_names FROM table_name WHERE condition );
Příklad:
Podívejme se na následující tabulku zákazníků.
Cust_id | Jméno | Povolání | Věk |
101 | Harry | Inženýr | 32 |
102 | Ron | Vývojář | 30 |
103 | Dobby | Vůdce | 28 |
104 | Albus | Vědec | 45 |
105 | Snape | Tesař | 26 |
106 | Zázvor | Herec | 25 |
107 | NULL | NULL | NULL |
Podívejme se na další tabulku Objednávky.
ID_objednávky | Cust_id | Název_produktu | Datum_objednávky |
1 | 101 | Laptop | 2021-01-10 |
2 | 103 | Počítač | 2021-02-12 |
3 | 106 | IPhone | 2021-02-15 |
4 | 104 | Mobil | 2021-03-05 |
5 | 102 | TV | 20. 3. 2021 |
Dotaz:
SELECT Name, Occupation FROM Customer WHERE EXISTS ( SELECT * FROM Orders WHERE Customer.Cust_id = Orders.Cust_id );
Výše uvedený dotaz vrátí jména a povolání všech zákazníků, kteří zadali alespoň jednu objednávku.
Výstup:
Název | Povolání |
Harry | Inženýr |
Ron | Vývojář |
Dobby | Vůdce |
Albus | Vědec |
Zázvor | Herec |
Tabulka rozdílů mezi operátorem IN a EXISTS
Klíčové rozdíly mezi operátorem IN a operátorem EXISTS jsou uvedeny níže v tabulkové podobě:
Operátor IN | EXISTUJE Operátor |
Minimalizuje použití podmínek OR. | Kontroluje existenci záznamu ve vnitřním dotazu. |
Porovnává hodnoty vnitřního dotazu s hodnotou vnějšího dotazu. | Neporovnává hodnoty mezi vnitřním dotazem a dílčím dotazem. |
Zkontroluje všechny hodnoty uvnitř bloku klauzule IN. | Zastaví jakékoli další provádění, jakmile je splněna první pravdivá podmínka. |
Může vrátit TRUE, FALSE nebo NULL. | Vrátí buď PRAVDA, nebo NEPRAVDA. |
Lze jej použít ke kontrole hodnot NULL. | Nelze jej použít ke kontrole hodnot NULL. |
Používá se s poddotazy i hodnotami. | Používá se pouze s poddotazy. |
Provádění je rychlejší, když je výsledek vnitřního dotazu menší. | Provádění je rychlejší, i když je výsledek vnitřního dotazu velký. Je efektivnější než operátor IN. |
Syntaxe :SELECT názvy_sloupců FROM název_tabulky WHERE název_sloupce IN (poddotaz); | Syntaxe :SELECT názvy_sloupcůFROM název_tabulkyWHERE [NOT] EXISTS (poddotaz); |
Závěr:
V tomto tématu bylo provedeno srovnání mezi operátorem IN a operátory EXISTS SQL. Oba operátoři provádějí stejnou operaci, ale jejich vnitřní fungování je odlišné. Mají jinou logickou práci. Kterýkoli z nich může být vybrán podle požadavku. Pokud je však sada dat velká, vždy se doporučuje použít operátor EXISTS.