Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Recenzije
  • Sql agregatne funkcije. INTERSECT i EXCEPT operatori

Sql agregatne funkcije. INTERSECT i EXCEPT operatori

Korištenje agregatnih funkcija

SQL definira mnoge ugrađene funkcije različitih kategorija, među kojima posebno mjesto zauzimaju agregatne funkcije koje rade na vrijednostima stupaca u skupu redaka i vraćaju jednu vrijednost. Argumenti agregatnih funkcija mogu biti i stupci tablice i rezultati izraza nad njima. Agregatne funkcije same se mogu uključiti u druge aritmetičke izraze. Sljedeća tablica navodi najčešće korištene standardne unarne agregatne funkcije.


Opći format unarne agregatne funkcije je sljedeći:

naziv_funkcije ([SVE | DISTINCT] izraz)

gdje DISTINCT označava da funkcija treba uzeti u obzir samo različite vrijednosti argumenata, a SVE - sve vrijednosti, uključujući duplicirane vrijednosti (ovo je zadana postavka). Na primjer, funkcija AVG s ključnom riječi DISTINCT za retke stupaca s vrijednostima 1, 1, 1 i 3 vratit će 2, a ako je prisutna ključna riječ ALL, vratit će 1,5.

Agregatne funkcije se koriste u klauzulama SELECT i HAVING. Ovdje ćemo pogledati njihovu upotrebu u klauzuli SELECT. U ovom slučaju, izraz u argumentu funkcije primjenjuje se na sve retke u ulaznoj tablici klauzule SELECT. Osim toga, agregatne funkcije i stupci tablice (ili izrazi s njima) ne mogu se koristiti u klauzuli SELECT osim ako klauzula GROUP BY, o kojoj ćemo raspravljati u sljedećem odjeljku, nije odsutna.

Funkcija COUNT ima dva formata. U prvom slučaju vraća se broj redaka u ulaznoj tablici, u drugom slučaju broj vrijednosti argumenata u ulaznoj tablici:

  • COUNT (*)
  • COUNT (izraz)

Najjednostavniji način korištenja ove funkcije je prebrojavanje broja redaka u tablici (svih ili zadovoljavajući specificirani uvjet). Za to se koristi prva sintaksa.

Upit: Broj vrsta proizvoda, informacije o kojima su dostupne u bazi podataka.

SELECT COUNT (*) AS "Broj vrsta proizvoda"

IZ proizvoda

U drugoj varijanti sintakse za funkciju COUNT, ime jednog stupca može se koristiti kao argument. U ovom slučaju broji se ili sve vrijednosti u ovom stupcu ulazne tablice ili samo vrijednosti koje se ne ponavljaju (kada se koristi ključna riječ DISTINCT).

Upit: broj različitih imena sadržanih u tablici kupaca.

ODABIR BROJA (DISTINCT FNAME)

OD Kupca

Korištenje ostatka unarnih agregatnih funkcija je isto kao i za COUNT, osim što je za funkcije MIN i MAX upotreba ključnih riječi DISTINCT i ALL besmislena. Uz numerička polja, znakovna polja mogu se koristiti s funkcijama COUNT, MAX i MIN. Ako argument agregatne funkcije ne sadrži nikakve vrijednosti, funkcija COUNT vraća 0, a svi ostali vraćaju NULL.

ODABIR MAX (Datum narudžbe)

IZ

GDJE Datum narudžbe "1.09.2010."

Zadatak za samostalno učenje: Formulirajte upite u SQL-u kako biste odabrali sljedeće podatke:

  • Ukupni trošak svih narudžbi;
  • Broj različitih gradova sadržanih u tablici kupaca.

Lekcija će pokriti temu sql preimenovanja stupca (polja) koristeći AS funkciju riječi; također je pokrio temu agregatnih funkcija u sql. Analizirat će se konkretni primjeri zahtjeva

Možete preimenovati nazive stupaca u upitima. To čini rezultate čitljivijim.

U SQL-u je preimenovanje polja povezano s upotrebom ključna riječ AS koji se koristi za preimenovanje naziva polja u skupovima rezultata

Sintaksa:

IZABERI<имя поля>KAO<псевдоним>IZ ...

Pogledajmo primjer preimenovanja u SQL-u:

Primjer DB "Institut": Prikažite imena nastavnika i njihove plaće, za one učitelje čije su plaće ispod 15000 preimenujte polje zarplata u "Niska plaća"


✍ Rješenje:

Preimenovanje stupaca u SQL-u često je potrebno prilikom izračunavanja vrijednosti povezanih s više polja tablice. Razmotrimo primjer:

Primjer DB "Institut": Iz tablice učitelja ispišite polje imena i izračunajte iznos plaće i bonusa, imenujući polje "Plaća_ nagrada"


✍ Rješenje:
1 2 SELECT naziv, (zarplata + premia) AS zarplata_premia OD učitelja;

SELECT naziv, (zarplata + premia) AS zarplata_premia OD učitelja;

Proizlaziti:

Agregatne funkcije u SQL-u

Agregatne funkcije u sql-u koriste se za dobivanje zbroja i izračunavanje izraza:

Sve agregatne funkcije vraćaju jednu vrijednost.

Funkcije COUNT, MIN i MAX primjenjuju se na bilo koju vrstu podataka.

Funkcije SUM i AVG koriste se samo za numerička polja.
Postoji razlika između funkcija COUNT (*) i COUNT (): druga ne uzima u obzir NULL vrijednosti prilikom brojanja.

Važno: pri radu sa agregatnim funkcijama u SQL-u koristi se posebna riječ KAO


Primjer DB "Institut": Dobijte vrijednost najveće plaće među nastavnicima, prikažite rezultat kao "Max_zp"


✍ Rješenje:
SELECT MAX (zarplata) AS max_zp FROM učitelja;

SELECT MAX (zarplata) AS max_zp FROM učitelja;

Rezultati:

Razmotrimo složeniji primjer korištenja agregatnih funkcija u sql-u.


✍ Rješenje:

GROUP BY klauzula u SQL-u

Klauzula group by u sql-u obično se koristi zajedno sa agregatnim funkcijama.

Agregatne funkcije izvode se na svim rezultirajućim recima upita. Ako upit sadrži klauzulu GROUP BY, svaki skup redaka naveden u klauzuli GROUP BY čini grupu i agregatne funkcije se izvršavaju za svaku grupu posebno.

Razmotrimo primjer s tablicom lekcija:

Primjer:

Važno: Dakle, kao rezultat korištenja GROUP BY, svi izlazni reci upita podijeljeni su u grupe koje karakteriziraju iste kombinacije vrijednosti u tim stupcima (tj. agregatne funkcije se izvode za svaku grupu zasebno).

Treba imati na umu da kada se grupiraju po polju koje sadrži NULL vrijednosti, svi takvi zapisi će pasti u jednu grupu.

Za različite vrste pisača odredite njihovu prosječnu cijenu i količinu (tj. zasebno za laser, inkjet i matrix). Koristite agregatne funkcije. Rezultat bi trebao izgledati ovako:

Imati SQL izjavu

Klauzula HAVING u SQL-u potrebna je za provjeru vrijednosti, koji se dobivaju pomoću agregatne funkcije nakon grupiranja(nakon korištenja GROUP BY). Takav ček ne može biti sadržan u klauzuli WHERE.

Primjer: Trgovina računala DB... Izračunajte prosječnu cijenu računala s istom brzinom procesora. Izračunajte samo za one grupe čija je prosječna cijena manja od 30.000.



  • Agregatne funkcije koriste se kao nazivi polja u SELECT izrazu, s jednom iznimkom: uzimaju ime polja kao argument. S funkcijama IZNOS i PROSJEČAN mogu se koristiti samo numerička polja. S funkcijama COUNT, MAX i MIN mogu se koristiti i numerička i znakovna polja. Kada se koristi s poljima znakova MAX i MINće ih prevesti u ASCII ekvivalent i obraditi ih abecednim redom. Neki DBMS-ovi dopuštaju korištenje 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 položili ispite u svakoj disciplini. Da biste to učinili, trebate izvršiti upit grupiran po polju "Disciplina" i kao rezultat prikazati naziv discipline i broj redaka u grupi za ovu disciplinu. Korištenje znaka * kao argumenta funkciji COUNT znači da se broje svi redovi u grupi.

ODABIR R1. Disciplina, COUNT (*)

GRUPA PO R1. Disciplina;

Proizlaziti:


SELECT R1 Discipline, COUNT (*)

GDJE R1. NIJE NULL rezultat

GRUPA PO R1. Disciplina;

Proizlaziti:


neće biti uključeni u skup torki prije grupiranja, pa će broj torki u skupini za disciplinu "Teorija informacija" biti 1 manji.

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

ODABIR R1. Disciplina, COUNT (R1. Ocjena)

GRUPA PO R1. Disciplina;

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


Pravila za rukovanje nultim vrijednostima u agregatnim funkcijama

Ako su bilo koje vrijednosti u stupcu jednake NULL isključeni su pri izračunu rezultata funkcije.

Ako su sve vrijednosti u stupcu jednake NULL, onda Maks. min. zbroj prosj = NULL, count = 0 (nula).

Ako je tablica prazna, broj (*) = 0 .

Agregatne funkcije se također mogu koristiti bez preliminarne operacije grupiranja, u ovom slučaju se cijela relacija smatra jednom grupom i za ovu grupu može se izračunati jedna vrijednost po grupi.

Pravila za tumačenje agregatnih funkcija

Agregatne funkcije mogu se uključiti u popis izlaza, a zatim se primjenjuju na cijelu tablicu.

SELECT MAX (ocjena) od R1 dat će maksimalnu ocjenu na sjednici;

ODABIR ZBOR iz R1 dat će zbroj svih ocjena po sjednici;

ODABIR PROSJEČAN (Score) iz R1 dat će prosječnu ocjenu za cijelu sesiju.


2; Rezultat: "width =" 640"

Ponovo se pozivajući na bazu podataka Session (tablice R1), pronaći ćemo broj uspješno položenih ispita:

SELECT COUNT (*) As Iznajmljeno _ ispiti

GDJE Razred 2;

Proizlaziti:


Argument agregatnih funkcija mogu biti zasebni stupci tablica. Da bi se izračunao, na primjer, broj različitih vrijednosti određenog stupca u grupi, potrebno je koristiti ključnu riječ DISTINCT zajedno s nazivom stupca. Izračunajmo broj različitih ocjena dobivenih za svaku disciplinu:

SELECT R1 disciplina, COUNT (DISTINCT R1 evaluacija)

GDJE R1. NIJE NULL rezultat

GRUPA PO R1. Disciplina;

Proizlaziti:


Isti rezultat se dobiva ako izuzmete eksplicitni uvjet u dijelu WHERE, u kojem slučaju će upit izgledati ovako:

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

GRUPA PO R1. Disciplina;

Funkcija COUNT (DISTINCT R1. Evaluation) smatra samo izvjesnim razne vrijednosti.

Da bi se u ovom slučaju dobio željeni rezultat, potrebno je izvršiti preliminarnu transformaciju tipa podataka stupca "Score", dovodeći ga do realnog tipa, a 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. "širina =" 640"

Odaberite R2.Grupa, R1.Disciplina, Count (*) kao Total, AVG (cast (Rezultat kao decimalni (3,1))) kao Prosječni_bod

Od R1, R2

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

i R1. 2. razred

Grupirajte po R2. Grupa, R1. Disciplina;

Ovdje je funkcija ULOGE () pretvara stupac Score u važeći tip podataka.


Ne možete koristiti agregatne funkcije u klauzuli WHERE jer se uvjeti u ovom odjeljku vrednuju u smislu jednog retka, a agregatne funkcije vrednuju se u smislu grupa redaka.

