Kako podesiti pametne telefone i računare. 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 koji rade na vrijednostima stupaca skupa redova i vraćaju jednu vrijednost. Argumenti agregatnih funkcija mogu biti i kolone tabele i rezultati izraza nad njima. Agregatne funkcije mogu same biti uključene u druge aritmetičke izraze. Sljedeća tabela navodi najčešće korištene standardne unarne agregatne funkcije.


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

function_name ([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 duplirane vrijednosti (ovo je zadana postavka). Na primjer, AVG funkcija With ključna riječ DISTINCT za redove stupaca sa vrijednostima 1, 1, 1 i 3 će vratiti 2, a ako je prisutna ključna riječ ALL, vratit će se 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 redove u ulaznoj tablici klauzule SELECT. Osim toga, u SELECT klauzuli, ne možete koristiti i agregatne funkcije i stupce tablice (ili izraze s njima) u odsustvu GROUP BY klauzule, što ćemo razmotriti u sljedeći odjeljak.

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

  • COUNT (*)
  • COUNT (izraz)

Najjednostavniji način korištenja ove funkcije je brojanje reda u tablici (sve ili zadovoljavajuće navedenom stanju). 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 jedne kolone može se koristiti kao argument. U ovom slučaju broji se ili sve vrijednosti u ovoj koloni ulazne tablice ili samo vrijednosti koje se ne ponavljaju (kada se koristi ključna riječ DISTINCT).

Upit: Broj različitih imena sadržanih u tabeli Kupci.

ODABIR BROJ (DISTINCT FNAME)

OD kupca

Upotreba ostalih unarnih agregatnih funkcija je ista kao i za COUNT, osim što je za funkcije MIN i MAX upotreba ključnih riječi DISTINCT i ALL besmislena. Pored numeričkih polja, znakovna polja se mogu koristiti sa funkcijama COUNT, MAX i MIN. Ako argument agregatne funkcije ne sadrži vrijednosti, funkcija COUNT vraća 0, a sve ostale vraćaju NULL.

ODABIR MAX (Datum narudžbe)

OD

GDJE RedDate "1.09.2010"

Zadatak za samostalan rad: Stanje uključeno SQL jezik upiti za dohvaćanje sljedećih podataka:

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

Lekcija će pokriti temu sql preimenovanja kolone (polja) koristeći AS funkciju riječi; također je pokrio temu agregatnih funkcija u sql. Biće rastavljen konkretnim primjerima zahtjevi

Možete preimenovati imena kolona u upitima. Ovo čini rezultate čitljivijim.

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

sintaksa:

SELECT<имя поля>AS<псевдоним>OD ...

Pogledajmo primjer preimenovanja u SQL-u:

Primjer DB "Institut": Prikažite imena nastavnika i njihove plate, za one nastavnike čije su plate ispod 15000 preimenujte polje zarplata u "niska_plata"


✍ Rješenje:

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

Primjer DB "Institut": Iz tabele nastavnika ispišite ime polja i izračunajte iznos plate i bonusa, imenujući polje "Plata_ nagrada"


✍ Rješenje:
1 2 SELECT ime, (zarplata + premia) AS zarplata_premia OD nastavnika;

SELECT ime, (zarplata + premia) AS zarplata_premia OD nastavnika;

rezultat:

Agregatne funkcije u SQL-u

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

Sve agregatne funkcije vraćaju jednu vrijednost.

Funkcije COUNT, MIN i MAX primjenjuju se na bilo koji tip 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.

Bitan: kada se radi sa agregatnim funkcijama u SQL-u, koristi se posebna riječ AS


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


✍ Rješenje:
SELECT MAX (zarplata) AS max_zp FROM nastavnika;

SELECT MAX (zarplata) AS max_zp FROM nastavnika;

Rezultati:

Razmotrite više složen primjer koristeći agregatne funkcije u sql.


✍ Rješenje:

GROUP BY klauzula u SQL-u

Grupa po klauzuli u sql-u se obično koristi u sprezi sa agregatnim funkcijama.

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

Razmotrite primjer s tabelom lekcija:

primjer:

Bitan: Dakle, kao rezultat korištenja GROUP BY, svi izlazni redovi upita podijeljeni su u grupe koje karakteriziraju iste kombinacije vrijednosti u ovim stupcima (tj. agregatne funkcije se izvode za svaku grupu posebno).

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

Za različite vrsteštampači za određivanje njihove prosječne cijene i količine (tj. zasebno za laser, inkjet i matrix). Koristite agregatne funkcije. Rezultat bi trebao izgledati ovako:

Imati SQL izjavu

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

primjer: DB prodavnica računara... Izračunajte prosječnu cijenu računara sa istom brzinom procesora. Računajte samo za one grupe čija je prosječna cijena manja od 30.000.



  • Agregatne funkcije se koriste kao imena 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 karakterna polja. Kada se koristi sa znakovnim poljima MAX i MINće ih prevesti u ASCII ekvivalent 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 položili ispite iz svake discipline. Da biste to učinili, potrebno je izvršiti 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 da se broje svi redovi u grupi.

SELECT R1. Disciplina, COUNT (*)

GRUPA PO R1 Disciplina;

rezultat:


SELECT R1 Discipline, COUNT (*)

GDJE R1. NIJE NULL rezultat

GRUPA PO R1 Disciplina;

rezultat:


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

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

SELECT 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 linija u grupi. Doista, u grupi sa 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 koloni jednake NULL oni su isključeni kada se izračuna rezultat funkcije.

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

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

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

Pravila za tumačenje agregatnih funkcija

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

SELECT MAX (Score) od R1 daće maksimalnu ocjenu na sjednici;

SELECT SUM od R1 dati će zbir svih procjena po sesiji;

SELECT AVG (Score) od R1će dati prosječnu ocjenu za cijelu sesiju.


2; Rezultat: "width =" 640 "

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

SELECT COUNT (*) As Iznajmljeno _ ispiti

WHERE razred 2;

rezultat:


Argument agregatnih funkcija može biti odvojeni stupci tabela. Da biste izračunali, na primjer, iznos različita značenja neke kolone u grupi, morate koristiti ključnu riječ DISTINCT u sprezi s imenom kolone. Izračunajmo broj različitih ocjena dobijenih za svaku disciplinu:

SELECT R1 Discipline, COUNT (DISTINCT R1 Evaluation)

GDJE R1. NIJE NULL rezultat

GRUPA PO R1 Disciplina;

rezultat:


Isti rezultat se dobija ako izuzmete 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) smatra samo izvesnim razne vrijednosti.

U cilju dobijanja u ovom slučaju željeni rezultat, potrebno je izvršiti preliminarnu transformaciju tipa podataka kolone "Score", dovodeći je 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 kolonu "Score" u važeći tip podataka. "width =" 640 "

Odaberite R2.Grupa, R1.Disciplina, Count (*) kao Total, AVG (cast (Score as decimal (3,1))) kao Average_point

Od R1, R2

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

i R1. Razred 2

Grupirajte po R2. Grupa, R1. Disciplina;

Evo funkcije ULOGE () pretvara kolonu Score 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 kao u izrazu za prikaz rezultata SELECT redove, te u izrazu uvjeta obrade formiranih grupa HAVING. U ovom slučaju, svaka agregatna funkcija se izračunava za svaku odabranu grupu. Vrijednosti dobivene pri izračunavanju agregatnih funkcija mogu se koristiti za prikaz odgovarajućih rezultata ili za uvjet odabira grupa.

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


jedan; Rezultat: "width =" 640 "

SELECT R2. Grupa

OD R1, R2

GDJE R1. Puno ime = R2. Ime AND

R1 rezultat = 2

GRUPA PO R2 Grupa, R1 Disciplina

IMATI broj (*) 1;

rezultat:


Imamo DB "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 računa u filijalama. Moguće je napraviti poseban upit za svaku od njih odabirom SUM iz tabele za svaku granu, ali operacija GROUP BY će ih sve staviti u jednu naredbu:

SELECT Filijala , SUMA ( Ostatak )

GROUP BY Ogranak;

GROUP BY primjenjuje agregatne funkcije nezavisno za svaku grupu identificiranu vrijednošću polja Grana. Grupa se sastoji od linija sa istom vrijednošću polja Grana i funkcije 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, ima, po definiciji, samo jednu vrijednost po izlaznoj grupi, kao i 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 odaberete samo one filijale, čija ukupna vrijednost stanja računa prelazi 5.000 $, kao i ukupna stanja za odabrane filijale. Za prikaz filijala sa ukupnim stanjem preko 5.000 $, potrebno je da koristite HAVING ponudu... Klauzula HAVING definira 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 sljedeća:

SELECT Ogranak, SUM (Stanje)

GROUP BY Filijala

IMATI SUMU ( 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 Ogranak, SUM (Stanje)

GRUPA PO Ogranku

OTVORENI Datum = 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 bi se izbjegla takva situacija, prijedlog HAVING treba da se odnosi samo na agregate i odabrana polja GROUP BY... Tu je Pravi put uputite gornji zahtjev:

SELECT Ogranak, SUM (Stanje)

GDJE Datum otvaranja = '27 / 12/2004 '

GROUP BY Ogranak;


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

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

SELECT Ogranak, SUM (Stanje)

OD F, Q

GDJE F. Grana = Q. Grana

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 omjeru, inače ćemo dobiti prazan omjer. "width =" 640 "

Stoga, u aritmetičkim izrazima predikata uključenih u uvjet odabira klauzule HAVING, možete direktno koristiti samo specifikacije stupaca specificiranih kao grupiranje stupaca u klauzuli GROUP BY. Ostatak stupaca se može 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 linija. Rezultat izvršavanja klauzule HAVING je grupisana tabela koja sadrži samo one grupe redova za koje je rezultat procene uslova izbora u delu 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 prethodnih odjeljaka tabelarni izraz smatra se jednom grupom bez grupisanih kolona. Pogledajmo primjer. Recimo da želimo izlaz ukupan iznos stanja za sve filijale, ali samo ako je veća od 100.000 $. U ovom slučaju naš zahtjev neće sadržavati operacije grupisanja, već će sadržavati odjeljak HAVING i izgledat će ovako:

ODABIR SUM ( Ostatak )

IMATI SUMU ( Ostatak ) 100 000;

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


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, 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:

ODABERITE 'PROSJEČNI PRIHOD =', 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 koloni;

- AVG () izračunava prosek između vrednosti sadržanih u koloni;

- MIN () pronalazi najmanju među svim vrijednostima sadržanim u koloni;

- MAX () pronalazi najveću među svim vrijednostima sadržanim u koloni;

- COUNT () broji broj vrijednosti sadržanih u koloni;

- 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 izračunava porez po glavi stanovnika:

ODABIR PROSJEČNOG (SUMD * 0,13)

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

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

ODABERITE ZUM (SUM) OD OSOBE

Agregatna funkcija se također 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 koji se zove "Stipendija":

ODABIR SUMU (NOVAC)

OD PROFITA, HAVE_D

WHERE PROFIT.ID = HAVE_D.ID

AND PROFIT.SOURCE = 'Stipendija'

Funkcije agregata MIN () i MAX () omogućavaju vam da pronađete, redom, najmanji i najveća vrijednost u tabeli. Međutim, 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 rezidenta 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 patronimike prvih i poslednjih stanovnika na spisku, poredani po abecednom redu:

ODABIR MIN (FIO), MAX (FIO)

Kada primjenjujete ove agregatne funkcije, morate imati na umu da se numerički podaci uspoređuju prema aritmetičkim pravilima, datumi se porede uzastopno (ranije vrijednosti datuma se smatraju manjim od kasnijih), vremenski intervali se uspoređuju na osnovu njihovog trajanja.

Kada koristite MIN () i MAX () sa podacima niza, 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 određuje 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č?

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

(c) koliko stanovnika živi u stanu na datoj adresi?

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

Jedan od načina da se shvati kako se agregatni upiti izvršavaju 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 redova rezultata. Agregatne funkcije se zatim primjenjuju na rezultate upita, vraćajući jedan red sa sažetkom.

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

ODABERITE PROSJEČNI (SUMD), SUM (SUMD), (100 * PROSJEK (NOVAC / SUMD)) IZ OSOBE, PROFIT, IMAM_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. Agregatne funkcije koriste stupce u tablici rezultata ovog upita da proizvedu tablicu jednog reda sa rezimenim rezultatima.

U redu vraćenih kolona možete navesti agregatnu funkciju umjesto imena bilo kojeg stupca. Na primjer, može se uključiti u izraz 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.

Osim toga, agregatne funkcije i regularni nazivi stupaca ne mogu se istovremeno koristiti na listi vraćenih stupaca, jer u tome nema smisla, na primjer:

ODABERITE FIO, SUM (SUM) 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. Druga stavka na listi traži od DBMS-a da dobije jednu vrijednost rezultata, koja je zbir vrijednosti u SUMD koloni. Ove dvije smjernice su u suprotnosti jedna s drugom, što rezultira greškom.

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

Kako mogu saznati broj modela PC-a koje proizvodi određeni proizvođač? Kako odrediti prosječnu cijenu za računare koji imaju istu specifikacije? Ova i mnoga druga pitanja vezana su za neke statističke informacije, možete dobiti odgovore sa 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 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 broj dostupnih računara proizvođača A:

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

Primjer. Pronađite broj različitih modela dostupnih od proizvođača A. Upit je sličan prethodnom, u kojem je bilo potrebno utvrditi ukupan broj modeli proizvođača A. Ovde takođe treba da pronađete broj različitih modela u tabeli računara (tj. dostupnih na tržištu).

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 povratne vrijednosti u koloni broje. operater,

Ako trebamo dobiti broj proizvedenih modela PC-a svaki proizvođača, morat ćete koristiti GROUP BY klauzula sintaktički prateć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 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, mora biti specificirano u klauzuli GROUP BY... Kao rezultat toga, sve izlazne linije upita podijeljene su u grupe koje karakteriziraju iste kombinacije vrijednosti u ovim stupcima. Nakon toga, agregatne funkcije će se primijeniti na svaku grupu. Treba imati na umu da za GROUP BY all null vrijednosti tretiraju se kao jednaki, tj. kada se grupišu po polju koje sadrži NULL vrijednosti, svi takvi redovi će pasti u jednu grupu.
Ako u prisustvu GROUP ponude BY, u klauzuli SELECT nema agregatnih funkcija, onda će upit jednostavno vratiti jedan red iz svake grupe. Ova funkcija, zajedno sa 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... Sve linije sa iste vrijednosti model (broj modela) formiraju grupu, a SELECT izlaz 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 kolonu s datumom, tada bi bilo moguće izračunati ove indikatore za svaki određeni datum. Da biste to učinili, trebate dodati datum kao kolonu za grupisanje, 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 datu grupu), tada nedostaju početni podaci za izračunavanje bilo koje agregatne funkcije. U ovom slučaju, rezultat izvršavanja 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, ne možete, recimo, dobiti maksimalne prosječne vrijednosti.
  • Rezultat izvršavanja funkcije COUNT je cijeli broj(INTEGER). 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štenog tipa podataka, greška.

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

HAVING klauzula

Ako WHERE klauzula onda definira predikat za filtriranje redova HAVING ponudu primijenjeno nakon grupisanja definirati slične grupe za filtriranje predikata po vrijednostima agregatne funkcije... Ova klauzula je potrebna za testiranje vrijednosti koje se dobijaju upotrebom agregatna funkcija ne iz zasebnih redova izvora zapisa definiranog u FROM klauzula, i od grupe takvih linija... Stoga takva provjera ne može biti sadržana u WHERE klauzula.

Top srodni članci