Wat is het verschil tussen waar en het hebben van clausules?

in dit artikel leren wanneer te gebruiken waar en hebben. Beide vervullen dezelfde functies, maar voor verschillende doeleinden!

alle voorbeelden voor dit artikel zijn gebaseerd op Microsoft SQL Server Management Studio en de AdventureWorks2012 database. U kunt aan de slag met behulp van deze gratis tools met behulp van mijn gids aan de slag met behulp van SQL Server.

hoe verschillen waar en hebben?

bij het werken met meer geavanceerde SQL kan het onduidelijk zijn wanneer het zinvol is om een WHERE versus een HAVING-clausule te gebruiken.

hoewel het lijkt dat beide clausules hetzelfde doen, doen ze het op verschillende manieren. In feite vullen hun functies elkaar aan.

  • een waarbij clausule wordt gebruikt zijn filterrecords van een resultaat. Het filter treedt op voordat er groeperingen worden gemaakt.
  • een bijzin wordt gebruikt om waarden uit een groep te filteren.

voordat we verder gaan, bekijken we het formaat van een SQL Statement. Het is

SELECTFROMWHEREGROUP BYHAVING

om dingen recht te houden denk ik graag aan de volgorde van uitvoering van SQL statements van boven naar beneden. Dat betekent dat de WHERE clausule eerst wordt toegepast op het resultaat en dan, de resterende rijen samengevat volgens de groep door.

waarbij clausule

de WHERE-clausule wordt gebruikt om rijen uit resultaten te filteren. Bijvoorbeeld

SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetail

geeft 121,317 terug als telling, terwijl de query

SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetailWHERE UnitPrice > 200

48,159 Geeft als telling. Dit komt door de WHERE clausule filtert de 73.158 Verkooporderdetails waarvan de eenheidsprijs lager is dan of gelijk is aan 200 uit de resultaten.

met clausule

de clausule met clausule wordt gebruikt om waarden in een groep te filteren op. U kunt ze gebruiken om groepen zoals

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SalesOrderID > 50000

te filteren, maar hun ware kracht ligt in hun vermogen om te vergelijken en te filteren op basis van de resultaten van de geaggregeerde functie. Bijvoorbeeld, kunt u alle bestellingen in totaal meer dan selecteren $10,000

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000

aangezien de zichtbaarheid van de WHERE-clausule één rij tegelijk is, is er geen manier om de som te evalueren over alle SalesOrderID ‘ s. the HAVING-clausule wordt geëvalueerd nadat de groepering is gemaakt.

combinatie van de twee: Wanneer SQL-statements zowel een WHERE-clausule als een HAVING-clausule hebben, houd dan rekening met de WHERE-clausule die eerst wordt toegepast, vervolgens de resultaten gegroepeerd en ten slotte de groepen gefilterd volgens de HAVING-clausule.

in veel gevallen kunt u de ‘WHERE’ – voorwaarde in de ‘HAVING’ – clausule plaatsen, zoals

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

Als u de ‘where’ – voorwaarde in de ‘having’ – clausule kunt plaatsen, waarom zou u zich dan zorgen maken over de ‘WHERE’? Kan ik deze zoekopdracht gebruiken?

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailGROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000 AND LineTotal > 10

eigenlijk genereert die query een fout. Het Kolomlijntotaal maakt geen deel uit van de lijst groep per veld, noch het resultaat van een geaggregeerd totaal.

om geldig te zijn kan de clausule hebben alleen resultaten van geaggregeerde functies of kolomdeel van de groep vergelijken met.

om geldig te zijn moet de query worden herschreven als

SELECT SalesOrderID, SUM(UnitPrice * OrderQty) AS TotalPriceFROM Sales.SalesOrderDetailWHERE LineTotal > 100GROUP BY SalesOrderIDHAVING SUM(UnitPrice * OrderQty) > 10000

om het verschil tussen waar en hebben samen te vatten:

  • waar wordt gebruikt om records te filteren voordat groeperingen plaatsvinden.
  • wordt gebruikt om waarden te filteren nadat ze groepen zijn geweest. Alleen kolommen of uitdrukkingen in de groep kunnen worden opgenomen in de voorwaarden van de clausule hebben …

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.

More: