Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • OS
  • Sql funkcije agregacije. Grupiranje u SQL-u: GROUP BY, HAVING klauzule i agregatne funkcije

Sql funkcije agregacije. Grupiranje u SQL-u: GROUP BY, HAVING klauzule i agregatne funkcije

Kako mogu saznati broj modela računara proizvedenih od strane određenog dobavljača? Kako odrediti prosječnu cijenu računara koji imaju istu specifikacije? Na ova i mnoga druga pitanja vezana za neke statističke informacije, možete dobiti odgovore koristeći konačne (agregatne) funkcije. Standard pruža sljedeće agregatne funkcije:

Sve ove funkcije vraćaju jednu vrijednost. Istovremeno, funkcije COUNT, MIN I MAX primjenjivo na bilo koji tip podataka, dok SUMA I AVG se koriste samo za numerička polja. Razlika između funkcija COUNT(*) I COUNT(<имя поля>) je da drugi ne uzima u obzir NULL vrijednosti prilikom izračunavanja.

Primjer. Pronađite minimalnu i maksimalnu cijenu za personalne računare:

Primjer. Pronađite raspoloživi broj računara proizvođača A:

Primjer. Ako nas zanima količina razni modeli, proizveden od strane proizvođača A, onda se upit može formulirati na sljedeći način (koristeći činjenicu da je u tablici proizvoda svaki model zabilježen jednom):

Primjer. Pronađite broj dostupnih različitih modela proizvođača A. Upit je sličan prethodnom, u kojem je bilo potrebno utvrditi ukupan broj modeli proizvedeni od strane proizvođača A. Ovdje također trebate pronaći broj različitih modela u tablici računara (tj. komercijalno dostupnih).

Kako bi se osiguralo da se pri dobijanju statističkih pokazatelja koriste samo jedinstvene vrijednosti, kada argument agregatnih funkcija može biti korišteno DISTINCT parametar. Drugi parametar SVE je zadana vrijednost i pretpostavlja da se sve vraćene vrijednosti u stupcu broje. operater,

Ako trebamo dobiti broj proizvedenih modela PC-a svima proizvođača, morat ćete koristiti GROUP BY klauzula, sintaktički slijedeći WHERE klauzule.

GRUPA ponuda BY

GROUP BY klauzula koristi se za definiranje grupa izlaznih linija na koje se može primijeniti agregatne funkcije (COUNT, MIN, MAX, AVG i SUM). Ako ova klauzula nedostaje i ako se koriste agregatne funkcije, tada se koriste svi stupci s imenima navedenim u SELECT, treba uključiti u agregatne funkcije, a ove funkcije će se primijeniti na cijeli skup redova koji zadovoljavaju predikat upita. Inače sve kolone SELECT lista, nisu uključeni u agregatnim funkcijama moraju biti specificirane u klauzuli GROUP BY. Kao rezultat toga, svi redovi izlaznog upita podijeljeni su u grupe koje karakteriziraju iste kombinacije vrijednosti u ovim stupcima. Nakon toga, agregatne funkcije će se primijeniti na svaku grupu. Imajte na umu da se za GROUP BY sve NULL vrijednosti tretiraju kao jednake, tj. kada se grupiše po polju koje sadrži NULL vrijednosti, svi takvi redovi će pasti u jednu grupu.
Ako ako postoji klauzula GROUP BY, u klauzuli SELECT nema agregatnih funkcija, onda će upit jednostavno vratiti jedan red iz svake grupe. Ova funkcija, zajedno s ključnom riječi DISTINCT, može se koristiti za eliminaciju duplih redova u skupu rezultata.
Pogledajmo jednostavan primjer:
SELECT model, COUNT(model) AS Qty_model, AVG(cijena) AS prosječna cijena
SA PC-a
GROUP BY model;

U ovom zahtjevu se za svaki model PC-a utvrđuje njihov broj i prosječna cijena. Svi redovi sa istom vrijednošću modela čine grupu, a izlaz SELECT izračunava broj vrijednosti i prosječne vrijednosti cijene za svaku grupu. Rezultat upita bit će sljedeća tabela:
model Qty_model Prosječna_cijena
1121 3 850.0
1232 4 425.0
1233 3 843.33333333333337
1260 1 350.0

Kada bi SELECT imao stupac datuma, tada bi bilo moguće izračunati ove indikatore za svaki određeni datum. Da biste to učinili, morate dodati datum kao kolonu za grupisanje, a zatim će se agregatne funkcije izračunati za svaku kombinaciju vrijednosti (model-datum).

