Klauzule WHERE a HAVING jsou podrobně popsány v tomto článku. Používají se také k filtrování záznamů v dotazech SQL. Rozdíl mezi klauzulí WHERE a HAVING je nejčastější otázkou položenou během rozhovoru. Hlavní rozdíl mezi nimi je v tom, že klauzule WHERE se používá k určení podmínky pro filtrování záznamů před vytvořením jakéhokoli seskupení, zatímco klauzule HAVING se používá k určení podmínky pro filtrování hodnot ze skupiny. Než provedeme srovnání, nejprve je budeme znát SQL doložky.
Klauzule WHERE
Klauzule WHERE v MySQL se používá s SELECT , VLOŽIT , AKTUALIZACE , a VYMAZAT dotazy k filtrování dat z tabulky nebo vztahu. Popisuje konkrétní stav při načítání záznamů z jedné tabulky nebo více tabulek pomocí klauzule JOIN. Pokud je zadaná podmínka splněna, vrátí konkrétní hodnotu z tabulky. Klauzule WHERE umísťuje podmínky na vybrané sloupce.
Klauzule WHERE v MySQL může také implementovat logické spojky AND , OR a NOT. Jsou známé jako booleovská podmínka, která musí být skutečný k načtení dat. Výrazy logických spojovacích prvků používají operátory porovnání podle jejich operandů<, ,>=, = a . Operátory porovnání se obvykle používají k porovnání řetězců a aritmetických výrazů.,>
Následující syntaxe ilustruje použití klauzule WHERE:
SELECT column_lists, FROM table_name WHERE conditions GROUP BY column_lists;
Vezměme si příklad pro pochopení této věty. Předpokládejme, že máme tabulku pojmenovanou zaměstnanci které obsahují následující údaje:
Pokud chceme získat podrobnosti o zaměstnanci, jehož pracovní doba je delší než 9 , pak můžeme použít příkaz takto:
mysql> SELECT * FROM employees WHERE working_hour > 9;
Získáme níže uvedený výstup, kde můžeme vidět detail zaměstnance, jehož pracovní doba je delší než 9:
jak převést řetězec na int
Pokud použijeme výše uvedený dotaz s SKUPINA VYTVOŘENÁ klauzule , dostaneme jiný výsledek:
mysql> SELECT * FROM employees WHERE working_hour > 9 GROUP BY name;
Zde je výstup:
Klauzule HAVING
Klauzule HAVING v MySQL používá se ve spojení s GROUP BY klauzule nám umožňuje určit podmínky, které filtrují, které výsledky skupiny se ve výsledku objeví. Vrací pouze ty hodnoty ze skupin v konečném výsledku, které splňují určité podmínky. Při výběru můžeme také použít klauzuli WHERE a HAVING společně. V tomto případě klauzule WHERE nejprve filtruje jednotlivé řádky, pak jsou řádky seskupeny, provádí agregační výpočty a nakonec klauzule HAVING filtruje skupiny.
Tato klauzule klade podmínky na skupiny vytvořené klauzuli GROUP BY. Chová se jako klauzule WHERE, když příkaz SQL nepoužívá klíčové slovo GROUP BY. Můžeme použít agregační (skupinové) funkce jako SUM , MIN, MAX, AVG a POČET pouze se dvěma klauzulemi: SELECT a HAVING.
Následující syntaxe ilustruje použití klauzule HAVING:
ahoj světe java
SELECT column_lists, aggregate_function (expression) FROM table_name WHERE conditions GROUP BY column_lists HAVING condition;
Vezměme si příklad pro pochopení této věty. Zde uvažujeme o stejné tabulce zaměstnanci pro demonstraci.
Pokud chceme získat celkovou pracovní dobu pro každého zaměstnance, jehož pracovní doba je delší než 6 hodin , pak můžeme použít příkaz takto:
mysql> SELECT name, SUM(working_hour) AS 'Total working hours' FROM employees GROUP BY name HAVING SUM(working_hour) > 6;
Získáme níže uvedený výstup, kde můžeme vidět celkovou pracovní dobu každého zaměstnance:
Klíčové rozdíly mezi doložkou WHERE a HAVING
Následující body vysvětlují hlavní rozdíly mezi databází a schématem:
- Klauzule WHERE filtruje jednotlivé řádky, zatímco klauzule HAVING filtruje skupiny místo jednoho řádku najednou.
- Klauzuli WHERE nemůžeme použít s agregačními funkcemi, protože funguje pro filtrování jednotlivých řádků. Naproti tomu HAVING umí pracovat s agregačními funkcemi, protože se používá k filtrování skupin.
- Řádkové operace zpracovává klauzule WHERE, zatímco klauzule HAVING zpracovává sloupcové operace se souhrnnými řádky nebo skupinami.
- WHERE je před GROUP BY, což znamená, že klauzule WHERE filtruje řádky před provedením agregovaných výpočtů. HAVING následuje po GROUP BY, což znamená, že klauzule HAVING filtruje řádky po provedení agregovaných výpočtů. V důsledku toho je HAVING z hlediska účinnosti pomalejší než WHERE a je třeba se mu vyhnout, kdykoli je to možné.
- Klauzule WHERE a HAVING můžeme kombinovat v dotazu SELECT. V tomto případě se nejprve k filtrování jednotlivých řádků použije klauzule WHERE. Řádky jsou poté seskupeny, provádějí se agregační výpočty a nakonec se k filtrování skupin použije klauzule HAVING.
- Klauzule WHERE načte požadovaná data na základě zadané podmínky. Na druhou stranu klauzule HAVING nejprve načte celá data a poté se na základě zadané podmínky provede oddělení.
- Bez příkazu SELECT nemůžeme použít klauzuli HAVING. Naopak můžeme použít WHERE s příkazy SELECT, UPDATE a DELETE.
- Klauzule WHERE je předfiltr, zatímco klauzule HAVING je následný filtr.
WHERE vs. HAVING Srovnávací tabulka
Následující srovnávací tabulka rychle vysvětluje jejich hlavní rozdíly:
Srovnávací základ | Klauzule WHERE | Klauzule HAVING |
---|---|---|
Definice | Slouží k provádění filtrace na jednotlivých řádcích. | Slouží k provádění filtrace na skupinách. |
Základní | Je implementován v řádkových operacích. | Je implementován ve sloupcových operacích. |
Načítání dat | Klauzule WHERE načítá konkrétní data z konkrétních řádků na základě zadané podmínky | Klauzule HAVING nejprve načte kompletní data. Následně je oddělí podle dané podmínky. |
Agregační funkce | Klauzule WHERE neumožňuje pracovat s agregačními funkcemi. | Klauzule HAVING může pracovat s agregačními funkcemi. |
Chovat se jako | Klauzule WHERE funguje jako předfiltr. | Klauzule HAVING funguje jako post-filtr. |
Používá se s | Klauzuli WHERE můžeme použít s příkazy SELECT, UPDATE a DELETE. | Klauzuli HAVING lze použít pouze s příkazem SELECT. |
SKUPINA VYTVOŘENÁ | Klauzule GROUP BY následuje po klauzuli WHERE. | Klauzule GROUP BY je před klauzulí HAVING. |
Závěr
V tomto článku jsme provedli srovnání klauzule WHERE a HAVING. Zde docházíme k závěru, že obě klauzule fungují při filtrování dat stejným způsobem, až na to, že díky některé další funkci je klauzule HAVING populárnější. Můžeme efektivně pracovat s agregačními funkcemi v klauzuli HAVING, zatímco WHERE agregační funkce neumožňuje.