Klauzula GROUP BY omogućuje vam definiranje podskupa vrijednosti u određenom polju u smislu drugog polja i primjenu agregatne funkcije na podskup. To omogućuje kombiniranje polja i agregatnih funkcija u jednu klauzulu SELECT. Agregatne funkcije mogu se koristiti i u izrazu za ispis rezultata SELECT retka i u izrazu za obradu generiranih HAVING grupa. U ovom slučaju, svaka se agregatna funkcija izračunava za svaku odabranu skupinu. Vrijednosti dobivene pri izračunu agregatnih funkcija mogu se koristiti za prikaz odgovarajućih rezultata ili za uvjet odabira grupa.

Konstruirajmo upit koji prikazuje grupe u kojima je na ispitima dobiveno više od jedne dvojke u jednoj disciplini:


jedan; Rezultat: "width =" 640"

ODABIR R2. Skupina

IZ R1, R2

GDJE R1. Puno ime = R2. Ime I

R1 rezultat = 2

GRUPA PO R2. Grupa, R1. Disciplina

IMATI broj (*) 1;

Proizlaziti:


Imamo DB "Banka", koja se sastoji od jedne tablice F, koja pohranjuje relaciju F, koja sadrži podatke o računima u poslovnicama određene banke:

Pronađite ukupno stanje računa u poslovnicama. Možete napraviti zaseban upit za svaku od njih odabirom SUM iz tablice za svaku granu, ali operacija GROUP BY stavit će ih sve u jednu naredbu:

IZABERI Podružnica , SUM ( Ostatak )

GRUPA PO Ogranak;

GRUPA PO primjenjuje agregatne funkcije neovisno za svaku grupu identificiranu vrijednošću polja Grana. Grupa se sastoji od redaka s istom vrijednošću polja Grana i funkcije IZNOS primjenjuje se zasebno za svaku takvu grupu, tj. ukupno stanje računa se obračunava posebno za svaku podružnicu. Vrijednost polja na koje se odnosi GRUPA PO, ima, po definiciji, samo jednu vrijednost po izlaznoj grupi, kao i rezultat agregatne funkcije.


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

Pretpostavimo da odaberete samo one podružnice čija ukupna vrijednost stanja računa prelazi 5.000 USD, kao i ukupna stanja za odabrane poslovnice. Za prikaz podružnica s ukupnim stanjem iznad 5000 USD, morate koristiti klauzulu HAVING. Klauzula HAVING definira kriterije koji se koriste za uklanjanje određenih grupa iz izlaza, baš kao što to čini klauzula WHERE za pojedinačne retke.

Ispravna naredba bi bila sljedeća:

SELECT grana, SUM (Stanje)

GRUPA PO Podružnica

IMATI SUM ( Ostatak ) 5 000;

Argumenti u rečenici IMATI poštivati ​​ista pravila kao u rečenici IZABERI gdje se koristi GRUPA PO... Moraju imati jednu vrijednost po izlaznoj grupi.


Sljedeća naredba bit će zabranjena:

SELECT grana, SUM (Stanje)

GRUPA PO Ogranak

OTVORENI Datum = 27.12.2004 ;

Polje Datum otvaranja ne može se koristiti u rečenici IMATI jer može imati više od jedne vrijednosti po grupi prikaza. Kako bi se izbjegla takva situacija, prijedlog IMATI treba se odnositi samo na agregate i odabrana polja GRUPA PO... Postoji ispravan način za postavljanje gornjeg upita:

SELECT grana, SUM (Stanje)

WHERE Datum otvaranja = '27./12.2004.'

GRUPA PO Ogranak;


Značenje ovog upita je sljedeće: pronađite iznos stanja za svaku podružnicu računa otvorenih 27. prosinca 2004. godine.

Kao što je ranije rečeno, HAVING može koristiti samo argumente koji imaju istu vrijednost po izlaznoj grupi. U praksi su reference na agregatne funkcije najopćenitije, ali polja odabrana s GROUP BY također su važeća. Na primjer, želimo vidjeti ukupna stanja računa podružnica u Sankt Peterburgu, Pskovu i Uryupinsku:

SELECT grana, SUM (Stanje)

IZ F, Q

GDJE F. Grana = Q. Grana

GRUPA PO Ogranak