Postoji nekoliko specifičnih pravila za obavljanje agregatnih funkcija:

  • Ako kao rezultat zahtjeva nije primljen nijedan red(ili više od jednog reda za datu grupu), tada nema izvornih podataka za izračunavanje bilo koje od agregatnih funkcija. U ovom slučaju, rezultat funkcija COUNT bit će nula, a rezultat svih ostalih funkcija će biti NULL.
  • Argument agregatna funkcija ne može sama sadržavati agregatne funkcije(funkcija od funkcije). One. u jednom upitu nemoguće je, recimo, dobiti maksimum prosječnih vrijednosti.
  • Rezultat izvršavanja funkcije COUNT je cijeli broj(INTEGER). Druge agregatne funkcije nasljeđuju tipove podataka vrijednosti koje obrađuju.
  • Ako funkcija SUM proizvede rezultat koji je veći od maksimalne vrijednosti korištenog tipa podataka, greška.

Dakle, ako zahtjev ne sadrži GROUP BY klauzule, To agregatne funkcije uključeno u SELECT klauzula, izvršavaju se na svim rezultujućim redovima upita. Ako zahtjev sadrži GROUP BY klauzula, svaki skup redova koji ima iste vrijednosti stupca ili grupe kolona navedenih u GROUP BY klauzula, čini grupu i agregatne funkcije izvode se za svaku grupu posebno.

HAVING ponudu

Ako WHERE klauzula onda definira predikat za filtriranje redova HAVING ponudu primjenjuje nakon grupisanja za definiranje sličnog predikata koji filtrira grupe prema vrijednostima agregatne funkcije. Ova klauzula je potrebna za validaciju vrijednosti koje su dobivene korištenjem agregatna funkcija ne iz pojedinačnih redova izvora zapisa definiranog u FROM klauzula, i od grupe takvih linija. Stoga takva provjera ne može biti sadržana u WHERE klauzula.

Da bi se sumirale informacije sadržane u bazi podataka, SQL pruža agregatne funkcije. Agregatna funkcija uzima cijeli stupac podataka kao argument i vraća jednu vrijednost koja sažima taj stupac na specifičan način.

Na primjer, agregat AVG funkcija() uzima kolonu brojeva kao argument i izračunava njihov prosjek.

Da biste izračunali prosječni prihod po glavi stanovnika Zelenograda, potreban vam je sljedeći upit:

ODABERITE 'PROSJEČNI PRIHODI PO GLAVNIKU=', AVG(SUMD)

SQL ima šest agregatnih funkcija koje vam omogućavaju da dobijete različite vrste sažetak informacija (slika 1):

– SUM() izračunava zbir svih vrijednosti sadržanih u stupcu;

– AVG() izračunava prosek vrednosti sadržanih u koloni;

– MIN() pronalazi najmanju od svih vrijednosti sadržanih u stupcu;

– MAX() pronalazi najveću među svim vrijednostima sadržanim u stupcu;

– COUNT() broji broj vrijednosti sadržanih u stupcu;

– COUNT(*) broji broj redova u tabeli rezultata upita.

Argument agregatnoj funkciji može biti jednostavno ime stupca, kao u prethodnom primjeru, ili izraz, kao u sljedećem upitu, koji specificira izračun prosječnog poreza po glavi stanovnika:

ODABIR PROSJEČNOG (SUMD*0,13)

Ovaj upit kreira privremenu kolonu koja sadrži vrijednosti (SUMD*0,13) za svaki red tablice PERSON, a zatim izračunava prosjek privremene kolone.

Iznos prihoda za sve stanovnike Zelenograda može se izračunati pomoću agregatne funkcije ZBIR:

ODABERITE ZUM(SUM) OD OSOBE

Agregatna funkcija se također može koristiti za izračunavanje ukupnih vrijednosti iz tablice rezultata dobivene spajanjem nekoliko izvornih tablica. Na primjer, možete izračunati ukupan iznos prihodi koji građani primaju iz izvora pod nazivom “Stipendija”:

ODABIR SUMU (NOVAC)

OD PROFITA, HAVE_D

WHERE PROFIT.ID=IMAM_D.ID

AND PROFIT.SOURCE=’Stipendija’

Agregatne funkcije MIN() i MAX() vam omogućavaju da pronađete najmanju i najveću vrijednost u tabeli. Kolona može sadržavati numeričke ili nizove vrijednosti, ili vrijednosti datuma ili vremena.

