Bevezetés az SQL rendelkezésébe

Az a legfontosabb kérdés, amelyre jut az a gondolat, hogy mi ez a rendelkezés? Nos, a HAVING záradékot használjuk az SQL lekérdezés eredményeinek kiszűrésére aggregált függvényekkel. A sima angol nyelvű megértés érdekében parancsolja az SQL elemzőt: „Hé SQL, az Ügyféladat-táblázatból hozzon le nekem azon országok nevét, amelyek több mint egymillió ügyfelével rendelkeznek”.

Várj, ez az, amit a záradék tesz, nem igaz? Igen, ez nagyon hasonlít a WHERE záradék működésére, ám enyhe különbséggel. A WHERE záradék nem működik az összesített funkciókkal.

Most, hogy csak egy kis összegzést nyújtsunk az összesített függvényekről, ezek olyan funkciók, amelyek több sort vesznek bemenetként, és jelentősen feldolgozott outputot adnak. Néhány példa a Count (), Sum (), Min (), Max (), Avg () etc.

Miért van, és hol nem?

Látjuk, hogy a HAVING és WHERE záradékok nagyon hasonló feladatot végeznek az eredmények kiszűrésére. Akkor mi volt szüksége a HAVING záradékra? Miért nem lehetne használni a WHERE záradékot összesített funkciókkal?

Ennek megválaszolásához meg kell értenünk, hogy az SQL motor hogyan kezeli a két záradékot. Minden SQL parancs FROM-záradéka megmondja a motornak, ahonnan kell olvasni a sorokat. Az adatok a lemezen vannak tárolva, és a memóriába kerülnek feldolgozás céljából. Mivel a sorokat egyenként olvassa le a lemezről a memóriára, ellenőrizni kell őket a WHERE záradék szempontjából. A WHERE záradékot nem teljesítő sorok nem töltődnek be a memóriába. Így a WHERE záradékot minden sorra ki kell értékelni, amikor azokat az SQL motor dolgozza fel.

Éppen ellenkezőleg, a HAVING záradék csak akkor kerül a képbe, ha a sorokat betöltötték a memóriába. A memóriába töltés után az összesített funkciók elvégzik a feladatukat a kívánt feltételt teljesítő sorokon.

Most, ha WHERE záradékot fogalmaznánk meg az összesített függvénnyel, mint például az avg (), akkor ez összetévesztheti az SQL motort abban, hogy bele kell foglalni a sort az átlag kiszámításához. Alapvetően azt a parancsot adnánk a motornak, hogy ne olvassa el a sort, mivel az nem teljesítette a WHERE záradékban található avg () kritériumokat. De hé, annak meghatározásához, hogy teljesült-e vagy sem az avg () számítási kritériumoknak, a sort be kell olvasni a memóriába. A patthelyzet állapota.

A szintaxis

SELECT
FROM


Hol - választható
CSOPORTÍTÁS - a sorokat az aggregált függvény alkalmazásához csoportosítja
HAVING - aggregált függvény állapotban
RENDEZÉS ; - meghatározhatja a választási sorrendet, opcionális

Megjegyzés - A GROUP BY záradék szükséges a HAVING záradékkal. Ennek oka az, hogy a rendelkező záradéknak adatcsoportra van szüksége az összesített függvény alkalmazására és az eredmények kiszűrésére.

Hogyan működik a HAVING záradék?

Megértjük a HAVING záradék működését az SQL-ben.

A HAVING záradékot mindig a GROUP BY záradék kíséri. A GROUP BY záradék egy bizonyos kritériumnak megfelelő adatokat csoportosít. Három fázisa van - felosztás, felhordás és egyesítés. Az osztott fázis osztja a sorokat csoportokra. Az alkalmazási fázis néhány összesített függvényt alkalmaz az adatcsoportokon. A kombinált fázis egyetlen eredményt hoz létre, ha a csoportokat összevonja az összesített függvény eredményével.

Most, hogy a csoportok kialakulnak, a HAVING záradék kerül a képbe. A HAVING záradék kiszűri azokat a csoportokat, amelyek nem felelnek meg az adott feltételnek.

SELECT Col_A, avg(Col_B) as Col_B
FROM MyTable
GROUP BY Col_A
HAVING avg(Col_B)>30

Így a fenti példában azt látjuk, hogy a táblázatot először három csoportra kell bontani az Col_A oszlop alapján. Ezután a Col_B értékek átlagának kiszámításához az aggregált függvényt alkalmazzuk a csoportokra. Ennek eredményeként minden csoporthoz egyetlen sor kerül. Ezután a sorokat egyesítjük és kiszűrjük a HAVING záradék feltétele alapján.

Példa

Nézzünk most egy valós példát. Fontolja meg, hogy van a következő vásárlói táblázat és a megrendelések, amelyeket velük bocsátottak.

