i den här artikeln lär du dig när du ska använda var och ha. Båda utför liknande funktioner, men för olika ändamål!
alla exempel på den här artikeln är baserade på Microsoft SQL Server Management Studio och AdventureWorks2012-databasen. Du kan komma igång med att använda dessa gratis verktyg med min Guide komma igång med SQL Server.
Hur skiljer sig var och har?
när du arbetar med mer avancerad SQL kan det vara oklart när det är vettigt att använda en var kontra en HAVING-klausul.
även om det verkar som om båda klausulerna gör samma sak, gör de det på olika sätt. Faktum är att deras funktioner kompletterar varandra.
- A där klausul används är filterposter från ett resultat. Filtret inträffar innan några grupperingar görs.
- en HAVING-sats används för att filtrera värden från en grupp.
innan vi går vidare, Låt oss granska formatet för ett SQL-uttalande. Det är
SELECTFROMWHEREGROUP BYHAVING
för att hjälpa till att hålla saker rakt jag tycker om ordningen för utförande av SQL-satser från topp till botten. Det betyder att where-klausulen först tillämpas på resultatet och sedan de återstående raderna sammanfattas enligt gruppen av.
WHERE-klausul
where-klausulen används för att filtrera rader från resultat. Till exempel
SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetail
returnerar 121,317 från räkningen, medan frågan
SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetailWHERE UnitPrice > 200
returnerar 48,159 som räkningen. Detta beror på where-klausulen filtrerar bort 73,158-Försäljningsorderdetails vars enhetspris är mindre än eller lika med 200 från resultaten.
HAVING Klausul
having klausulen används för att filtrera värden i en grupp av. Du kan använda dem för att filtrera bort grupper som
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SalesOrderID > 50000
men deras verkliga kraft ligger i deras förmåga att jämföra och filtrera baserat på aggregerade funktionsresultat. Till exempel kan du välja alla beställningar på totalt mer än $10,000
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000
eftersom where-klausulens synlighet är en rad i taget finns det inget sätt för den att utvärdera summan över alla Salesorderids. HAVING-klausulen utvärderas efter att grupperingen har skapats.
kombinera de två: Var och har
när SQL-satser har både en where-klausul och HAVING-klausul, kom ihåg WHERE-klausulen tillämpas först, sedan grupperas resultaten och slutligen grupperna filtreras enligt having-klausulen.
i många fall kan du placera WHERE-villkoret i HAVING-klausulen, till exempel
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000 AND SalesOrderID > 50000
kontra
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailWHERE SalesOrderID > 50000GROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000
om du kan sätta villkor från where-klausulen i having-klausulen, varför ens oroa dig för WHERE? Kan jag bara använda den här frågan?
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000 AND LineTotal > 10
faktiskt genererar den frågan Ett fel. Kolumnen LineTotal ingår inte i listan grupp efter fält eller resultatet av en sammanlagd summa.
för att vara giltig having-klausulen kan bara jämföra resultaten av aggregerade funktioner eller kolumndelen av gruppen med.
för att vara giltig måste frågan skrivas om som
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailWHERE LineTotal > 100GROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000
för att sammanfatta skillnaden mellan var och ha:
- var används för att filtrera poster innan några grupperingar äger rum.
- HAVING används för att filtrera värden efter att de har varit grupper. Endast kolumner eller uttryck i gruppen kan inkluderas i HAVING-klausulens villkor …