î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 …