Care este diferența dintre unde și având clauze?

în acest articol aflați când să utilizați unde și având. Ambele îndeplinesc funcții similare, dar în scopuri diferite!

toate exemplele pentru acest articol se bazează pe Microsoft SQL Server Management Studio și baza de date AdventureWorks2012. Puteți începe să utilizați aceste instrumente gratuite folosind ghidul meu Noțiuni de bază folosind SQL Server.

cum diferă unde și ce?

când lucrați cu SQL mai avansat, poate fi neclar când are sens să utilizați o clauză WHERE versus A HAVING.

deși se pare că ambele clauze fac același lucru, o fac în moduri diferite. De fapt, funcțiile lor se completează reciproc.

  • o clauză WHERE este utilizată pentru a filtra înregistrările dintr-un rezultat. Filtrul are loc înainte de a se face orice grupări.
  • o clauză având este utilizată pentru a filtra valorile dintr-un grup.

înainte de a merge mai departe, să revizuim formatul unei instrucțiuni SQL. Este

SELECTFROMWHEREGROUP BYHAVING

pentru a ajuta la menținerea lucrurile drepte îmi place să mă gândesc la ordinea de execuție a instrucțiunilor SQL de sus în jos. Asta înseamnă că clauza WHERE este aplicată mai întâi rezultatului și apoi, rândurile rămase rezumate în funcție de grup prin.

clauza WHERE

clauza WHERE este utilizată pentru a filtra rândurile din rezultate. De exemplu

SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetail

returnează 121.317 ca număr, în timp ce interogarea

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

returnează 48.159 ca număr. Acest lucru se datorează faptului că clauza WHERE filtrează 73,158 SalesOrderDetails al căror preț de unitate este mai mic sau egal cu 200 din rezultate.

având Clauza

având clauza este folosit pentru a filtra valorile într-un grup de. Le puteți utiliza pentru a filtra grupuri precum

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

dar adevărata lor putere constă în capacitatea lor de a compara și filtra pe baza rezultatelor funcției agregate. De exemplu, puteți selecta toate comenzile în valoare totală de mai mult de $10,000

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

deoarece vizibilitatea clauzei WHERE este un rând la un moment dat, nu există o modalitate de a evalua suma în toate SalesOrderID-urile. clauza HAVING este evaluată după crearea grupării.

combinarea celor două: Unde și având

când instrucțiunile SQL au atât o clauză WHERE, cât și o clauză HAVING, rețineți mai întâi clauza WHERE, apoi rezultatele grupate și, în final, grupurile filtrate conform clauzei HAVING.

în multe cazuri, puteți plasa condiția WHERE în clauza HAVING, cum ar fi

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

dacă puteți pune condiția din clauza where în clauza having, atunci de ce să vă faceți griji despre unde? Pot folosi doar această interogare?

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

de fapt, această interogare generează o eroare. Coloana LineTotal nu face parte din lista grup după câmp și nici rezultatul unui total agregat.

pentru a fi validă clauza având poate compara doar rezultatele funcțiilor agregate sau o parte coloană a grupului de.

pentru a fi validă, interogarea trebuie rescrisă ca

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

pentru a rezuma diferența dintre unde și având:

  • unde este folosit pentru a filtra înregistrările înainte de a avea loc orice grupări.
  • având este folosit pentru a filtra valorile după ce au fost grupuri. Numai coloanele sau expresiile din grup pot fi incluse în condițiile clauzei HAVING …

Lasă un răspuns

Adresa ta de email nu va fi publicată.

More: