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 …