Introducere în clauza HAVING SQL

Întrebarea foarte de bază care vine în minte este care este această clauză HAVING? Ei bine, clauza HAVING este folosită pentru a filtra rezultatele dintr-o interogare SQL cu funcții agregate. Pentru a înțelege într-o engleză simplă, se comandă parserul SQL „Hei SQL, din tabelul nostru de date pentru clienți, să-mi aduc numele țărilor care au peste 1 milion de clienți”.

Stai, asta face clauza WHERE, nu? Da, aceasta este foarte similară cu modul în care funcționează clauza WHERE, dar cu o mică diferență. Clauza WHERE nu funcționează cu funcții agregate.

Acum, doar pentru a recaperi puțin despre funcțiile de agregare, acestea sunt funcții care iau mai multe rânduri ca intrare și oferă o ieșire mai semnificativ procesată. Câteva exemple sunt Count (), Sum (), Min (), Max (), Avg () etc.

De ce HAVING și nu UNDE?

Vedem că clauzele HAVING și WHERE îndeplinesc o sarcină foarte similară pentru a filtra rezultatele. Atunci care era nevoia clauzei HAVING? De ce nu se poate folosi clauza WHERE cu funcții de agregat?

Pentru a răspunde la acest aspect, ar trebui să înțelegem cum tratează motorul SQL cele două clauze. Clauza FROM din fiecare comandă SQL indică motorul de unde să citească rândurile. Datele sunt stocate pe disc și sunt preluate în memorie pentru procesare. Pe măsură ce rândurile sunt citite unul câte unul de pe disc în memorie, acestea sunt verificate pentru clauza WHERE. Rândurile care nu reușesc clauza WHERE nu sunt încărcate în memorie. Astfel, clauza WHERE este evaluată pentru fiecare rând, deoarece acestea sunt procesate de motorul SQL.

Dimpotrivă, clauza HAVING intră în imagine doar după ce rândurile au fost încărcate în memorie. Odată încărcate în memorie, funcțiile de agregare își îndeplinesc sarcina pe rândurile AVÂND condiția dorită.

Acum, dacă ar fi să punem o clauză WHERE cu funcția de agregare, cum ar fi avg (), aceasta ar confunda motorul SQL cu privire la dacă trebuie să includem rândul pentru calcularea mediei sau nu. În esență, am fi comandat motorului să nu citească rândul, deoarece nu a trecut criteriile avg () din clauza WHERE. Dar hei, pentru a determina dacă a trecut sau a eșuat criteriile de calcul avg (), rândul trebuie citit în memorie. O stare de impas.

Sintaxa

SELECT
FROM


UNDE - opțional
GROUP BY - grupează rândurile pentru a aplica funcția agregată
HAVING - funcție agregată în condiție
COMANDA DE; - definiți ordinea de sortare, opțională

Notă - clauza GROUP BY este necesară cu clauza HAVING. Aceasta se datorează faptului că clauza Have are nevoie de un grup de date pentru a aplica o funcție agregată și pentru a filtra rezultatele.

Cum funcționează clauza HAVING?

Să înțelegem funcționarea clauzei HAVING în SQL.

Clauza HAVING este întotdeauna însoțită de clauza GROUP BY. Clauza GROUP BY grupează datele care corespund unui anumit criteriu. Are trei faze - împărțit, aplicat și combinat. Faza împărțită împarte rândurile în grupuri. Faza de aplicare aplică unele funcții agregate pe grupurile de date. Faza combinată produce un singur rezultat prin combinarea grupurilor cu rezultatul funcției agregate.

Acum că grupurile sunt formate, clauza HAVING intră în imagine. Clauza HAVING filtrează apoi grupurile care nu îndeplinesc condiția dată.

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

Astfel, în exemplul de mai sus, vedem că tabelul este mai întâi împărțit în trei grupuri pe baza coloanei Col_A. Funcția de agregat pentru a calcula media valorilor Col_B este apoi aplicată grupurilor. Rezultă un singur rând pentru fiecare grup. Rândurile sunt apoi combinate și filtrate pe baza condiției din clauza HAVING.

Exemplu

Acum să ne uităm la un exemplu din lumea reală. Luați în considerare că avem următorul tabel de clienți și comenzile pe care le-au plasat la noi.

Număr de înregistrare clientNumele clientuluiOrașȚară
1Anja DamianBerlinGermania
2Denny CockettMéxico DFMexic
3Eleanor CalnanMéxico DFMexic
4Albertha AlburyLondraRegatul Unit
5Latisha NembhardLuleåSuedia
6Madalene BingMannheimGermania
7Rebecka BeegleStrasbourgFranţa
8Rosy TippieMadridSpania
9Audie KhanMarsiliaFranţa
10Hildegard BurrowesTsawassenCanada
11Cordell DutrembleLondraRegatul Unit
12Nora ReynaBuenos AiresArgentina
13Ursula LaforestMéxico DFMexic
14Claudie NeelBernElveţia
15Portia YeeSao PauloBrazilia
16Angila SegarraLondraRegatul Unit
17Lise WexlerAachenGermania
18Ned MendivilNantesFranţa
19Sara VidaurriLondraRegatul Unit
20Tayna NavinGrazAustria
21Pura RaySao PauloBrazilia
22Erika ByardMadridSpania
23Jimmie LukeLilleFranţa
24Shayla ByingtonBräckeSuedia
25Christiana BodenMünchenGermania
26Irina NittaNantesFranţa
27Bryanna AllsTorinoItalia
28Norah PickenLisboaPortugalia
29Moriah StwartBarcelonaSpania
30Idella HarriottSevillaSpania
Comanda IDNumăr de înregistrare clientData comandă
102541411-07-1996
102582017-07-1996
102591318-07-1996
102632023-07-1996
102642424-07-1996
10265725-07-1996
102672529-07-1996
10278512-08-1996
10280514-08-1996
102891126-08-1996
102901527-08-1996
10297704-09-1996
103033011-09-1996
10308218-09-1996
103111820-09-1996
10326810-10-1996
103272411-10-1996
103282814-10-1996
10331916-10-1996
103372524-10-1996
10340929-10-1996
103422530-10-1996
103472106-11-1996
103512011-11-1996
103522812-11-1996
10355415-11-1996
10360722-11-1996
10362925-11-1996
103631726-11-1996
103641926-11-1996
10365327-11-1996
103662928-11-1996
103682029-11-1996
103701403-12-1996
103782410-12-1996
103822013-12-1996
10383416-12-1996
10384516-12-1996
103862118-12-1996
103891020-12-1996
103902023-12-1996
103911723-12-1996
103962527-12-1996
104001901-01-1997
104022002-01-1997
104032003-01-1997
104082308-01-1997
104101010-01-1997
104111010-01-1997
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
104342403-02-1997
104351604-02-1997
10436705-02-1997
104422011-02-1997

Acum, dorim să cunoaștem clienții din care țări au plasat un număr total de 5 sau mai multe comenzi cu noi. Ar putea fi un singur client care plasează mai mult de 5 comenzi sau 5 clienți care plasează 1 comandă fiecare.

Pentru a realiza acest lucru, va trebui

Pasul 1 : Alăturați-vă celor două tabele

Pasul 2: grupați clienții în funcție de țările lor

Pasul 3: numărați numărul de comenzi pentru fiecare grup

Pasul 4: Filtrați rezultatele pentru 5 sau mai multe comenzi

Să formulăm comanda:

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

Iată rezultatele:

ȚarăNumberOfOrders
Austria10
Franţa9
Suedia7
Germania6
Regatul Unit6

Concluzie - Clauza SQL HAVING

Astfel, am văzut care este scopul clauzei HAVING și cum funcționează. Este important să înțelegeți funcționarea de bază, altfel puteți ajunge să vă confundați de ce clauza HAVING nu produce rezultatele dorite. Continuați să jucați cu diverse tabele și îmbinări și combinații împreună cu clauza HAVING.

Articole recomandate

Acesta este un ghid al clauzei SQL HAVING. Aici discutăm modul de funcționare a clauzei HAVING în SQL și exemplu cu următorul tabel de clienți. De asemenea, puteți parcurge și alte articole sugerate -

  1. Interogare SQL Insert
  2. Cheie externă în SQL
  3. Cuvânt cheie distins în SQL
  4. Vizualizări SQL
  5. Top 6 exemple de interogare de înscriere interioară în Oracle