Kaj ima sum sql. Ukaz SELECT razdelek HAVING. Sami napišite poizvedbe s stavkom SQL HAVING in si nato oglejte rešitve

V svojem arzenalu ima veliko močnih orodij za manipulacijo podatkov, shranjenih v obliki tabel.

Nedvomno je zmožnost združevanja podatkov pri vzorčenju po določenem kriteriju eno od teh orodij. HAVING vam skupaj z operatorjem WHERE omogoča določitev pogojev za izbiro podatkov, ki so že bili na nek način združeni.

HAVING SQL parameter: opis

Najprej je treba omeniti, da je ta parameter neobvezen in se uporablja izključno v povezavi s parametrom GROUP BY. Kot se spomnite, se GROUP BY uporablja, ko se v SELECT uporabljajo agregatne funkcije, rezultate njihovih izračunov pa je treba pridobiti za določene skupine. Če vam WHERE omogoča nastavitev izbirnih pogojev, preden se podatki združijo, potem HAVING vsebuje pogoje, ki se nanašajo na podatke neposredno v samih skupinah. Za boljše razumevanje si oglejmo primer z vezjem, predstavljenim na spodnji sliki.

To je odličen primer, ki daje opis HAVING SQL. Podana je tabela s seznamom imen izdelkov, podjetij, ki jih proizvajajo, in nekaterih drugih polj. V poizvedbi v zgornjem desnem kotu skušamo pridobiti podatek, koliko proizvodnih artiklov proizvede posamezno podjetje, v rezultatu pa želimo prikazati samo tista podjetja, ki proizvajajo več kot 2 artikla. Parameter GROUP BY je oblikoval tri skupine, ki ustrezajo imenom podjetij, za vsako izmed njih pa je bilo izračunano število izdelkov (vrstic). Toda parameter HAVING je s svojim pogojem eno skupino izločil iz nastalega vzorca, saj ni izpolnjevala pogoja. Posledično dobimo dve skupini, ki ustrezata podjetjem s 5 in 3 količinami proizvodnje.

Lahko bi se vprašali, zakaj uporabljati HAVING, ko ima SQL WHERE. Če bi uporabili WHERE, bi gledal na skupno število vrstic v tabeli, ne po skupinah, in pogoj v tem primeru ne bi imel smisla. Vendar pa pogosto popolnoma sobivajo v eni zahtevi.

V zgornjem primeru lahko vidimo, kako so podatki najprej izbrani po imenih zaposlenih, navedenih v parametru WHERE, nato pa gre rezultat, združen v GROUP BY dodatno preverjanje glede na višino plače za posameznega zaposlenega.

Parameter SQL HAVING: primeri, sintaksa

Oglejmo si nekaj funkcij sintakse HAVING SQL. Opis tega parametra je precej preprost. Prvič, kot že omenjeno, se uporablja izključno v povezavi s parametrom GROUP BY in je določen takoj za njim in pred ORDER BY, če je v zahtevi. To je razumljivo, saj HAVING definira pogoje za že združene podatke. Drugič, v pogoju tega parametra je mogoče uporabiti samo združevalne funkcije in polja, podana v parametru GROUP BY. Vsi pogoji v ta parameter podani na popolnoma enak način kot v primeru WHERE.

Zaključek

Kot lahko vidite, ni nič zapletenega danega operaterjašt. Pomensko se uporablja na enak način kot WHERE. Pomembno je razumeti, da se WHERE uporablja za vse izbrane podatke, HAVING pa samo za skupine, definirane v parametru GROUP BY. Predstavili smo obsežen opis HAVING SQL, ki je dovolj za samozavestno delo z njim.

Kako lahko ugotovim število modelov osebnih računalnikov, ki jih proizvaja določen dobavitelj? Kako določiti povprečno ceno računalnikov, ki imajo enako specifikacije? Na ta in mnoga druga vprašanja v zvezi z nekaterimi statističnimi informacijami je mogoče odgovoriti z uporabo končne (agregatne) funkcije. Standard zagotavlja naslednje agregatne funkcije:

Vse te funkcije vrnejo eno samo vrednost. Hkrati pa funkcije ŠTEVJE, MIN in MAKS uporabna za katero koli vrsto podatkov, medtem ko SUM in AVG se uporabljajo samo za številska polja. Razlika med funkcijo ŠTEVI(*) in ŠTEVI(<имя поля>) je, da drugi pri izračunu ne upošteva vrednosti NULL.

