SQL-i sissejuhatuse klausel
Päris põhiküsimus, mis pähe tuleb, on see, mis see KÄSITLUS klausel on? Noh, HAVING-klauslit kasutatakse SQL-päringu tulemuste filtreerimiseks koos koondfunktsioonidega. Lihtsas inglise keeles aru saamiseks käsib see SQL-i parseril "Hei SQL, meie klientide andmete tabelist tuua mulle nende riikide nimed, kellel on üle miljoni kliendi".
Oota, seda teeb KUS klausel, kas pole? Jah, see on väga sarnane WHERE klausli toimimisega, kuid väikese erinevusega. WHERE-lause ei tööta liitfunktsioonidega.
Nüüd, lihtsalt kokkuvõtvate funktsioonide kokkuvõtteks, on need funktsioonid, mis võtavad mitu rida sisendina ja annavad oluliselt töödeldud väljundi. Mõned näited on Count (), Sum (), Min (), Max (), Avg () jne.
Miks KUIDAS ja mitte kus?
Näeme, et klauslid HAVING ja WHERE täidavad tulemuste filtreerimiseks väga sarnast ülesannet. Milline oli siis HAVING-klausli vajadus? Miks ei saaks WHERE-klauslit kasutada liitfunktsioonidega?
Sellele vastamiseks peaksime mõistma, kuidas SQL-i mootor kahte klauslit kohtleb. Igas SQL-käsu FROM-lause ütleb mootorile, kust ridu lugeda. Andmed salvestatakse kettale ja tõmmatakse töötlemiseks mällu. Kuna ridu loetakse ükshaaval kettalt mällu, kontrollitakse neid WHERE klausli osas. Ridasid, mis WHERE klausli ei suuda, ei laadita mällu. Seega hinnatakse WHERE klauslit iga rea jaoks, kuna neid töötleb SQL-mootor.
Vastupidi, klausel HAVING tuleb pildile alles pärast seda, kui read on mällu laaditud. Pärast mällu laadimist täidavad koondfunktsioonid oma ülesandeid ridadel, millel on soovitud seisund.
Kui me paneksime WHERE-klausli selliste koondfunktsioonidega nagu avg (), segaks see SQL-i mootorit, kas lisada rida keskmise arvutamiseks või mitte. Põhimõtteliselt annaksime mootorile käsu rida mitte lugeda, kuna see ei ületanud WHERE-klauslis toodud avg () kriteeriume. Kuid hei, et teha kindlaks, kas see ületas avg () arvutamiskriteeriumid või mitte, tuleb see rida mällu lugeda. Ummikseisund.
Süntaks
SELECT
FROM
Kliendi ID | Kliendi nimi | Linn | Riik |
1 | Anja Damian | Berliin | Saksamaa |
2 | Denny Cockett | México DF | Mehhikos |
3 | Eleanor Calnan | México DF | Mehhikos |
4 | Albertha Albury | London | Suurbritannia |
5 | Latisha Nembhard | Luule | Rootsi |
6 | Madalene Bing | Mannheim | Saksamaa |
7 | Rebecka Beegle | Strasbourg | Prantsusmaa |
8 | Rosy Tippie | Madrid | Hispaania |
9 | Audie Khan | Marseille | Prantsusmaa |
10 | Hildegard Burrowes | Tsawassen | Kanada |
11 | Cordelli kohusetundlikkus | London | Suurbritannia |
12 | Nora Reyna | Buenos Aires | Argentiina |
13 | Ursula Laforest | México DF | Mehhikos |
14 | Claudie Neel | Bern | Šveits |
15 | Portia Yee | São Paulo | Brasiilia |
16 | Angila Segarra | London | Suurbritannia |
17 | Lise Wexler | Aachen | Saksamaa |
18 | Ned Mendivil | Nantes | Prantsusmaa |
19 | Sara Vidaurri | London | Suurbritannia |
20 | Tayna Navin | Graz | Austria |
21 | Pura Ray | São Paulo | Brasiilia |
22 | Erika Byard | Madrid | Hispaania |
23 | Jimmie Luke | Lille | Prantsusmaa |
24 | Shayla Byington | Bräcke | Rootsi |
25 | Christiana Boden | München | Saksamaa |
26 | Irina Nitta | Nantes | Prantsusmaa |
27 | Bryanna Alls | Torino | Itaalia |
28 | Norah Picken | Lisboa | Portugal |
29 | Moriah Stwart | Barcelona | Hispaania |
30 | Idella Harriott | Sevilla | Hispaania |
Tellimuse ID | Kliendi ID | Tellimiskuupäev |
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 |
Nüüd tahame teada kliente, millised riigid on meile esitanud kokku 5 või enam tellimust. See võib olla üks klient, kes esitab rohkem kui 5 tellimust, või 5 klient, kes esitavad 1 tellimuse.
Selle saavutamiseks peame tegema järgmist
1. samm : ühendage kaks tabelit
2. samm: grupeerige kliendid nende riikide järgi
3. samm: loendage iga rühma tellimuste arv
4. samm: filtreerige tulemused vähemalt 5 tellimuse jaoks
Sõnastame käsu:
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
Siin on tulemused:
Riik | NumberOfOrders |
Austria | 10 |
Prantsusmaa | 9 |
Rootsi | 7 |
Saksamaa | 6 |
Suurbritannia | 6 |
Järeldus - SQL-i klausel
Seega oleme näinud, milline on klausli HAVING eesmärk ja kuidas see töötab. Oluline on mõista põhilisi tööpõhimõtteid. Vastasel juhul võite end segadusse ajada, miks klausel HAVING ei anna soovitud tulemusi. Jätkake mängimist erinevate laudade ning liitumiste ja kombinatsioonidega koos HAVING-klausliga.
Soovitatavad artiklid
See on SQL-i klausli juhend. Siin käsitleme HAVING-klausli toimimist SQL-is ja näidet järgmise klientide tabeliga. Võite vaadata ka meie teisi soovitatud artikleid -
- SQL-i sisestuspäring
- Võõrvõti SQL-is
- Eristatav märksõna SQL-is
- SQL vaated
- Oracle'i sisemise liitumise 6 parimat päringu näidet