Na primjer, možete definirati:

(a) najniži ukupan prihod koji su rezidenti primili i najveći porez koji se plaća:

ODABIR MIN(SUMD), MAX(SUMD*0,13)

(b) datumi rođenja najstarijeg i najmlađeg stanovnika:

ODABIR MIN (DATUM), MAX (DATUM)

(c) prezimena, imena i patronimike prvih i poslednjih stanovnika na spisku, poredani abecednim redom:

ODABIR MIN(FIO), MAX(FIO)

Kada koristite ove agregatne funkcije, morate imati na umu da se numerički podaci uspoređuju pomoću aritmetičkih pravila, datumi se porede uzastopno (ranije vrijednosti datuma se smatraju manjim od kasnijih), a vremenski intervali se uspoređuju na osnovu njihovog trajanja.

Kada koristite funkcije MIN() i MAX() sa nizovima podataka, rezultat poređenja dva niza ovisi o korištenoj tablici kodiranja znakova.

Agregatna funkcija COUNT() broji broj vrijednosti u stupcu bilo koje vrste:

(a) koliko stanova ima u 1. mikrookrugu?

ODABIR BROJ(ADR) IZ STANA GDJE ADR LIKE "%, 1_ _-%"

(b) koliko stanovnika ima izvore prihoda?

ODABIR BROJ(DISTINCT NOM) OD HAVE_D

(c) koliko izvora prihoda koriste stanovnici?

SELECT COUNT(DISTINCT ID) FROM HAVE_D (Ključna riječ DISTINCT specificira da se broje neduplicirane vrijednosti u koloni).

Posebna agregatna funkcija COUNT(*) broji redove u tablici rezultata, a ne vrijednosti podataka:

(a) koliko stanova ima u 2. mikrookrugu?

ODABIR BROJ(*) IZ STANA GDJE ADR LIKE "%, 2__-%"

(b) koliko izvora prihoda ima Ivan Ivanovič Ivanov?

SELECT COUNT(*) FROM PERSON, HAVE_D WHERE FIO="Ivanov Ivan Ivanovič" I PERSON.NOM=HAVE_D.NOM

(c) koliko stanovnika živi u stanu na određenoj adresi?

SELECT COUNT(*) FROM PERSON WHERE ADR="Zelenograd, 1001-45"

Jedan od načina da se shvati kako se izvode zbirni upiti sa agregatnim funkcijama je da zamislite da je izvršenje upita podijeljeno na dva dijela. Prvo, utvrđujemo kako bi upit funkcionirao bez agregatnih funkcija, vraćajući više redova rezultata. Agregatne funkcije se zatim primjenjuju na rezultate upita, vraćajući jedan rezultujući red.

Na primjer, razmotrite sljedeći složeni upit: pronađite prosječan ukupni prihod po glavi stanovnika, zbir ukupnog prihoda stanovnika i prosječan prinos izvora kao procenat ukupnog prihoda stanovnika. Operater daje odgovor

ODABERITE AVG(SUMD), SUM(SUMD), (100*AVG(NOVAC/SUMD)) IZ OSOBE, PROFIT, HAVE_D GDJE PERSON.NOM=IMA_D.NOM I HAVE_D.ID=PROFIT.ID

Bez agregatnih funkcija, upit bi izgledao ovako:

ODABIR SUMD, SUMD, NOVAC/SUMD OD OSOBE, PROFIT, HAVE_D GDJE PERSON.NOM=IMA_D.NOM I HAVE_D.ID=PROFIT.ID

i vratio bi jedan red rezultata za svakog stanovnika i određeni izvor prihoda. Agregatne funkcije koriste stupce tablice rezultata upita da proizvedu tablicu jednog reda sa rezimenim rezultatima.

Možete navesti agregatnu funkciju u vraćenom redu kolone umjesto imena bilo kojeg stupca. Na primjer, može biti dio izraza koji dodaje ili oduzima vrijednosti dvije agregatne funkcije:

ODABERITE MAX(SUMD)-MIN(SUMD) OD OSOBE

Međutim, agregatna funkcija ne može biti argument drugoj agregatnoj funkciji, tj. Ugniježđene agregatne funkcije su zabranjene.

Također, lista vraćenih stupaca ne može istovremeno koristiti agregatne funkcije i regularna imena kolona, ​​jer to nema smisla, na primjer:

ODABERITE FIO, SUM(SUMD) OD OSOBE

Ovdje prvi element liste nalaže DBMS-u da kreira tabelu koja će se sastojati od nekoliko redova i sadržavati jedan red za svakog korisnika. Drugi element liste traži od DBMS-a da dobije jednu vrijednost rezultata, koja je zbir vrijednosti u SUMD koloni. Ove dvije upute su u suprotnosti jedna s drugom, što rezultira greškom.

Gore navedeno ne važi za slučajeve obrade potupita i upita sa grupisanjem.

GROUP BY klauzula(Izrazi SELECT) vam omogućavaju grupiranje podataka (redova) prema vrijednosti stupca ili nekoliko stupaca ili izraza. Rezultat će biti skup sažetih redova.

Svaki stupac na listi za odabir mora se pojaviti u klauzuli GROUP BY, s izuzetkom konstanti i stupaca operanda agregatne funkcije.

Možete grupirati tabelu prema bilo kojoj kombinaciji njenih kolona.

Agregatne funkcije se koriste za dobivanje jedne ukupne vrijednosti iz grupe redova. Sve agregatne funkcije izvode izračune na jednom argumentu, koji može biti ili stupac ili izraz. Rezultat bilo kojeg izračunavanja agregatne funkcije je konstantna vrijednost prikazana u zasebnoj koloni rezultata.

Agregatne funkcije navedene su u listi stupaca SELECT izraza, koji također može sadržavati klauzulu GROUP BY. Ako izraz SELECT nema GROUP BY klauzulu i lista odabranih stupaca sadrži najmanje, jedna agregatna funkcija, onda ne bi trebao sadržavati jednostavne stupce. S druge strane, lista za odabir stupaca može sadržavati nazive stupaca koji nisu argumenti agregatnoj funkciji ako su ti stupci argumenti klauzule GROUP BY.

Ako upit sadrži klauzulu WHERE, tada agregatne funkcije izračunavaju vrijednost za rezultate odabira.

Agregatne funkcije MIN i MAX izračunajte najmanji i najveća vrijednost kolona shodno tome. Argumenti mogu biti brojevi, nizovi i datumi. Sve NULL vrijednosti se brišu prije izračuna (odnosno, ne uzimaju se u obzir).

Agregatna funkcija SUM izračunava ukupan zbir vrijednosti kolone. Argumenti mogu biti samo brojevi. Korištenje parametra DISTINCT eliminira sve duple vrijednosti u stupcu prije primjene funkcije SUM. Isto tako, sve NULL vrijednosti se uklanjaju prije primjene ove agregatne funkcije.

AVG agregatna funkcija vraća prosjek svih vrijednosti u koloni. Argumenti također mogu biti samo brojevi, a sve NULL vrijednosti se uklanjaju prije evaluacije.

Agregatna funkcija COUNT ima dva različita oblika:

  • COUNT(col_name) - broji broj vrijednosti u koloni Col_name, NULL vrijednosti se ne uzimaju u obzir
  • COUNT(*) - broji broj redova u tabeli, uzimaju se u obzir i NULL vrijednosti

Ako zahtjev koristi ključna riječ DISTINCT, uklanja sve duplicirane vrijednosti stupaca prije upotrebe funkcije COUNT.

COUNT_BIG funkcija slično funkciji COUNT. Jedina razlika između njih je tip rezultata koji vraćaju: funkcija COUNT_BIG uvijek vraća vrijednosti tipa BIGINT, dok funkcija COUNT vraća vrijednosti podataka tipa INTEGER.

IN HAVING ponudu definira uvjet koji se primjenjuje na grupu redova. Ima isto značenje za grupe redova kao klauzula WHERE za sadržaj odgovarajuće tabele (WHERE se primenjuje pre grupisanja, HAVING posle).



  • Agregatne funkcije koristi se slično imenima polja u SELECT izraz, ali sa jednim izuzetkom: oni uzimaju ime polja kao argument. Sa funkcijama SUMA I AVG može se koristiti samo numerička polja. Sa funkcijama COUNT, MAX i MIN Mogu se koristiti i numerička i znakovna polja. Kada se koristi sa znakovnim poljima MAX I MINće ih prevesti u ekvivalent ASCII koda i obraditi ih abecedni red. Neki DBMS-ovi dozvoljavaju upotrebu ugniježđenih agregata, ali to je odstupanje od ANSI standarda sa svim posljedicama koje iz toga proizlaze.


Na primjer, možete izračunati broj studenata koji su polagali ispite u svakoj disciplini. Da biste to učinili, trebate pokrenuti upit grupiran po polju „Disciplina“ i kao rezultat prikazati naziv discipline i broj redova u grupi za ovu disciplinu. Upotreba znaka * kao argumenta funkciji COUNT znači brojanje svih redova u grupi.

SELECT R1. Disciplina, COUNT(*)

GROUP BY R1.Discipline;

rezultat:


SELECT R1.Disciplina, COUNT (*)

GDJE R1. Evaluacija NIJE NULL

GROUP BY R1.Discipline;

rezultat:


neće biti uključeni u skup torki prije grupisanja, tako da će broj torki u grupi za disciplinu “Teorija informacija” biti 1 manji.

Sličan rezultat možete dobiti ako napišete upit na sljedeći način:

SELECT R1. Disciplina, COUNT(R1. Ocjena)

GRUPA PO R1. Disciplina;

Funkcija COUNT (NAZIV ATRIBUTA) broji broj specifičnih vrijednosti u grupi, za razliku od funkcije COUNT(*), koji broji broj redova u grupi. Doista, u grupi sa disciplinom "Teorija informacija" bit će 4 reda, ali samo 3 specifične vrijednosti za atribut "Evaluacija".


Pravila obrade NULL vrijednosti u agregatnim funkcijama

Ako su bilo koje vrijednosti u koloni jednake NULL Prilikom izračunavanja rezultata funkcije oni su isključeni.

Ako su sve vrijednosti u koloni jednake NULL, To Max Min sum Avg = NULL count = 0 (nula).

Ako je tabela prazna, count(*) = 0 .

Možete koristiti i agregatne funkcije bez operacije prethodnog grupisanja, u kom slučaju se cijela relacija tretira kao jedna grupa i za ovu grupu možete izračunati jednu vrijednost po grupi.

Pravila za tumačenje agregatnih funkcija

Agregatne funkcije mogu biti uključene u izlaznu listu i onda se primjenjuju na cijelu tablicu.

SELECT MAX (Evaluacija) od R1 daće maksimalnu ocjenu tokom sesije;

SELECT SUM (Score) od R1će dati zbir svih ocjena za sesiju;

ODABRAJTE AVG(Rating) iz R1će dati prosječnu ocjenu za cijelu sesiju.


2; Rezultat: " width="640"

Vraćajući se ponovo na bazu podataka “Session” (tabela R1), nalazimo broj uspješno položenih ispita:

SELECT COUNT(*) As Isporučeno _ ispiti

WHERE Ocena 2;

rezultat:


Argumenti agregatnim funkcijama mogu biti pojedinačni stupci tabele. Da bi se izračunao, na primjer, broj različita značenja neke kolone u grupi, morate koristiti ključnu riječ DISTINCT zajedno sa imenom kolone. Izračunajmo broj različitih ocjena dobijenih u svakoj disciplini:

SELECT R1.Discipline, COUNT (DISTINCT R1.Evaluation)

GDJE R1. Evaluacija NIJE NULL

GROUP BY R1.Discipline;

rezultat:


Isti rezultat se dobija ako izuzmemo eksplicitni uslov u dijelu WHERE, u kom slučaju će upit izgledati ovako:

SELECT R1. Disciplina, COUNT(DISTINCT R1. Ocjena)

GRUPA PO R1. Disciplina;

Funkcija COUNT (DISTINCT R1.Evaluacija) računa se samo izvesno razne značenja.

Da bi se u ovom slučaju dobilo željeni rezultat, potrebno je izvršiti preliminarnu konverziju tipa podataka kolone „Ocjena“, dovodeći ga do realnog tipa, tada rezultat izračunavanja prosjeka neće biti cijeli broj. U ovom slučaju zahtjev će izgledati ovako:


2 Grupirajte po R2. Grupa, R1. Disciplina; Ovdje funkcija CAST() pretvara stupac Score u važeći tip podataka. "width="640"

Odaberite R2.Grupa, R1.Disciplina,Broj(*) kao Total, AVG(cast(Score kao decimalni(3,1))) kao Prosječan_score

Od R1,R2

gdje je R1. Puno ime = R2. Puno ime i R1. rezultat nije nul

i R1. Rezultat 2

Grupirajte po R2. Grupa, R1. Disciplina;

Evo funkcije CAST() Pretvara stupac Ocjena u važeći tip podataka.