Primer. Poiščite najnižjo in najvišjo ceno za osebne računalnike:

Primer. Poiščite razpoložljivo število računalnikov proizvajalca A:

Primer. Če nas zanima količina razni modeli, ki ga proizvaja proizvajalec A, potem lahko poizvedbo formuliramo na naslednji način (z uporabo dejstva, da je v tabeli izdelkov vsak model zabeležen enkrat):

Primer. Poiščite število razpoložljivih različnih modelov proizvajalca A. Poizvedba je podobna prejšnji, v kateri je bilo potrebno določiti skupno število modelov proizvajalca A. Tukaj morate poiskati tudi število različnih modelov v PC mizo (tj. tiste, ki so na voljo za prodajo).

Za zagotovitev, da se pri pridobivanju statističnih kazalcev uporabljajo samo edinstvene vrednosti, ko prepir agregatne funkcije je lahko uporabljen DISTINCT parameter. Še ena parameter VSE je privzeta vrednost in predpostavlja, da so preštete vse vrnjene vrednosti v stolpcu. operater,

Če potrebujemo število proizvedenih modelov osebnih računalnikov vsi proizvajalca, boste morali uporabiti klavzula GROUP BY, sintaktično sledi WHERE klavzule.

klavzula GROUP BY

klavzula GROUP BY uporablja se za definiranje skupin izhodnih linij, za katere je mogoče uporabiti agregatne funkcije (COUNT, MIN, MAX, AVG in SUM). Če ta stavek manjka in se uporabljajo združevalne funkcije, bodo vsi stolpci z imeni, omenjenimi v IZBERI, je treba vključiti v agregatne funkcije in te funkcije bodo uporabljene za celoten niz vrstic, ki izpolnjujejo predikat poizvedbe. V nasprotnem primeru vsi stolpci seznama SELECT ni vključen v agregatnih funkcijah je treba določiti v klavzuli GROUP BY. Posledično so vse vrstice izhodne poizvedbe razdeljene v skupine, za katere so značilne enake kombinacije vrednosti v teh stolpcih. Po tem bodo za vsako skupino uporabljene agregatne funkcije. Upoštevajte, da se za GROUP BY vse vrednosti NULL obravnavajo kot enake, tj. pri združevanju po polju, ki vsebuje vrednosti NULL, bodo vse takšne vrstice padle v eno skupino.
če če obstaja klavzula GROUP BY, v stavku SELECT brez agregatnih funkcij, potem bo poizvedba preprosto vrnila eno vrstico iz vsake skupine. To funkcijo lahko skupaj s ključno besedo DISTINCT uporabite za odstranitev podvojenih vrstic v naboru rezultatov.
Poglejmo preprost primer:
SELECT model, COUNT(model) AS Qty_model, AVG(price) AS Avg_price
IZ PC-ja
GROUP BY model;

V tej zahtevi se za vsak model osebnega računalnika določi njihovo število in povprečna cena. Vse vrstice z isto vrednostjo modela tvorijo skupino, rezultat SELECT pa izračuna število vrednosti in vrednosti povprečne cene za vsako skupino. Rezultat poizvedbe bo naslednja tabela:
model Qty_model Avg_price
1121 3 850.0
1232 4 425.0
1233 3 843.33333333333337
1260 1 350.0

Če bi SELECT imel stolpec z datumom, bi bilo mogoče te kazalnike izračunati za vsak določen datum. Če želite to narediti, morate dodati datum kot stolpec za združevanje, nato pa bodo agregatne funkcije izračunane za vsako kombinacijo vrednosti (model-datum).

Obstaja več specifičnih pravila za izvajanje agregatnih funkcij:

  • Če kot rezultat zahteve ni prejetih vrstic(ali več kot ena vrstica za dano skupino), potem ni izvornih podatkov za izračun katere koli agregatne funkcije. V tem primeru bo rezultat funkcij COUNT enak nič, rezultat vseh drugih funkcij pa NULL.
  • Prepir agregatna funkcija sama ne more vsebovati agregatnih funkcij(funkcija iz funkcije). Tisti. v eni poizvedbi je recimo nemogoče pridobiti največje povprečne vrednosti.
  • Rezultat izvajanja funkcije COUNT je celo število(CELO ŠTEVILO). Druge agregatne funkcije podedujejo vrste podatkov vrednosti, ki jih obdelujejo.
  • Če funkcija SUM ustvari rezultat, ki je večji od največje vrednosti uporabljenega podatkovnega tipa, napaka.

