Johdanto SQL-lausekkeeseen

Aivan peruskysymys, joka tulee mieleen, mikä on tämä OMA lauseke? No, HAVING-lauseketta käytetään suodattamaan SQL-kyselyn tulokset aggregoiduilla toiminnoilla. Ymmärtääkseen selkeästi englantia, se käskee SQL-jäsentäjän "Hei SQL, Asiakastiedot-taulukostamme, hakemaan minulle niiden maiden nimet, joilla on yli miljoona asiakasta".

Odota, se mitä WHERE-lause tekee, eikö niin? Kyllä, se on hyvin samanlainen kuin WHERE-lause, mutta pienellä erolla. WHERE-lause ei toimi aggregoitujen toimintojen kanssa.

Nyt vain kertoaksesi vähän aggregaattitoiminnoista, nämä ovat toimintoja, jotka ottavat useita rivejä syötteinä ja antavat merkittävästi käsitellyn tulosteen. Muutamia esimerkkejä ovat Count (), Sum (), Min (), Max (), Avg () jne.

Miksi ottaa ja ei missä?

Näemme, että HAVING- ja WHERE-lausekkeet suorittavat hyvin samanlaisen tehtävän suodattaa tulokset. Mikä sitten oli HAVING-lausekkeen tarve? Miksi WHERE-lauseketta ei voitu käyttää aggregoitujen toimintojen kanssa?

Tähän vastaamiseksi meidän on ymmärrettävä, kuinka SQL-moottori käsittelee näitä kahta lauseketta. Jokaisen SQL-komennon FROM-lause kertoo moottorille mistä rivit luetaan. Tiedot tallennetaan levylle ja haetaan muistiin käsittelyä varten. Kun rivit luetaan yksi kerrallaan levyltä muistiin, tarkistetaan WHERE-lauseke. Rivejä, jotka WHERE-lauseen epäonnistuvat, ei ladata muistiin. Siten WHERE-lause arvioidaan jokaiselle riville, kun SQL-moottori käsittelee niitä.

Päinvastoin, HAVING-lause tulee kuvaan vasta kun rivit on ladattu muistiin. Kun muisti on ladattu, aggregoidut toiminnot suorittavat tehtävänsä riveillä, joilla on haluttu tila.

Jos nyt laitettaisiin WHERE-lause koostuvaan funktioon, kuten avg (), se sekoittaisi SQL-moottorin siihen, sisällytetäänkö rivi keskiarvon laskemiseen vai ei. Pohjimmiltaan käskymme moottoria olemaan lukematta riviä, koska se ei läpäissyt WHERE-lausekkeen avg () -kriteerejä. Mutta hei, sen määrittämiseksi, onko avg () -laskentaperusteet läpäisseet vai epäonnistuneet, rivi on luettava muistiin. Umpikujatila.

Syntaksi

SELECT
FROM


Missä - valinnainen
RYHMITTÄMINEN - ryhmittelevät rivit yhdistelmäfunktion käyttämiseksi
HAVING - aggregaattitoiminto kunnossa
TILAUS; - määrittele lajittelujärjestys, valinnainen

Huomautus - HAKU-lauseen kanssa vaaditaan GROUP BY -lause. Tämä johtuu siitä, että võttes lauseke tarvitsee tietoryhmän aggregoidun funktion käyttämiseksi ja tulosten suodattamiseksi.

Kuinka HAVING-lause toimii?

Ymmärtäkäämme HAVING-lauseen toiminnan SQL: ssä.

HAVING-lausekkeeseen liittyy aina GROUP BY -lause. GROUP BY -lause ryhmittelee tietyn kriteerin mukaiset tiedot. Sillä on kolme vaihetta - jaa, levitä ja yhdistä. Jaettu vaihe jakaa rivit ryhmiin. Käytä-vaihe soveltaa joitain aggregoituja toimintoja tietoryhmiin. Yhdistetty vaihe tuottaa yhden tuloksen yhdistämällä ryhmät aggregoidun funktion tulokseen.

Nyt kun ryhmät ovat muodostuneet, HAVING-lause tulee kuvaan. HAVING-lause suodattaa sitten ryhmät, jotka eivät täytä annettua ehtoa.

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