Ügyfél-azonosítóÜgyfél neveVárosOrszág
1Anja DamianBerlinNémetország
2Denny CockettMéxico DFMexikó
3Eleanor CalnanMéxico DFMexikó
4Albertha AlburyLondonUK
5Latisha NembhardLuleåSvédország
6Madalene BingMannheimNémetország
7Rebecka BeegleStrasbourgFranciaország
8Rosy TippieMadridSpanyolország
9Audie KhanMarseilleFranciaország
10Hildegard BurrowesTsawassenKanada
11Cordell DutrembleLondonUK
12Nora ReynaBuenos AiresArgentína
13Ursula LaforestMéxico DFMexikó
14Claudie NeelBernSvájc
15Portia YeeSao PauloBrazília
16Angila SegarraLondonUK
17Lise WexlerAachenNémetország
18Ned MendivilNantesFranciaország
19Sara VidaurriLondonUK
20Tayna NavinGrazAusztria
21Pura RaySao PauloBrazília
22Byard ErikaMadridSpanyolország
23Jimmie LukeLilleFranciaország
24Shayla ByingtonBräckeSvédország
25Christiana BodenMünchenNémetország
26Irina NittaNantesFranciaország
27Bryanna AllsTorinoOlaszország
28Norah PickenLisboaPortugália
29Moriah StwartBarcelonaSpanyolország
30Idella HarriottSevillaSpanyolország
Rendelés azonosítóÜgyfél-azonosítóRendelés dátuma
10254141996/11/07
102582017-07-1996
102591318-07-1996
102632023-07-1996
102642424-07-1996
10265725-07-1996
102672529-07-1996
1027851996/12/08
10280514-08-1996
102891126-08-1996
102901527-08-1996
1029771996/04/09
10303301996/11/09
10308218-09-1996
103111820-09-1996
1032681996/10/10
10327241996/11/10
103282814-10-1996
10331916-10-1996
103372524-10-1996
10340929-10-1996
103422530-10-1996
10347211996/06/11
10351201996/11/11
10352281996/12/11
10355415-11-1996
10360722-11-1996
10362925-11-1996
103631726-11-1996
103641926-11-1996
10365327-11-1996
103662928-11-1996
103682029-11-1996
10370141996/03/12
10378241996/10/12
103822013-12-1996
10383416-12-1996
10384516-12-1996
103862118-12-1996
103891020-12-1996
103902023-12-1996
103911723-12-1996
103962527-12-1996
10400191997/01/01
10402201997/02/01
10403201997/03/01
10408231997/08/01
10410101997/10/01
10411101997/10/01
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
10434241997/03/02
10435161997/04/02
1043671997/05/02
10442201997/11/02

Most azt szeretnénk tudni, hogy az ügyfelek mely országokban összesen 5 vagy annál több megrendelést tettek velünk. Lehet, hogy egy ügyfél több mint 5 megrendelést tesz, vagy 5 ügyfél egy-egy megrendelést nyújt.

Ennek megvalósításához szükségünk lenne

1. lépés : Csatlakozzon a két asztalhoz

2. lépés: Csoportosítsa az ügyfeleket országuk alapján

3. lépés: Számolja az egyes csoportok megrendeléseinek számát

4. lépés: Szűrje le az eredményeket legalább öt megrendelésre

Fogalmazzuk meg a parancsot:

SELECT C.Country, COUNT(O.OrderId) as NumberOfOrders -- Step 1, 3
FROM Customers C -- Step 1
INNER JOIN Orders O on C.CustomerID = O.CustomerID -- Step 1
GROUP BY C.Country -- Step 2
HAVING COUNT(O.OrderId) >= 5 -- Step 4
ORDER BY COUNT(O.OrderId) DESC

Íme az eredmények:

OrszágNumberOfOrders
Ausztria10
Franciaország9
Svédország7
Németország6
UK6

Következtetés - SQL rendelkezés

Így láttuk, mi a HAVING záradék célja és hogyan működik. Fontos megérteni az alapvetõ mûködést, különben összezavarodhat az a kérdés, hogy miért a HAVING záradék nem hozza meg a kívánt eredményeket. Játsszon különféle asztalokkal, csatlakozásokkal és kombinációkkal, a HAVING záradékkal együtt.

Ajánlott cikkek

Ez az útmutató az SQL HAVING záradékához. Itt tárgyaljuk a HAVING záradék működését az SQL-ben és a példát a következő vevőtáblával. Megnézheti más javasolt cikkeinket -

  1. SQL beszúrási lekérdezés
  2. Idegen kulcs az SQL-ben
  3. Megkülönböztető kulcsszó az SQL-ben
  4. SQL nézetek
  5. A legnépszerűbb lekérdezési példák az Oracle belső csatlakozásához