Torej, če zahteva ne vsebuje GROUP BY klavzule, To agregatne funkcije vključeno v stavek SELECT, se izvedejo v vseh nastalih vrsticah poizvedbe. Če zahteva vsebuje klavzula GROUP BY, vsak niz vrstic, ki ima enake vrednosti stolpca ali skupine stolpcev, navedenih v klavzula GROUP BY, sestavlja skupino ter agregatne funkcije se izvajajo za vsako skupino posebej.

IMAJO ponudbo

če stavek WHERE potem definira predikat za filtriranje vrstic IMAJO ponudbo velja po združevanju da definirate podoben predikat, ki filtrira skupine po vrednostih agregatne funkcije. Ta člen je potreben za potrditev vrednosti, ki so pridobljene z uporabo agregatna funkcija ne iz posameznih vrstic vira zapisa, definiranega v FROM klavzula, in od skupine takih linij. Zato takega preverjanja ni mogoče vsebovati stavek WHERE.

Klavzula HAVING se uporablja v kombinaciji s klavzulo GROUP BY. Uporabite ga lahko v stavku SELECT za filtriranje zapisov, ki jih vrne klavzula GROUP BY.

Skladnja klavzule HAVING

agregatna_funkcija je lahko funkcija, kot je SUM, COUNT, MIN ali MAX.

Primer uporabe funkcije SUM
S funkcijo SUM lahko na primer poiščete ime oddelka in znesek prodaje (za ustrezne oddelke). Ponudba HAVING lahko izbere samo tiste oddelke, katerih prodaja presega 1000 USD.

IZBERITE oddelek, SUM(prodaja) KOT "Skupna prodaja" FROM order_details GROUP BY oddelek HAVING SUM(prodaja) > 1000;

Primer uporabe funkcije COUNT
Na primer, s funkcijo COUNT lahko pridobite ime oddelka in število zaposlenih (v ustreznem oddelku), ki so zaslužili več kot 25.000 $ na leto. Predlog IMETI bo izbral samo tiste oddelke, kjer je takih zaposlenih več kot 10.

Primer uporabe funkcije MIN
Na primer, s funkcijo MIN lahko vrnete ime oddelka in minimalni prihodek za ta oddelek. Predlog HAVING bo vrnil le tiste oddelke, katerih prihodki se začnejo pri 35.000 USD.

IZBERITE oddelek, MIN(plača) KOT "Najnižja plača" OD zaposlenih SKUPINA PO oddelkih, KI IMAJO MIN(plača) = 35000 ;

Primer uporabe funkcije MAX
Funkcijo lahko na primer uporabite tudi za pridobitev imena oddelka in največjega prihodka oddelka. Predlog HAVING bo vrnil le tiste oddelke, katerih najvišji prihodek je nižji od 50.000 USD.

IZBERITE oddelek, MAX (plača) KOT "Najvišja plača" OD zaposlenih SKUPINA PO oddelkih, KI IMAJO MAX (plača)< 50000 ;

Zadnja posodobitev: 19.07.2017

T-SQL uporablja stavka GROUP BY in HAVING za združevanje podatkov z naslednjo formalno sintakso:

IZBERI stolpce IZ tabele

ZDRUŽI PO

Klavzula GROUP BY določa, kako bodo vrstice razvrščene.

Na primer, združimo izdelke glede na proizvajalca

IZBERITE Proizvajalca, ŠTETI (*) KOT Število modelov IZ SKUPINE IZDELKOV PO PROIZVAJALCU

Prvi stolpec v stavku SELECT - Manufacturer predstavlja ime skupine, drugi stolpec - ModelsCount pa predstavlja rezultat funkcije Count, ki izračuna število vrstic v skupini.

Upoštevati je treba, da mora biti vsak stolpec, ki se uporablja v stavku SELECT (brez štetja stolpcev, ki shranjujejo rezultat agregatnih funkcij), naveden za klavzulo GROUP BY. Tako je na primer v zgornjem primeru stolpec Manufacturer naveden tako v členih SELECT in GROUP BY.

In če stavek SELECT izbere enega ali več stolpcev in uporablja tudi združevalne funkcije, potem morate uporabiti klavzulo GROUP BY. Tako naslednji primer ne bo deloval, ker ne vsebuje izraza za združevanje:

IZBERITE Proizvajalec, ŠTETI (*) KOT Število modelov IZ izdelkov

Drug primer, dodajmo grupiranje po številu izdelkov:

IZBERITE Manufacturer, ProductCount, COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer, ProductCount

Klavzula GROUP BY lahko združuje več stolpcev.

Če stolpec, ki ga združujete, vsebuje vrednost NULL, bodo vrstice z vrednostjo NULL tvorile ločeno skupino.

Upoštevajte, da mora biti klavzula GROUP BY za klavzulo WHERE, vendar pred klavzulo ORDER BY:

SELECT Manufacturer, COUNT(*) AS ModelsCount FROM Products WHERE Price > 30000 GROUP BY Manufacturer ORDER BY ModelsCount DESC

Skupinsko filtriranje. IMATI

Operater IMATI določa, katere skupine bodo vključene v izhodni rezultat, to pomeni, da filtrira skupine.

Uporaba HAVING je v mnogih pogledih podobna uporabi WHERE. Za filtriranje vrstic se uporablja samo WHERE, za filtriranje skupin pa HAVING.

Na primer, poiščimo vse skupine izdelkov po proizvajalcu, za katere je opredeljen več kot 1 model:

IZBERITE Proizvajalca, ŠTEVILO (*) KOT Število modelov IZ SKUPINE IZDELKOV PO PROIZVAJALCU IMA ŠTEVILO (*) > 1

V tem primeru lahko v enem ukazu uporabimo izraza WHERE in HAVING:

SELECT Manufacturer, COUNT(*) AS ModelsCount FROM Products WHERE Price * ProductCount > 80000 GROUP BY Manufacturer HAVING COUNT(*) > 1

To pomeni, da se v tem primeru vrstice najprej filtrirajo: izberejo se tisti izdelki, katerih skupna cena je večja od 80 000. Nato se izbrani izdelki združijo po proizvajalcih. Nato se same skupine filtrirajo - izberejo se tiste skupine, ki vsebujejo več kot 1 model.

Če je potrebno razvrstiti, pride izraz ORDER BY za izrazom HAVING:

SELECT Manufacturer, COUNT(*) AS Models, SUM(ProductCount) AS Units FROM Products WHERE Cena * ProductCount > 80000 GROUP BY Manufacturer HAVING SUM(ProductCount) > 2 ORDER BY Units DESC

V tem primeru je združevanje po proizvajalcih, izbrano pa je tudi število modelov za posameznega proizvajalca (Modeli) in skupno število vseh izdelkov za vse te modele (Enote). Na koncu so skupine razvrščene po številu izdelkov v padajočem vrstnem redu.

V prejšnjem članku smo si ogledali. Tam sem napisal, da vam ta konstrukcija omogoča, da izberete ločene skupine in za vsako skupino izračunate funkcije, ki so navedene za tem IZBERI. A IMATI omogoča, da glede na rezultate izvajanja funkcij filtrira nepotrebne vrstice iz skupin. Oglejmo si to podrobneje.

Spomnimo se našega prejšnjega problema, kjer smo izračunali povprečno ceno mleka za določeno verigo supermarketov. Ne glejmo samo povprečne cene, ampak naštejmo samo tiste verige supermarketov, kjer povprečna cena pod 38.

Za to filtriranje na podlagi rezultatov izvajanja agregatne funkcije uporabljamo v ukazu SQL HAVING:

IZBERI `shop_id`, AVG(`price`) IZ `table` GROUP BY `shop_id` HAVING AVG(`price`)< 38

Kot rezultat, namesto 4 imeli bomo samo črte 3 :

shop_id AVG('cena')
1 37.5
2 36.0
3 37.0

Če modeli ZDRUŽI PO takrat ne bo IMATI ne bo veljal za določeno skupino, ampak za celoten vzorec. To pomeni, da če pogoj IMATI bo izvedeno, ne bo imelo nobenega učinka. In če se ne izvede, potem ne bo nobene nastale vrstice.