Hva er forskjellen MELLOM HVOR og har klausuler?

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…

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.

More: