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
Număr de înregistrare client | Numele clientului | Oraș | Țară |
1 | Anja Damian | Berlin | Germania |
2 | Denny Cockett | México DF | Mexic |
3 | Eleanor Calnan | México DF | Mexic |
4 | Albertha Albury | Londra | Regatul Unit |
5 | Latisha Nembhard | Luleå | Suedia |
6 | Madalene Bing | Mannheim | Germania |
7 | Rebecka Beegle | Strasbourg | Franţa |
8 | Rosy Tippie | Madrid | Spania |
9 | Audie Khan | Marsilia | Franţa |
10 | Hildegard Burrowes | Tsawassen | Canada |
11 | Cordell Dutremble | Londra | Regatul Unit |
12 | Nora Reyna | Buenos Aires | Argentina |
13 | Ursula Laforest | México DF | Mexic |
14 | Claudie Neel | Bern | Elveţia |
15 | Portia Yee | Sao Paulo | Brazilia |
16 | Angila Segarra | Londra | Regatul Unit |
17 | Lise Wexler | Aachen | Germania |
18 | Ned Mendivil | Nantes | Franţa |
19 | Sara Vidaurri | Londra | Regatul Unit |
20 | Tayna Navin | Graz | Austria |
21 | Pura Ray | Sao Paulo | Brazilia |
22 | Erika Byard | Madrid | Spania |
23 | Jimmie Luke | Lille | Franţa |
24 | Shayla Byington | Bräcke | Suedia |
25 | Christiana Boden | München | Germania |
26 | Irina Nitta | Nantes | Franţa |
27 | Bryanna Alls | Torino | Italia |
28 | Norah Picken | Lisboa | Portugalia |
29 | Moriah Stwart | Barcelona | Spania |
30 | Idella Harriott | Sevilla | Spania |
Comanda ID | Număr de înregistrare client | Data comandă |
10254 | 14 | 11-07-1996 |
10258 | 20 | 17-07-1996 |
10259 | 13 | 18-07-1996 |
10263 | 20 | 23-07-1996 |
10264 | 24 | 24-07-1996 |
10265 | 7 | 25-07-1996 |
10267 | 25 | 29-07-1996 |
10278 | 5 | 12-08-1996 |
10280 | 5 | 14-08-1996 |
10289 | 11 | 26-08-1996 |
10290 | 15 | 27-08-1996 |
10297 | 7 | 04-09-1996 |
10303 | 30 | 11-09-1996 |
10308 | 2 | 18-09-1996 |
10311 | 18 | 20-09-1996 |
10326 | 8 | 10-10-1996 |
10327 | 24 | 11-10-1996 |
10328 | 28 | 14-10-1996 |
10331 | 9 | 16-10-1996 |
10337 | 25 | 24-10-1996 |
10340 | 9 | 29-10-1996 |
10342 | 25 | 30-10-1996 |
10347 | 21 | 06-11-1996 |
10351 | 20 | 11-11-1996 |
10352 | 28 | 12-11-1996 |
10355 | 4 | 15-11-1996 |
10360 | 7 | 22-11-1996 |
10362 | 9 | 25-11-1996 |
10363 | 17 | 26-11-1996 |
10364 | 19 | 26-11-1996 |
10365 | 3 | 27-11-1996 |
10366 | 29 | 28-11-1996 |
10368 | 20 | 29-11-1996 |
10370 | 14 | 03-12-1996 |
10378 | 24 | 10-12-1996 |
10382 | 20 | 13-12-1996 |
10383 | 4 | 16-12-1996 |
10384 | 5 | 16-12-1996 |
10386 | 21 | 18-12-1996 |
10389 | 10 | 20-12-1996 |
10390 | 20 | 23-12-1996 |
10391 | 17 | 23-12-1996 |
10396 | 25 | 27-12-1996 |
10400 | 19 | 01-01-1997 |
10402 | 20 | 02-01-1997 |
10403 | 20 | 03-01-1997 |
10408 | 23 | 08-01-1997 |
10410 | 10 | 10-01-1997 |
10411 | 10 | 10-01-1997 |
10414 | 21 | 14-01-1997 |
10422 | 27 | 22-01-1997 |
10426 | 29 | 27-01-1997 |
10430 | 20 | 30-01-1997 |
10431 | 10 | 30-01-1997 |
10434 | 24 | 03-02-1997 |
10435 | 16 | 04-02-1997 |
10436 | 7 | 05-02-1997 |
10442 | 20 | 11-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 |
Austria | 10 |
Franţa | 9 |
Suedia | 7 |
Germania | 6 |
Regatul Unit | 6 |
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 -
- Interogare SQL Insert
- Cheie externă în SQL
- Cuvânt cheie distins în SQL
- Vizualizări SQL
- Top 6 exemple de interogare de înscriere interioară în Oracle