Siten näemme yllä olevassa esimerkissä, että taulukko on ensin jaoteltava kolmeen ryhmään sarakkeen Col_A perusteella. Yhdistetty toiminto Col_B-arvojen keskiarvon laskemiseksi käytetään sitten ryhmiin. Tuloksena on yksi rivi jokaiselle ryhmälle. Tämän jälkeen rivit yhdistetään ja suodatetaan HAVING-lauseen ehtojen perusteella.

esimerkki

Katsotaanpa nyt todellisen maailman esimerkkiä. Oletetaan, että meillä on seuraava asiakastaulukko ja heidän tilaamansa tilaukset.

Asiakas IDAsiakkaan nimiKaupunkiMaa
1Anja DamianBerliiniSaksa
2Denny CockettMéxico DFMeksiko
3Eleanor CalnanMéxico DFMeksiko
4Albertha AlburyLontooUK
5Latisha NembhardLuleåRuotsi
6Madalene BingMannheimSaksa
7Rebecka BeegleStrasbourgRanska
8Rosy TippieMadridEspanja
9Audie KhanMarseilleRanska
10Hildegard BurrowesTsawassenKanada
11Cordell DutrembleLontooUK
12Nora ReynaBuenos AiresArgentiina
13Ursula LaforestMéxico DFMeksiko
14Claudie NeelBernSveitsi
15Portia YeeSao PauloBrasilia
16Angila SegarraLontooUK
17Lise WexleraachenSaksa
18Ned MendivilNantesRanska
19Sara VidaurriLontooUK
20Tayna NavinGrazItävalta
21Pura RaySao PauloBrasilia
22Erika ByardMadridEspanja
23Jimmie LukeLilleRanska
24Shayla ByingtonBräckeRuotsi
25Christiana BodenMünchenSaksa
26Irina NittaNantesRanska
27Bryanna AllsTorinoItalia
28Norah PickenLissabonPortugali
29Moriah StwartBarcelonaEspanja
30Idella HarriottSevillaEspanja
TilausnumeroAsiakas IDTilauspäivämäärä
102541407.11.1996
102582017-07-1996
102591318-07-1996
102632023-07-1996
102642424-07-1996
10265725-07-1996
102672529-07-1996
10278508.12.1996
10280514-08-1996
102891126-08-1996
102901527-08-1996
1029774.9.1996
103033009.11.1996
10308218-09-1996
103111820-09-1996
10326810.10.1996
103272410.11.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.1.1997
104082308.1.1997
104101001.10.1997
104111001.10.1997
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
10434242.3.1997
10435162.4.1997
10436705-02-1997
104422002.11.1997

Nyt haluamme tietää asiakkaidemme, joista maista on tehty yhteensä vähintään viisi tilausta kanssamme. Se voi olla yksi asiakas, joka tekee yli 5 tilausta, tai 5 asiakas, joka antaa yhden tilauksen jokaisesta.

Tämän saavuttamiseksi meidän on tehtävä

Vaihe 1 : Yhdistä kaksi pöytää

Vaihe 2: Ryhmittele asiakkaat heidän maidensa perusteella

Vaihe 3: Laske tilausten määrä jokaiselle ryhmälle

Vaihe 4: Suodata tulokset vähintään viidelle tilaukselle

Formuloidaan komento:

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

Tässä ovat tulokset:

MaaNumberOfOrders
Itävalta10
Ranska9
Ruotsi7
Saksa6
UK6

Johtopäätös - SQL-lauseke

Siksi olemme nähneet, mikä HAVING-lausekkeen tarkoitus on ja miten se toimii. On tärkeää ymmärtää perustyöt. Muuten saatat joutua hämmentämään siitä, miksi HAVING-lause ei tuota toivottuja tuloksia. Jatka pelaamista erilaisilla pöydillä, liittymisillä ja yhdistelmillä yhdessä HAVING-lauseen kanssa.

Suositellut artikkelit

Tämä on opas SQL HAVING -lauseeseen. Tässä keskustellaan HAVING-lauseen toiminnasta SQL: ssä ja esimerkistä seuraavan asiakastaulukon kanssa. Voit myös käydä läpi muiden ehdottamiemme artikkeleidemme -

  1. SQL-lisäyskysely
  2. Vieras avain SQL: ssä
  3. Erottuva avainsana SQL: ssä
  4. SQL-näkymät
  5. Kuusi suosituinta kyselyesimerkkiä sisäisestä liittymisestä Oracliin