Ne možete koristiti agregatne funkcije u klauzuli WHERE jer se uvjeti u ovom odjeljku procjenjuju u smislu jednog reda, a agregatne funkcije se procjenjuju u smislu grupa redova.

Klauzula GROUP BY vam omogućava da definirate podskup vrijednosti u određenom polju u smislu drugog polja i primijenite agregatnu funkciju na podskup. Ovo omogućava kombiniranje polja i agregatnih funkcija u jednoj SELECT klauzuli. Agregatne funkcije se mogu koristiti i u izlaznom izrazu SELECT linije, a u izrazu uvjeta za obradu formirane grupe HAVING. U ovom slučaju, svaka agregatna funkcija se izračunava za svaku odabranu grupu. Vrijednosti dobijene iz izračunavanja agregatnih funkcija mogu se koristiti za prikaz odgovarajućih rezultata ili za uslovljavanje odabira grupa.

Napravimo upit koji prikazuje grupe u kojima je na ispitima dobijeno više od jedne loše ocjene u jednoj disciplini:


1; Rezultat: " width="640"

SELECT R2. Grupa

OD R1,R2

GDJE R1. Puno ime = R2. Puno ime AND

R1.Score = 2

GRUPA PO R2.Grupa, R1.Disciplina

IMAJUĆI broj(*) 1;

rezultat:


Imamo bazu podataka „Banka“, koja se sastoji od jedne tabele F, u kojoj se čuva relacija F koja sadrži podatke o računima u filijalama određene banke:

Pronađite ukupno stanje na računima u filijalama. Možete napraviti poseban upit za svaku od njih odabirom SUM (Stanje) iz tabele za svaku granu, ali operacija grupacije GROUP BY će vam omogućiti da ih sve stavite u jednu naredbu:

SELECT Filijala , SUMA( Ostatak )

GROUP BY Ogranak;

GROUP BY primjenjuje agregatne funkcije nezavisno na svaku grupu identificiranu vrijednošću polja Grana. Grupa se sastoji od linija sa istu vrijednost Polja Grana i funkcija SUMA primjenjuje se posebno za svaku takvu grupu, odnosno ukupno stanje računa se obračunava posebno za svaku filijalu. Vrijednost polja na koje se odnosi GROUP BY, po definiciji, ima samo jednu vrijednost po izlaznoj grupi, baš kao rezultat agregatne funkcije.


5.000; Argumenti u klauzuli HAVING slijede ista pravila kao u klauzuli SELECT koja koristi GROUP BY. Moraju imati jednu vrijednost po izlaznoj grupi. "width="640"

Pretpostavimo da biramo samo one filijale čija ukupna stanja na računu prelaze 5.000 USD, kao i ukupna stanja za odabrane filijale. Da biste prikazali rezultate za filijale sa ukupnim stanjem preko 5.000 USD, morate koristiti klauzulu HAVING. Klauzula HAVING specificira kriterije koji se koriste za uklanjanje određenih grupa iz izlaza, baš kao što klauzula WHERE radi za pojedinačne redove.

Ispravna naredba bi bila:

SELECT Ogranak, ZBIR (preostalo)

GROUP BY Filijala

IMATI SUM ( Ostatak ) 5 000;

Argumenti u rečenici HAVING pridržavati se istih pravila kao u rečenici SELECT gdje se koristi GROUP BY. Moraju imati jednu vrijednost po izlaznoj grupi.


Sljedeća naredba će biti zabranjena:

SELECT grana,SUM(preostalo)

GRUPA PO Ogranku

IMAJUĆI Datum otvaranja = 27.12.2004 ;

Polje Datum otvaranja ne može se koristiti u rečenici HAVING, jer može imati više od jedne vrijednosti po izlaznoj grupi. Da biste izbjegli takvu situaciju, prijedlog HAVING treba referencirati samo odabrane agregate i polja GROUP BY. Dostupan Pravi put uputite gore navedeni zahtjev:

SELECT grana,SUM(preostalo)

WHEREOpenDate = '27/12/2004'

GROUP BY Ogranak;


Značenje ovog zahtjeva sljedeće: pronađite zbir stanja za svaku filijalu računa otvorenih 27. decembra 2004.

Kao što je ranije rečeno, HAVING može uzeti samo argumente koji imaju jednu vrijednost po izlaznoj grupi. U praksi, reference na agregatne funkcije su najčešće, ali polja odabrana pomoću GROUP BY su također važeća. Na primjer, želimo vidjeti ukupna stanja na računima filijala u Sankt Peterburgu, Pskovu i Uryupinsku:

