v tomto článku se dozvíte, kdy použít kde a mít. Oba vykonávají podobné funkce, ale pro různé účely!
všechny příklady tohoto článku jsou založeny na Microsoft SQL Server Management Studio A databázi AdventureWorks2012. Můžete začít používat tyto bezplatné nástroje pomocí mého průvodce Začínáme používat SQL Server.
jak se liší a liší?
při práci s pokročilejším SQL může být nejasné, kdy má smysl použít klauzuli WHERE versus HAVING.
ačkoli se zdá, že obě klauzule dělají totéž, dělají to různými způsoby. Ve skutečnosti se jejich funkce vzájemně doplňují.
- klauzule WHERE je použita jako filtr záznamů z výsledku. Filtr nastane před vytvořením seskupení.
- klauzule HAVING se používá k filtrování hodnot ze skupiny.
než půjdeme dál, podívejme se na formát příkazu SQL. Je to
SELECTFROMWHEREGROUP BYHAVING
, abych pomohl udržet věci rovně, rád přemýšlím o pořadí provádění příkazů SQL shora dolů. To znamená, že klauzule WHERE se nejprve použije na výsledek a poté zbývající řádky shrnuté podle skupiny podle.
kde klauzule
klauzule WHERE se používá k Filtrování řádků z výsledků. Například
SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetail
vrací 121,317 jako počet, zatímco dotaz
SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetailWHERE UnitPrice > 200
vrací 48,159 jako počet. To je proto, že klauzule where filtruje 73,158 SalesOrderDetails, jejichž UnitPrice je méně než nebo rovno 200 z výsledků.
HAVING Clause
klauzule HAVING se používá k filtrování hodnot ve skupině podle. Můžete je použít k odfiltrování skupin, jako je
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SalesOrderID > 50000
, ale jejich skutečná síla spočívá v jejich schopnosti porovnávat a filtrovat na základě souhrnných výsledků funkce. Například, můžete vybrat všechny objednávky v celkové hodnotě více než $10,000
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000
Od klauzuli where viditelnost je jeden řádek v době, a tam není způsob, jak to vyhodnotit SOUČET přes všechny SalesOrderID. Klauzule HAVING je hodnocena po seskupení je vytvořen.
kombinace dvou: Kde a mít
když příkazy SQL mají klauzuli WHERE i HAVING, mějte na paměti, že klauzule WHERE je použita jako první, pak výsledky seskupeny a nakonec skupiny filtrovány podle klauzule HAVING.
V mnoha případech, můžete umístit tam, KDE podmínka v klauzule HAVING, jako je
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000 AND SalesOrderID > 50000
Versus
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailWHERE SalesOrderID > 50000GROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000
Pokud si můžete dát podmínku z where klauzule v klauzule having pak proč se vůbec starat o to, KDE? Mohu použít tento dotaz?
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000 AND LineTotal > 10
ve skutečnosti tento dotaz generuje chybu. Sloupec LineTotal není součástí seznamu group by field ani výsledkem souhrnného součtu.
aby byla klauzule having platná, může porovnávat pouze výsledky agregovaných funkcí nebo sloupcové části skupiny podle.
platné dotazu musí být přepsáno jako
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailWHERE LineTotal > 100GROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000
shrnout rozdíl mezi KDE a S:
- KDE se používá k filtrování záznamů, než jakékoliv seskupení konat.
- HAVING se používá k filtrování hodnot poté, co byly skupiny. Pouze sloupce nebo výrazy ve skupině mohou být zahrnuty do podmínek klauzule HAVING …