Mi a különbség a hol és a záradékok között?

ebben a cikkben megtudhatja, mikor kell használni, ahol és miután. Mindkettő hasonló funkciókat lát el, de különböző célokra!

a cikk összes példája a Microsoft SQL Server Management Studio és az AdventureWorks2012 adatbázison alapul. Ezeket az ingyenes eszközöket az útmutatóm segítségével kezdheti el az SQL Server használatának megkezdése.

miben különböznek egymástól?

ha fejlettebb SQL-vel dolgozik, akkor nem világos, hogy mikor van értelme a WHERE versus A HAVING záradékot használni.

bár úgy tűnik, hogy mindkét záradék ugyanazt csinálja, különböző módon teszik. Valójában funkcióik kiegészítik egymást.

  • a WHERE záradék használata az eredmény rekordjainak szűrése. A szűrő minden csoportosítás előtt megtörténik.
  • A HAVING záradék egy csoport értékeinek szűrésére szolgál.

mielőtt tovább mennénk, nézzük át az SQL utasítás formátumát. Ez

SELECTFROMWHEREGROUP BYHAVING

annak érdekében, hogy a dolgok egyenesen szeretnék gondolni a végrehajtási sorrend az SQL utasítások fentről lefelé. Ez azt jelenti, hogy a WHERE záradékot először az eredményre alkalmazzák,majd a fennmaradó sorokat a csoport szerint összegzik.

WHERE záradék

a WHERE záradék a sorok szűrésére szolgál az eredményekből. Például a

SELECT COUNT(SalesOrderID)FROM Sales.SalesOrderDetail

121 317 értéket ad vissza a számláláskor, míg a

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

lekérdezés 48 159 értéket ad vissza számlálásként. Ez azért van, mert a WHERE záradék kiszűri a 73,158 SalesOrderDetails amelynek UnitPrice kisebb vagy egyenlő 200 az eredményekből.

HAVING záradék

A HAVING záradék a csoport értékeinek szűrésére szolgál. Használhatja őket olyan csoportok kiszűrésére, mint a

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

, de valódi erejük abban rejlik, hogy képesek összehasonlítani és szűrni az összesített függvényeredmények alapján. Például, kiválaszthatja az összes megrendelést összesen több mint $10,000

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

mivel a WHERE záradék láthatósága egyszerre egy sor, nincs mód arra, hogy értékelje az összeget az összes SalesOrderID-ben. A HAVING záradék a csoportosítás létrehozása után kerül kiértékelésre.

a kettő kombinálása: WHERE and HAVING

ha az SQL utasításoknak mind WHERE, mind HAVING záradéka van, ne feledje, hogy először a WHERE záradékot alkalmazzák, majd az eredményeket csoportosítják, végül pedig a csoportokat a HAVING záradék szerint szűrik.

sok esetben elhelyezheti a WHERE feltételt a HAVING záradékban, például

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

ha a Where záradékból feltételt tehet a having záradékba, akkor miért is aggódik a WHERE miatt? Használhatom ezt a lekérdezést?

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

valójában ez a lekérdezés hibát generál. Az Oszlopsorösszeg nem része a csoportonkénti mezőlistának, sem az összesített összeg eredményének.

ahhoz, hogy érvényes legyen, A having záradék csak az összesített függvények vagy a csoport oszloprészeinek eredményeit tudja összehasonlítani.

ahhoz, hogy érvényes legyen, a lekérdezést újra kell írni

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

hogy összefoglaljuk a különbséget a:

  • a WHERE a rekordok szűrésére szolgál, mielőtt bármilyen csoportosítás megtörténne.
  • A HAVING az értékek szűrésére szolgál, miután csoportokká váltak. Csak a csoport oszlopai vagy kifejezései szerepelhetnek a HAVING záradék feltételeiben …

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.

More: