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


KUS - valikuline
RÜHMITADA - rühmitab read koondandmefunktsiooni rakendamiseks
HAVING - agregeeritud funktsioon seisundis
TELLIMUS; - määratleda sorteerimisjärjestus, valikuline

Märkus - klausel HAVING on nõutav GROUP BY klausel. Selle põhjuseks on asjaolu, etklausliklausel vajab koondfunktsiooni rakendamiseks ja tulemuste filtreerimiseks andmerühma.

Kuidas HAVING klausel töötab?

Mõistagem HAVING-klausli toimimist SQL-is.

Klausliga HAVING on alati kaasas klausel GROUP BY. Klausel GROUP BY koondab teatud kriteeriumile vastavad andmed kokku. Sellel on kolm etappi - poolitage, rakendage ja ühendage. Jagatud faas jagab read rühmadesse. Rakendamisfaas rakendab andmegruppidele mõnda agregeeritud funktsiooni. Kombineeritud faas annab ühe tulemuse, ühendades rühmad funktsiooni agregeeritud tulemusega.

Nüüd, kui rühmad on moodustatud, tuleb pilti HAVING-klausel. Seejärel filtreerib punkt HAVING rühmad, mis antud tingimusele ei vasta.

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

Seega näeme ülaltoodud näites, et tabel tuleb esmalt jagada veerus Col_A kolmeks rühmaks. Seejärel rakendatakse rühmadesse koondatud funktsiooni Col_B keskmiste väärtuste arvutamiseks. Selle tulemuseks on iga rühma jaoks üks rida. Seejärel read ühendatakse ja filtreeritakse vastavalt tingimusele HAVING-is.

Näide

Vaadakem nüüd reaalse maailma näidet. Mõelge, et meil on järgmine klientide tabel ja tellimused, mille nad on meile esitanud.

Kliendi IDKliendi nimiLinnRiik
1Anja DamianBerliinSaksamaa
2Denny CockettMéxico DFMehhikos
3Eleanor CalnanMéxico DFMehhikos
4Albertha AlburyLondonSuurbritannia
5Latisha NembhardLuuleRootsi
6Madalene BingMannheimSaksamaa
7Rebecka BeegleStrasbourgPrantsusmaa
8Rosy TippieMadridHispaania
9Audie KhanMarseillePrantsusmaa
10Hildegard BurrowesTsawassenKanada
11Cordelli kohusetundlikkusLondonSuurbritannia
12Nora ReynaBuenos AiresArgentiina
13Ursula LaforestMéxico DFMehhikos
14Claudie NeelBernŠveits
15Portia YeeSão PauloBrasiilia
16Angila SegarraLondonSuurbritannia
17Lise WexlerAachenSaksamaa
18Ned MendivilNantesPrantsusmaa
19Sara VidaurriLondonSuurbritannia
20Tayna NavinGrazAustria
21Pura RaySão PauloBrasiilia
22Erika ByardMadridHispaania
23Jimmie LukeLillePrantsusmaa
24Shayla ByingtonBräckeRootsi
25Christiana BodenMünchenSaksamaa
26Irina NittaNantesPrantsusmaa
27Bryanna AllsTorinoItaalia
28Norah PickenLisboaPortugal
29Moriah StwartBarcelonaHispaania
30Idella HarriottSevillaHispaania
Tellimuse IDKliendi IDTellimiskuupäev
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

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:

RiikNumberOfOrders
Austria10
Prantsusmaa9
Rootsi7
Saksamaa6
Suurbritannia6

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 -

  1. SQL-i sisestuspäring
  2. Võõrvõti SQL-is
  3. Eristatav märksõna SQL-is
  4. SQL vaated
  5. Oracle'i sisemise liitumise 6 parimat päringu näidet