HAVING Ogranak U ('Sankt Peterburg', 'Pskov', 'Uryupinsk');

100.000; Ako je ukupni saldo veći od 100.000 USD, tada ćemo ga vidjeti u rezultirajućem omjeru, inače ćemo dobiti prazan omjer. "širina =" 640"

Stoga, u aritmetičkim izrazima predikata uključenih u uvjet odabira klauzule HAVING, možete izravno koristiti samo specifikacije stupaca navedenih kao grupiranje stupaca u klauzuli GROUP BY. Ostatak stupaca može se specificirati samo unutar specifikacija agregatnih funkcija COUNT, SUM, AVG, MIN i MAX, koje u ovom slučaju izračunavaju neku agregatnu vrijednost za cijelu grupu redaka. Rezultat izvršavanja klauzule HAVING je grupirana tablica koja sadrži samo one grupe redaka za koje je rezultat procjene uvjeta odabira u dijelu HAVING TRUE. Konkretno, ako je klauzula HAVING prisutna u upitu koji ne sadrži GROUP BY, tada će rezultat njegovog izvršenja biti ili prazna tablica ili rezultat prethodnih dijelova izraza tablice, koji se smatra jednom grupom bez grupiranja stupaca . Pogledajmo primjer. Recimo da želimo prikazati ukupan iznos stanja za sve grane, ali samo ako je veći od 100 000 USD. U ovom slučaju, naš upit neće sadržavati operacije grupiranja, već će sadržavati odjeljak HAVING i izgledat će ovako:

ODABIR ZBOR ( Ostatak )

IMATI SUM ( Ostatak ) 100 000;

Ako je ukupni saldo veći od 100.000 USD, tada ćemo ga vidjeti u rezultirajućem omjeru, inače ćemo dobiti prazan omjer.


Za sažetak informacija sadržanih 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, agregatna funkcija AVG () uzima stupac brojeva kao argument i izračunava njihov prosjek.

Za izračunavanje prosječnog dohotka po glavi stanovnika Zelenograda potreban vam je sljedeći upit:

ODABIR 'PROSJEČNI PRIHODA =', AVG (SUMD)

SQL ima šest agregatnih funkcija koje pružaju različite vrste sažetaka (slika 1):

- SUM () izračunava zbroj svih vrijednosti sadržanih u stupcu;

- AVG () izračunava prosjek između vrijednosti sadržanih u stupcu;

- MIN () pronalazi najmanju među svim vrijednostima sadržanim 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 redaka u tablici rezultata upita.

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

ODABIR PROSJEČNOG (SUMD * 0,13)

Ovaj upit stvara privremeni stupac koji sadrži vrijednosti (SUMD * 0,13) za svaki redak u tablici PERSON, a zatim izračunava prosjek privremenog stupca.

Zbroj prihoda svih stanovnika Zelenograda može se izračunati pomoću agregatne funkcije SUM:

ODABERITE ZUM (SUMD) OD OSOBE

Agregatna funkcija također se može koristiti za izračunavanje ukupnih vrijednosti za tablicu rezultata dobivenih spajanjem nekoliko izvornih tablica. Na primjer, možete izračunati ukupan iznos prihoda koji stanovnici primaju iz izvora pod nazivom "Stipendija":

ODABIR ZVOTA (NOVAC)

OD PROFITA, HAVE_D

WHERE PROFIT.ID = HAVE_D.ID

AND PROFIT.SOURCE = 'Stipendija'

Funkcije agregata MIN () i MAX () omogućuju vam da pronađete najmanju i najveću vrijednost u tablici. Međutim, stupac može sadržavati numeričke ili nizove vrijednosti ili vrijednosti datuma ili vremena.

Na primjer, možete definirati:

(a) najniži ukupni dohodak rezidenti 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 (RDATE), MAX (RDATE)

(c) prezimena, imena i patronimika prvih i zadnjih stanovnika na popisu, poredani po abecedi:

ODABIR MIN (FIO), MAX (FIO)

Prilikom primjene ovih agregatnih funkcija, morate imati na umu da se numerički podaci uspoređuju prema aritmetičkim pravilima, datumi se uspoređuju uzastopno (ranije vrijednosti datuma smatraju se manjim od kasnijih), vremenski intervali se uspoređuju na temelju njihovog trajanja.

Kada koristite MIN () i MAX () s podacima niza, rezultat usporedbe dvaju nizova ovisi o korištenoj tablici kodiranja znakova.

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

(a) koliko stanova ima u 1. mikrookrug?

ODABIR BROJ (ADR) IZ RAVNOG GDJE ADR KAO "%, 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 određuje da se broje neduplicirane vrijednosti u stupcu).

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

(a) koliko stanova ima u 2. mikrookrug?

ODABIR BROJ (*) IZ RAVNOG GDJE ADR KAO "%, 2 __-%"

(b) koliko izvora prihoda ima Ivan Ivanovič?

ODABIR BROJ (*) IZ OSOBE, HAVE_D GDJE FIO = "Ivanov Ivan Ivanovič" I PERSON.NOM = HAVE_D.NOM

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

ODABIR BROJ (*) OD OSOBE GDJE ADR = "Zelenograd, 1001-45"

Jedan od načina da shvatite kako se agregatni upiti izvode je razmišljanje o izvršenju upita u dva dijela. Prvo se utvrđuje kako bi upit funkcionirao bez agregatnih funkcija, vraćajući više redaka rezultata. Agregatne funkcije se zatim primjenjuju na rezultate upita, vraćajući jedan redak sažetka.

Na primjer, razmotrite sljedeći složeni upit: pronađite prosječni ukupni dohodak po stanovniku, zbroj ukupnog prihoda stanovnika i prosječni prihod izvora kao postotak ukupnog prihoda stanovnika. Odgovor daje operater

ODABIR PROSJEČAN (SUMD), SUM (SUMD), (100 * AVG (NOVAC / SUMD)) OD OSOBE, PROFIT, HAVE_D GDJE PERSON.NOM = HAVE_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 = HAVE_D.NOM I HAVE_D.ID = PROFIT.ID

i vratio bi jedan red rezultata za svakog stanovnika i određeni izvor prihoda. Zbirne funkcije koriste stupce u tablici rezultata ovog upita kako bi proizvele tablicu u jednom redu sa sažetim rezultatima.

U retku vraćenih stupaca možete odrediti agregatnu funkciju umjesto naziva bilo kojeg stupca. Na primjer, može se uključiti u izraz koji dodaje ili oduzima vrijednosti dviju agregatnih funkcija:

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.

Osim toga, agregatne funkcije i redoviti nazivi stupaca ne mogu se koristiti na popisu vraćenih stupaca u isto vrijeme, jer u tome nema smisla, na primjer:

ODABERITE FIO, SUM (SUMD) OD OSOBE

Ovdje prvi element popisa daje upute DBMS-u da kreira tablicu koja će se sastojati od nekoliko redaka i sadržavati jedan red za svakog korisnika. Druga stavka na popisu traži od DBMS-a da dobije jednu vrijednost rezultata, a to je zbroj vrijednosti u stupcu SUMD. Ove dvije smjernice proturječe jedna drugoj, što rezultira pogreškom.

Gore navedeno ne vrijedi za slučajeve obrade potupita i upita s grupiranjem.

Kako mogu saznati broj modela računala koje proizvodi određeni dobavljač? Kako odrediti prosječnu cijenu za računala s istim specifikacijama? Na ova i mnoga druga pitanja vezana uz neke statističke podatke može se odgovoriti pomoću zbirne (agregatne) funkcije... Standard predviđa sljedeće agregatne funkcije:

Sve ove funkcije vraćaju jednu vrijednost. U ovom slučaju, funkcije COUNT, MIN i MAX primjenjivi su na bilo koju vrstu podataka, dok IZNOS i PROSJEČAN koriste se 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 osobna računala:

Primjer. Pronađite broj dostupnih računala od proizvođača A:

Primjer. Ako nas zanima broj različitih modela koje proizvodi proizvođač A, onda se upit može formulirati na sljedeći način (koristeći činjenicu da se u tablici proizvoda svaki model bilježi jednom):

Primjer. Pronađite broj različitih modela dostupnih od proizvođača A. Upit je sličan prethodnom, u kojem se tražilo odrediti ukupan broj modela proizvedenih od strane proizvođača A. Ovdje također trebate pronaći broj različitih modela u PC stol (tj. komercijalno dostupan).

Kako bi se osiguralo da se pri dobivanju statističkih pokazatelja koriste samo jedinstvene vrijednosti, kada argument agregatnih funkcija može se koristiti DISTINCT parametar... Još parametar SVE je zadana vrijednost i pretpostavlja da se sve povratne vrijednosti u stupcu broje. Operater,

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

GROUP BY klauzula

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, a koriste se agregatne funkcije, tada se koriste svi stupci s nazivima navedenim u IZABERI treba uključiti u agregatne funkcije, a ove funkcije će se primijeniti na cijeli skup redaka koji zadovoljavaju predikat upita. Inače, svi stupci liste SELECT, nije uključeno u agregatnim funkcijama, mora biti specificirano u klauzuli GROUP BY... Kao rezultat toga, svi izlazni redovi 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 su grupirani po polju koje sadrži NULL vrijednosti, svi takvi reci će pasti u jednu grupu.
Ako ako postoji klauzula GROUP BY, u klauzuli SELECT nema agregatnih funkcija, tada će upit jednostavno vratiti jedan redak iz svake grupe. Ova značajka, zajedno s ključnom riječi DISTINCT, može se koristiti za uklanjanje duplikata redaka 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 računala utvrđuje njihov broj i prosječna cijena. Svi redovi s istim vrijednostima modela čine grupu, a izlaz SELECT izračunava broj vrijednosti i prosječne vrijednosti cijene za svaku grupu. Upit će rezultirati sljedećom tablicom:
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 s datumom, tada bi bilo moguće izračunati ove pokazatelje za svaki određeni datum. Da biste to učinili, trebate dodati datum kao stupac za grupiranje, a zatim će se izračunati agregatne funkcije za svaku kombinaciju vrijednosti (model-datum).

Postoji nekoliko specifičnih pravila za obavljanje agregatnih funkcija:

  • Ako kao rezultat upita nema primljenih linija(ili više od jednog reda za danu grupu), tada nema početnih podataka za izračunavanje bilo koje od agregatnih funkcija. U ovom slučaju, rezultat izvršavanja funkcija COUNT bit će nula, a rezultat svih ostalih funkcija bit će NULL.
  • Argument agregatna funkcija ne može sama sadržavati agregatne funkcije(funkcija od funkcije). Oni. u jednom upitu ne možete, recimo, dobiti maksimalne prosječne vrijednosti.
  • Rezultat izvršavanja funkcije COUNT je cijeli broj(CIJELI). Druge agregatne funkcije nasljeđuju tipove podataka vrijednosti koje se obrađuju.
  • Ako se prilikom izvršavanja funkcije SUM dobije rezultat koji premašuje maksimalnu vrijednost korištene vrste podataka, pogreška.

Dakle, ako zahtjev ne sadrži GROUP BY klauzule, onda agregatne funkcije uključen u SELECT klauzula, izvršavaju se na svim rezultirajućim redovima upita. Ako zahtjev sadrži GROUP BY klauzula, svaki skup redaka koji ima iste vrijednosti stupca ili grupe stupaca navedene u GROUP BY klauzula, čini grupu, i agregatne funkcije izvode se za svaku grupu posebno.

HAVING klauzula

Ako WHERE klauzula zatim definira predikat za filtriranje redaka IMATI ponudu primijenjena nakon grupiranja definirati slične skupine za filtriranje predikata po vrijednostima agregatne funkcije... Ova klauzula je potrebna za testiranje vrijednosti koje su dobivene korištenjem agregatna funkcija ne iz zasebnih redaka izvora zapisa definiranog u FROM klauzula, i od grupe takvih linija... Stoga takva provjera ne može biti sadržana u WHERE klauzula.

Vrhunski povezani članci