SELECT Ogranak, ZBIR (preostalo)

OD F,Q

GDJE F. Ogranak = Q. Ogranak

GRUPA PO Ogranku

HAVING Ogranak U („Sankt Peterburg“, „Pskov“, „Urjupinsk“);

100.000; Ako je ukupni saldo veći od 100.000$, tada ćemo ga vidjeti u rezultirajućem odnosu, inače ćemo dobiti praznu relaciju. "width="640"

Stoga, samo specifikacije stupaca specificiranih kao kolone za grupisanje u klauzuli GROUP BY mogu se direktno koristiti u predikatnim aritmetičkim izrazima uključenim u klauzulu za odabir klauzule HAVING. Preostale kolone se mogu specificirati samo unutar specifikacija agregatnih funkcija COUNT, SUM, AVG, MIN i MAX, koje se izračunavaju u u ovom slučaju neki agregatna vrijednost za cijelu grupu redova. Rezultat izvršavanja sekcije HAVING je grupisana tabela koja sadrži samo one grupe redova za koje je rezultat izračunavanja uslova izbora u sekciji HAVING TRUE. Konkretno, ako je klauzula HAVING prisutna u upitu koji ne sadrži GROUP BY, tada će rezultat njegovog izvršenja biti ili prazan sto, ili rezultat izvršavanja prethodnih sekcija tabelarni izraz, tretira se kao jedna grupa bez grupisanja kolona. Pogledajmo primjer. Recimo da želimo prikazati ukupna stanja za sve grane, ali samo ako je veća od $100 000. U ovom slučaju, naš upit neće sadržavati operacije grupisanja, već će sadržavati odjeljak HAVING i izgledat će ovako:

ODABIR SUM( Ostatak )

IMATI SUM( Ostatak ) 100 000;

Ako je ukupni saldo veći od 100.000$, tada ćemo ga vidjeti u rezultirajućem odnosu, inače ćemo dobiti praznu relaciju.


prema vrijednosti kolone Disciplina. Dobit ćemo 4 grupe za koje možemo izračunati neke grupne vrijednosti, kao što je broj tuple u grupi, maksimalna ili minimalna vrijednost stupca Score. Tabela 5.7. Agregatne funkcije
Funkcija Rezultat
COUNT Broj redova ili vrijednosti polja koje nisu prazne koje je upit odabrao
SUMA Zbir svih odabranih vrijednosti za ovo polje
AVG Aritmetička sredina svih odabranih vrijednosti za ovo polje
MIN Najmanja od svih odabranih vrijednosti za ovo polje
MAX Najveća od svih odabranih vrijednosti za ovo polje
R1
Puno ime Disciplina Ocjena
Grupa 1 Petrov F.I. Baza podataka 5
Sidorov K. A. Baza podataka 4
Mironov A.V. Baza podataka 2
Stepanova K. E. Baza podataka 2
Krylova T. S. Baza podataka 5
Vladimirov V. A. Baza podataka 5
Grupa 2 Sidorov K. A. Teorija informacija 4
Stepanova K. E. Teorija informacija 2
Krylova T. S. Teorija informacija 5
Mironov A.V. Teorija informacija Null
Grupa 3 Trofimov P. A. Mreže i telekomunikacije 4
Ivanova E. A. Mreže i telekomunikacije 5
Utkina N.V. Mreže i telekomunikacije 5
Grupa 4 Vladimirov V. A. engleski jezik 4
Trofimov P. A. engleski jezik 5
Ivanova E. A. engleski jezik 3
Petrov F.I. engleski jezik 5

Agregatne funkcije koriste se slično imenima polja u SELECT naredbi, ali s jednim izuzetkom: uzimaju ime polja kao argument. Sa funkcijama SUM i AVG mogu se koristiti samo numerička polja. I numerička i karakterna polja mogu se koristiti sa funkcijama COUNT, MAX i MIN. Kada se koriste sa znakovnim poljima, MAX i MIN će ih prevesti u ekvivalentni ASCII kod i obraditi ih po abecednom redu. Neki DBMS-ovi dozvoljavaju upotrebu ugniježđenih agregata, ali to je odstupanje od ANSI standarda sa svim posljedicama koje iz toga proizlaze.

Na primjer, možete izračunati broj studenata koji su polagali ispite u svakoj disciplini. Da biste to učinili, trebate pokrenuti upit grupiran po polju "Disciplina" i kao rezultat prikazati naziv discipline i broj redova u grupi za ovu disciplinu. Upotreba znaka * kao argumenta funkciji COUNT znači brojanje svih redova u grupi.

ODABIR R1.Disciplina, COUNT(*) IZ R1 GRUPA PO R1.Disciplina

rezultat:

Ako želimo da izbrojimo broj ljudi koji su položili ispit u bilo kojoj disciplini, onda moramo isključiti nesigurne vrijednosti iz originalnog omjera prije grupiranja. U ovom slučaju zahtjev će izgledati ovako:

Dobijamo rezultat:

U ovom slučaju, linija sa učenikom

Mironov A.V. Teorija informacija Null

neće pasti u skup tuple prije grupisanja, tako da broj torki u grupi treba disciplinirati " Teorija informacija" će biti 1 manje.

Može biti korišteno agregatne funkcije takođe bez operacije prethodnog grupisanja, u kom slučaju se cela relacija smatra jednom grupom i za ovu grupu se može izračunati jedna vrednost po grupi.

Vraćajući se ponovo na bazu podataka “Session” (tabele R1, R2, R3), nalazimo broj uspješno položenih ispita:

Ovo se naravno razlikuje od odabira polja, jer se uvijek vraća jedna vrijednost, bez obzira na to koliko redova ima u tabeli. Argument agregatne funkcije mogu postojati odvojene kolone tabele. Ali da biste izračunali, na primjer, broj različitih vrijednosti određene kolone u grupi, morate koristiti ključnu riječ DISTINCT zajedno s nazivom kolone. Izračunajmo broj različitih ocjena dobijenih u svakoj disciplini:

rezultat:

Rezultat može uključivati ​​vrijednost polja grupiranja i nekoliko agregatne funkcije, a u uslovima grupisanja možete koristiti više polja. U ovom slučaju, grupe se formiraju prema skupu specificiranih polja grupisanja. Operacije agregatne funkcije mogu se primijeniti za spajanje više izvornih tablica. Na primjer, postavimo pitanje: odredite za svaku grupu i svaku disciplinu broj studenata koji su uspješno položili ispit i prosječan rezultat u disciplini.

rezultat:

Ne možemo koristiti agregatne funkcije u klauzuli WHERE jer se predikati procjenjuju u smislu jednog reda, i agregatne funkcije- u smislu grupa linija.

Klauzula GROUP BY vam omogućava da definirate podskup vrijednosti u određenom polju u smislu drugog polja i primijenite agregatnu funkciju na podskup. Ovo omogućava kombinovanje polja i agregatne funkcije u jednoj SELECT klauzuli. Agregatne funkcije može se koristiti i u izrazu za izlaz rezultata SELECT linije, iu izrazu za uvjet obrade generiranih HAVING grupa. U ovom slučaju, svaka agregatna funkcija se izračunava za svaku odabranu grupu. Vrijednosti dobijene iz proračuna agregatne funkcije, može se koristiti za prikaz odgovarajućih rezultata ili za uslovljavanje odabira grupa.

Napravimo upit koji prikazuje grupe u kojima je na ispitima dobijeno više od jedne loše ocjene u jednoj disciplini:

Ubuduće, kao primjer, nećemo raditi sa bazom podataka „Session“, već sa bazom podataka „Banka“, koja se sastoji od jedne tabele F, koja čuva relaciju F koja sadrži informacije o računima u filijalama određene banke:

F = (N, Puno ime, Filijala, Datum otvaranja, Datum zatvaranja, Stanje); Q = (Filijala, Grad);

budući da je na osnovu toga moguće jasnije ilustrovati rad sa agregatnim funkcijama i grupisanjem.

Na primjer, pretpostavimo da želimo pronaći ukupni saldo bankovnih računa. Možete napraviti poseban upit za svaku od njih odabirom SUM(Stanje) iz tabele za svaku granu. GROUP BY će vam, međutim, omogućiti da ih sve stavite u jednu naredbu:

SELECT grana, SUM(preostalo) FROM F GRUPA PO Ogranak;

GROUP BY se primjenjuje agregatne funkcije nezavisno za svaku grupu definisanu korišćenjem vrednosti polja Grana. Grupa se sastoji od redova sa istom vrijednošću polja Grana, i

Najbolji članci na ovu temu