i denne artikkelen lærer du når DU skal bruke HVOR og HA. Begge utfører lignende funksjoner, men for forskjellige formål!
alle eksemplene for denne artikkelen er basert På Microsoft SQL Server Management Studio og AdventureWorks2012-databasen. Du kan komme i gang med DISSE gratis verktøyene ved hjelp av Min Guide Komme I GANG MED SQL Server.
Hvordan Gjør Hvor Og Har Forskjellig?
når du arbeider med mer avansert SQL, kan det være uklart når det er fornuftig å bruke EN WHERE versus A HAVING-klausul.
selv om det ser ut til at begge klausulene gjør det samme, gjør de det på forskjellige måter. Faktisk utfyller deres funksjoner hverandre.
- en der setningsdelen brukes er filter poster fra et resultat. Filteret oppstår før noen grupperinger er laget.
- EN HAVING-setning brukes til å filtrere verdier fra en gruppe.
før Vi går videre, la oss se på formatet til EN SQL-Setning. Det er
SELECTFROMWHEREGROUP BYHAVING
for å holde ting rett, liker jeg å tenke på rekkefølgen for utførelse AV SQL-setninger fra topp til bunn. DET betyr AT where-setningen først brukes på resultatet, og deretter oppsummeres de resterende radene i HENHOLD TIL GRUPPEN AV.
WHERE-setningsdelen
WHERE-setningsdelen brukes til å filtrere rader fra resultater. For eksempel
SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetail
Returnerer 121 317 fra tellingen, mens spørringen
SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetailWHERE UnitPrice > 200
Returnerer 48 159 som tellingen. DETTE er PÅ GRUNN AV where-klausulen filtrerer ut 73 158 SalesOrderDetails Hvis UnitPrice er mindre enn eller lik 200 fra resultatene.
HAVING-Setningsdelen
HAVING-setningsdelen brukes til å filtrere verdier I EN GRUPPE ETTER. Du kan bruke dem til å filtrere ut grupper som
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SalesOrderID > 50000
, men deres sanne kraft ligger i deres evne til å sammenligne og filtrere basert på aggregerte funksjonsresultater. For eksempel kan du velge alle bestillinger totalt mer enn $10,000
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000
SIDEN WHERE-klausulens synlighet er en rad om gangen, er det ikke en måte for DEN å evaluere SUMMEN på tvers av Alle SalesOrderID. HAVING-klausulen evalueres etter at grupperingen er opprettet.
Kombinere de to: HVOR og HAR
NÅR SQL-setninger har BÅDE EN WHERE-klausul og HAVING-klausul, husk WHERE-klausulen først, deretter grupperes resultatene, og til slutt filtreres gruppene i HENHOLD TIL HAVING-klausulen.
i mange tilfeller kan DU plassere WHERE-betingelsen I HAVING-klausulen, for eksempel
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
hvis du kan sette betingelse fra where-klausulen i having-klausulen, hvorfor bekymre DEG for WHERE? Kan jeg bare bruke denne spørringen?
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000 AND LineTotal > 10
faktisk genererer spørringen en feil. Kolonnen LineTotal er ikke en del av listen gruppe etter felt eller resultatet av en samlet total.
for å være gyldig having-setningsdelen kan bare sammenligne resultatene av aggregerte funksjoner eller kolonne del av gruppen ved.
for å være gyldig må spørringen skrives om som
SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailWHERE LineTotal > 100GROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000
for å oppsummere forskjellen MELLOM HVOR OG Å HA:
- HVOR brukes til å filtrere poster før noen grupperinger finner sted.
- HAVING brukes til å filtrere verdier etter at de har vært grupper. Bare kolonner eller uttrykk i gruppen kan inkluderes i HAVING-klausulens betingelser…