Uporaba ugnezdenih agregatnih funkcij. Uporaba agregatnih funkcij v poizvedbah. DISTINCT Ključna beseda v funkcijah združevanja

Številne poizvedbe baze podatkov ne zahtevajo ravni razdrobljenosti, ki jo zagotavljajo poizvedbe SQL, o katerih smo govorili v prejšnjih primerih. Torej, v vseh spodaj navedenih poizvedbah morate najti samo eno ali več vrednosti, ki povzemajo informacije v zbirki podatkov:

  • 1) kolikšen je dohodek vseh prebivalcev?
  • 2) kolikšen je najvišji in najnižji skupni dohodek posameznega rezidenta?
  • 3) kolikšen je povprečni dohodek na prebivalca prebivalca Zelenograda?
  • 4) kolikšen je povprečni dohodek prebivalcev posameznega stanovanja na prebivalca?
  • 5) koliko stanovalcev je v posameznem stanovanju?

V SQL lahko te vrste poizvedb ustvarite z uporabo agregatnih funkcij in klavzul GROUP BY in HAVING, uporabljenih v stavku SELECT.

Uporaba agregatnih funkcij

Za povzetek informacij, ki jih vsebuje zbirka podatkov, SQL ponuja agregatne funkcije. Združevalna funkcija vzame celoten stolpec podatkov kot argument in vrne eno samo vrednost, ki povzema ta stolpec na določen način.

Na primer, agregatna funkcija AVG() vzame stolpec s številkami kot argument in izračuna njihovo povprečje.

Za izračun povprečnega dohodka na prebivalca prebivalca Zelenograda potrebujete naslednjo poizvedbo:

IZBERITE »POVPREČNI DOHODEK NA PREBIVALCA, AVG(SUMD) OD OSEBE

SQL ima šest agregatnih funkcij, ki vam omogočajo, da pridobite različne vrste povzetkov informacij (slika 3.16):

SUM() izračuna vsoto vseh vrednosti v stolpcu;

AVG() izračuna povprečje vrednosti v stolpcu;

  • - MIN() najde najmanjšo med vsemi vrednostmi v stolpcu;
  • - MAX() najde največjo med vsemi vrednostmi v stolpcu;
  • - COUNT() prešteje število vrednosti v stolpcu;

COUNT(*) prešteje število vrstic v tabeli rezultatov poizvedbe.

Argument agregatne funkcije je lahko preprosto ime stolpca, kot v prejšnjem primeru, ali izraz, kot v naslednji poizvedbi, ki podaja izračun povprečnega davka na prebivalca:

IZBERI AVG(SUMD*0,13)

riž. 3.16.

Ta poizvedba ustvari začasni stolpec, ki vsebuje vrednosti (SUMD*0,13) za vsako vrstico tabele PERSON, nato pa izračuna povprečje začasnega stolpca.

Znesek dohodka za vse prebivalce Zelenograda je mogoče izračunati z agregatno funkcijo SUM:

IZBERI SUM(SUMD) OD OSEBE

Združevalno funkcijo je mogoče uporabiti tudi za izračun vsot iz tabele z rezultati, pridobljene z združitvijo več izvornih tabel. Na primer, lahko izračunate skupni znesek dohodka, ki so ga prebivalci prejeli iz vira, imenovanega »štipendija«:

IZBERI VSET(DENAR)

IZ DOBIČKA, HAVE_D

WHERE PROFIT.ID=HAVE_D.ID

IN DOBIČEK.VIR^Štipendija’

Skupni funkciji MIN() in MAX() vam omogočata, da poiščete najmanjšo oziroma največjo vrednost v tabeli. Stolpec lahko vsebuje številske ali nizovne vrednosti ali datumske ali časovne vrednosti.

Na primer, lahko definirate:

(a) najnižji skupni dohodek, ki so ga prejeli rezidenti, in najvišji davek, ki ga je treba plačati:

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

(b) datum rojstva najstarejšega in najmlajšega prebivalca:

IZBERI MIN(RDATE), MAX(RDATE)

(c) priimki, imena in patronime prvih in zadnjih prebivalcev na seznamu, razvrščeni po abecedi:

IZBERI MIN(FIO), MAX(FIO)

Pri uporabi teh agregatnih funkcij se morate spomniti, da se numerični podatki primerjajo z uporabo aritmetičnih pravil, datumi se primerjajo zaporedno (vrednosti zgodnejših datumov se štejejo za manjše od kasnejših), časovni intervali pa se primerjajo glede na njihovo trajanje.

Pri uporabi funkcij MIN() in MAX() s podatki niza je rezultat primerjave dveh nizov odvisen od uporabljene tabele za kodiranje znakov.

Zbirna funkcija COUNT() prešteje število vrednosti v stolpcu katere koli vrste:

(a) koliko stanovanj je v 1. mikrookrožju?

IZBERI ŠTEVILO (ADR)

KJE ADR LIKE *%, 1_

(b) koliko prebivalcev ima vire dohodka?

IZBERI ŠTEV. (LOČNO NOM.)

(c) koliko virov dohodka uporabljajo rezidenti?

IZBERI ŠTEVILO (DISTINCT ID)

Ključna beseda "DISTINCT" določa, da se štejejo nepodvojene vrednosti v stolpcu.

Posebna združevalna funkcija COUNT(*) prešteje vrstice v tabeli z rezultati, ne vrednosti podatkov:

(a) koliko stanovanj je v 2. okrožju?

KJE ADR LIKE "%, 2_-%’

(b) koliko virov dohodka ima Ivan Ivanovič Ivanov?

OD OSEBE, HAVE_D

KJE FIO = "Ivanov Ivan Ivanovič"

IN OSEBA.NOM = IMET_D.NOM

(c) koliko stanovalcev živi v stanovanju na določenem naslovu?

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

Eden od načinov, kako razumeti, kako se izvajajo poizvedbe povzetkov z agregatnimi funkcijami, je, da si predstavljamo izvajanje poizvedbe, razdeljeno na dva dela. Najprej ugotovimo, kako bi poizvedba delovala brez agregatnih funkcij, ki bi vrnile več vrstic rezultatov. Združevalne funkcije se nato uporabijo za rezultate poizvedbe in vrnejo eno samo nastalo vrstico.

Na primer, upoštevajte naslednjo zapleteno poizvedbo: poiščite povprečni skupni dohodek na prebivalca, vsoto skupnega dohodka prebivalcev in povprečni izvorni donos kot odstotek celotnega dohodka rezidenta. Operater poda odgovor

IZBERI AVG(SUMD), SUM(SUMD), (100*AVG(MONEY/SUMD))

FROM PERSON, PROFIT, HAVE_D WHERE PERSON.NOM = HAVE_D.NOM IN HAVE_D.ID = PROFIT.ID

Brez agregatnih funkcij bi bila poizvedba videti takole:

IZBERI SUMD, SUMD, M0NEY/SUMD FROM PERSON, PROFIT, HAVE_D WHERE PERSON.NOM = HAVE_D.NOM IN HAVE_D.ID = PROFIT.ID

in bi vrnil eno vrstico rezultatov za vsakega prebivalca in določen vir dohodka. Združevalne funkcije uporabljajo stolpce tabele rezultatov poizvedbe za izdelavo enovrstične tabele s povzetki rezultatov.

V vrnjeni vrstici stolpca lahko podate agregatno funkcijo namesto katerega koli imena stolpca. Na primer, lahko je del izraza, ki sešteva ali odšteva vrednosti dveh agregatnih funkcij:

IZBERI MAX(SUMD)-MIN(SUMD)

Vendar pa agregatna funkcija ne more biti argument drugi agregatni funkciji, tj. Ugnezdene agregatne funkcije so prepovedane.

Poleg tega seznam vrnjenih stolpcev ne more istočasno uporabljati združevalnih funkcij in navadnih imen stolpcev, ker to nima smisla, na primer:

IZBERI FIO, SUM(SUMD)

Tukaj prvi element seznama naroči DBMS, naj ustvari tabelo, ki bo sestavljena iz več vrstic in bo vsebovala eno vrstico za vsakega prebivalca. Drugi element seznama zahteva od DBMS, da pridobi eno samo vrednost rezultata, ki je vsota vrednosti v stolpcu SUMD. Ti dve navodili si nasprotujeta, kar povzroči napako.

Navedeno ne velja za primere obdelave podpoizvedb in poizvedb z združevanjem.

Uvod

SQL (jezik strukturiranih poizvedb) - Strukturirani povpraševalni jezik za delo s podatkovnimi bazami - standardni poizvedbeni jezik za delo z relacijskimi zbirkami podatkov.

Prvi mednarodni standard za jezik SQL je bil sprejet leta 1989 (v nadaljevanju ga bomo imenovali SQL/89 ali SQL1). Včasih se standard SQL1 imenuje tudi standard ANSI/ISO in velika večina DBMS-jev, ki so na voljo na trgu, v celoti podpira ta standard.

Konec leta 1992 je bil sprejet nov mednarodni standard za jezik SQL (ki se bo odslej imenoval SQL/92 ali SQL2). In ni brez slabosti, hkrati pa je bistveno natančnejši in popolnejši od SQL/89. Trenutno večina proizvajalcev DBMS spreminja svoje izdelke, tako da so bolj skladni s standardom SQL2.

Zadnji standard za jezik SQL je bil izdan leta 1996. Imenuje se SQL3.

SQL ni mogoče v celoti uvrstiti med tradicionalne programske jezike: ne vsebuje tradicionalnih operaterjev za nadzor poteka programa, operatorjev za deklaracijo tipa in še veliko več; vsebuje samo nabor standardnih operaterjev za dostop do podatkov, shranjenih v bazi podatkov. Stavki SQL so vdelani v osnovni programski jezik, ki je lahko kateri koli standardni jezik, kot je C++, PL, COBOL itd. Poleg tega se lahko stavke SQL izvajajo neposredno interaktivno.

1. Struktura SQL.

SQL vsebuje naslednje razdelke:

1. Operatorji jezika za definicijo podatkov (DDL).

Operater Pomen Akcija
USTVARI TABELO Ustvari tabelo Ustvari novo tabelo v bazi podatkov
PADNA MIZA Izbriši tabelo Odstrani tabelo iz baze podatkov
SPREMENI TABELO Uredi tabelo Spremeni strukturo obstoječe tabele
USTVARI POGLED Ustvari pogled Ustvari virtualno tabelo, tj. tabelo, ki dejansko ne obstaja, ampak je modelirana s tem operatorjem.
SPREMENI POGLED Spremeni pogled Spremeni strukturo ali vsebino navidezne tabele
SPUSTI POGLED Izbriši pogled Izbriše opis navidezne tabele. Ni potrebe po brisanju same tabele, ker ... dejansko ne obstaja.
USTVARI INDEKS Ustvari indeks Ustvari posebno fizično strukturo, imenovano indeks, ki omogoča hitrejši dostop do podatkov
SPUSTI INDEKS Odstrani indeks Izbriše ustvarjeno strukturo
USTVARITE SINONIM Ustvari sinonim
IZPUSTI SINONIM Odstrani sinonim

2. Operatorji za manipulacijo podatkov v jeziku DML (Data Manipulation Language).



3. Jezik podatkovnih poizvedb (DQL)

4. Orodja za nadzor transakcij (DCL)

5. Orodja za upravljanje podatkov (DDL)

Programski SQL

2. Vrste podatkov

V SQL/89 so podprti naslednji tipi podatkov: CHARACTER, NUMERIC, DECIMAL, INTEGER, SMALLINT, FLOAT, REAL, DOUBLE PRECISION. Ti tipi podatkov so razvrščeni v tipe znakovnega niza, natančnega števila in približnega števila.

Standard SQL92 doda naslednje vrste podatkov:

VARCHAR(n) - nizi znakov spremenljive dolžine

NCHAR(N) – nizi lokaliziranih znakov konstantne dolžine

NCHAR VARYING(n) - nizi lokaliziranih znakov spremenljive dolžine

BIT(n) - bitni niz konstantne dolžine

BIT VARYING(n) - bitni niz spremenljive dolžine

DATE koledarski datum

TIMESTAMP (natančen) datum in čas

Časovni interval INTERVAL

3. Izjava SELECT

Select je edini iskalni operator, ki nadomešča vse operacije relacijske algebre.

Sintaksni diagram stavka SELECT je prikazan na sliki 1


Tu ključna beseda VSE pomeni, da nastali nabor vrstic vključuje vse vrstice, ki izpolnjujejo pogoje poizvedbe. Ključna beseda DISTINCT pomeni, da so v nabor rezultatov vključene samo različne vrstice, tj. podvojene vrstice z rezultati niso vključene v nabor. Če ni prisotne nobene ključne besede, se ta situacija interpretira kot prisotnost ključne besede ALL.

Znak * pomeni, da niz rezultatov vključuje vse stolpce iz izvornih tabel poizvedbe.

Del FROM podaja seznam izvornih relacij (tabel) poizvedbe.

V delu WHERE so podani pogoji za izbiro termina rezultata oziroma pogoji za združevanje tulp izvornih tabel.

Del GROUP BY podaja seznam polj za združevanje.

Del HAVING podaja predikatne pogoje, naložene vsaki skupini.

Del ORDER BY podaja seznam polj za razvrščanje rezultatov.

V izrazu pogojev za del WHERE je mogoče uporabiti naslednje predikate:

· primerjalni predikat z vzorcem LIKE in NOT LIKE

· predikat OBSTAJA in NE OBSTAJA.

primerjalni predikati { =, <>, >,<,>=,<=,}. Skladenjski diagram primerjalnih predikatov je predstavljen na sliki 2


predikat IN - vključen v niz / ni vključen v niz.

Predikat IN ali NOT IN se lahko uporabi tudi za primerjavo izraza, ki se testira, s podpoizvedbo; v tem primeru je sintaksni diagram prikazan na sliki. 5.

Predikat IN je resničen, ko se vrednost atributa, določenega v izrazu, ki se testira za trenutno torko, ujema z vsaj eno od niza vrednosti, pridobljenih kot rezultat izvajanja ustrezne podpoizvedbe ali vsebovanih na seznamu vrednosti. Nasprotno pa je predikat NOT IN resničen samo, če se vrednost podanega atributa v trenutni tuple ne ujema z nobeno od nabora vrednosti, definiranih z vgrajeno podpoizvedbo ali danim seznamom vrednosti.


predikat LIKE - vključuje (podobno)

Vzorec lahko vsebuje _ podčrtaje, ki predstavljajo kateri koli posamezen znak;

% odstotni simbol - za označevanje poljubnega zaporedja znakov.

Predikat LIKE je resničen, če vrednost atributa, podanega z imenom stolpca v trenutni tuple, vključuje podano<шаблон>.

Predikat NOT LIKE je resničen, če vrednost atributa v trenutni tuple ne vključuje danega<шаблон>.

· predikat NULL - neznan, nedefiniran

Sintaktični diagram predikata je prikazan na sl. 7.


Vse prej obravnavane predikate je mogoče uporabiti v iskalnih pogojih.

Če za trenutek pustimo ob strani naš uvod v združevanje, si poglejmo pobližje prve tri vrstice stavka SELECT:

IZBERI- ključna beseda, ki DBMS pove, da je ta ukaz zahteva. Vse poizvedbe se začnejo s to besedo, ki ji sledi presledek. Lahko mu sledi metoda vzorčenja – z odstranjenimi dvojniki ( IZRAZIT), ali brez brisanja ( VSE, se predpostavlja privzeto). Temu sledi z vejicami ločen seznam stolpcev, ki jih poizvedba izbere iz tabel, ali znak ' * «, da izberete celotno vrstico. Stolpci, ki niso navedeni tukaj, ne bodo vključeni v nabor rezultatov podatkov. To seveda ne pomeni, da bodo izbrisani ali da bodo njihovi podatki izbrisani iz tabel, saj poizvedba ne vpliva na podatke v tabelah – prikazuje le podatke.

OD- ključna beseda, ki mora biti prisotna v vsaki zahtevi. Ključni besedi FROM sledi en ali več presledkov in nato seznam izvornih tabel, ki so uporabljene v poizvedbi. Imena tabel so ločena z vejicami. Tabelam je mogoče dodeliti vzdevke, ki so lahko uporabni za pridruževanje tabele sami sebi ali za dostop do trenutnega zapisa zunanje poizvedbe iz ugnezdene podpoizvedbe (ugnezdene podpoizvedbe tukaj niso obravnavane). Vzdevek je začasno ime tabele, ki se uporablja samo v tej poizvedbi in se ne uporablja naprej. Vzdevek je ločen od imena glavne tabele z vsaj enim presledkom. Sintaksni diagram dela FROM je prikazan na sliki. 9.


Vsi naslednji deli stavka SELECT so neobvezni.

· KJE- ključna beseda, ki ji sledi predikatni pogoj, ki določa tiste zapise, ki bodo vključeni v nastali niz podatkov poizvedbe.

Oglejmo si odnos baze podatkov, ki modelira opravljeno sejo v določeni izobraževalni ustanovi. Naj bo sestavljen iz treh relacij , , . Predvidevamo, da jih predstavljajo tabele R1, R2 in R3.

R1=(ime, disciplina, razred)

R2=(ime, skupina)

R3=(skupina, disciplina)

Tukaj je nekaj primerov uporabe stavka SELECT.

· Seznam vseh skupin (brez ponavljanj), kjer bodo potekali izpiti

IZBERI DISTINCT Skupine
IZ R3

· Seznam študentov, ki so opravili izpit DB z oceno »odlično«.

IZBERI polno ime
OD R1
KJE Disciplina= "DB" IN Ocena = 5

· Seznam vseh študentov, ki morajo nekaj opraviti, skupaj z imenom discipline.

IZBERI Polno ime, disciplina
IZ R2, R3
KJE R1.Skupina = R2.Skupina

Tukaj del WHERE podaja pogoje za povezavo relacij R1 in R2. Če v delu WHERE ni združevalnih pogojev, bo rezultat enakovreden razširjenemu kartezičnemu produktu in v tem primeru bi bile vsakemu študentu dodeljene vse discipline iz relacije R2 in ne tistih, ki jih mora opravljati njegova skupina.

· Seznam slobov z več dvojkami

IZBERI Polno ime
OD R1 a, R1 b
KJE a.polno ime = b.polno ime IN
a.Disciplina <> b.Disciplina IN
a.Ocenjevanje<= 2 IN b.Ocenjevanje.<= 2

Tukaj smo uporabili vzdevke za poimenovanje relacije R1 a in b, saj moramo za zapis iskalnih izrazov delati z dvema primerkoma te relacije hkrati.

Iz teh primerov je jasno razvidno, da logika izbirnega operatorja (kartezični produkt-izbor-projekcija) ne sovpada z vrstnim redom opisa podatkov v njem (najprej seznam polj za projekcijo, nato seznam tabel za kartezični produkt, potem pogoj spajanja). Dejstvo je, da je bil SQL prvotno razvit za uporabo s strani končnega uporabnika in so ga skušali približati naravnemu jeziku in ne algoritemskemu jeziku. Seveda je bila izbrana angleščina kot naravni jezik, kot mednarodni jezik, ki se široko uporablja v računalništvu in programiranju. Zaradi tega SQL sprva povzroča zmedo in razdraženost med profesionalnimi programerji, ki ga začenjajo preučevati in so navajeni govoriti s strojem v algoritemskih jezikih.

Prisotnost nedefiniranih vrednosti Null poveča prilagodljivost obdelave informacij, shranjenih v bazi podatkov. V naših primerih lahko predpostavimo situacijo, ko je študent prišel na izpit, vendar ga iz nekega razloga ni opravil; v tem primeru ima ocena pri neki disciplini za tega študenta negotovo vrednost. V tej situaciji lahko postavite vprašanje: "Poiščite študente, ki so prišli na izpit, vendar ga niso opravili, in navedite ime discipline." Stavek Select bi bil videti takole:

IZBERI Polno ime, disciplina

KJE Ocena JE NIČ

Takoj bi rad rekel, da so vsi prej navedeni primeri pogojni. Zakaj? Ali ne bodo delovale v pravih bazah podatkov? Se motijo? Tukaj je vse pravilno, razen imen atributov ali stolpcev tabele. Večina DBMS (sistemov za upravljanje baz podatkov) ne dovoljuje poimenovanja stolpcev v nacionalnih jezikih; so objekti baze podatkov in jezikovni objekti in zahtevajo, da so poimenovani v skladu s konvencijami o poimenovanju identifikatorjev tega jezika. Najpogosteje je lahko ime atributa zaporedje latiničnih črk in številk, ki se začne s črko, ne vsebuje nekaterih posebnih znakov (na primer presledkov, pik, vejic, znakov za odstotke, % in drugih posebnih znakov) in ima nekatere omejitve glede dolžina. Te omejitve so različne v različnih DBMS, na primer v MS SQL Server 2000 – dolžina imena atributa lahko doseže 128 znakov. Dolga imena atributov so neprijetna za pisanje poizvedbe, vendar zelo kratka enočrkovna imena ne omogočajo ohranitve semantike pomena stolpca tabele, zato izberejo kompromis in ga poimenujejo kratko, a priročno, tako da ni potrebe da si pri pisanju vsake poizvedbe ogledate celoten opis baze podatkov. Poleg tega se imena atributov, kot tudi imena drugih objektov, ne smejo ujemati s ključnimi besedami SQL – tj. tiste besede, ki so vključene v operaterje jezika.

Zato bi morali z vidika pravilnosti v obrazcu predstaviti shemo baze podatkov »Session«.

R1=(St_name,Disciplina, Mark)

R2=(St_name,N_group)

R3=(N_skupina,disciplina)

In ustrezno spremenite vse zahteve.

Uporaba agregatnih funkcij in ugnezdenih poizvedb v stavku Select

Poizvedbe lahko izračunajo posplošeno skupinsko vrednost polj na enak način kot vrednost posameznega polja. To se naredi z uporabo agregatnih funkcij. Združevalne funkcije ustvarijo eno samo vrednost za celotno skupino tabel. Seznam teh funkcij:

Združevalne funkcije se uporabljajo podobno kot imena polj v stavku SELECT, z eno izjemo: vzamejo ime polja kot argument. S funkcijama SUM in AVG lahko uporabite samo številska polja. S funkcijami COUNT, MAX in MIN lahko uporabite številska in znakovna polja. Če se uporabljata z znaknimi polji, jih MAX in MIN prevedeta v ekvivalent ASCII in bodo obdelana po abecednem vrstnem redu. Nekateri DBMS dovoljujejo uporabo ugnezdenih agregatov, vendar je to odstopanje od standarda ANSI z vsemi posledičnimi posledicami.

Če se znova obrnemo na bazo podatkov »Session« (tabele R1, R2, R3), najdemo število uspešno opravljenih izpitov:

IZBERI ŠTEVILO(*)
OD R1
WHERE Oznaka > 2;

To se seveda razlikuje od izbire polja, saj vedno vrne eno samo vrednost, ne glede na to, koliko vrstic je v tabeli. Zaradi tega združevalnih funkcij in polj ni mogoče izbrati hkrati, razen če je uporabljena posebna klavzula GROUP BY.

Klavzula GROUP BY vam omogoča, da definirate podmnožico vrednosti, imenovano skupina, in uporabite agregatno funkcijo za to skupino. Skupina se oblikuje iz vseh vrstic, za katere imajo vrednosti polj združevanja, določene v klavzuli GROUP BY, enako vrednost. To omogoča združevanje polj in združevalnih funkcij v enem samem členu SELECT. Sintaksni diagram za uporabo agregatnih funkcij je prikazan na sliki 10. Agregatne funkcije je mogoče uporabiti tako v izrazu za prikaz rezultatov vrstice. IZBERI, in v izrazu za pogoj obdelave oblikovanih skupin IMATI. V tem primeru se vsaka agregatna funkcija izračuna za vsako izbrano skupino. Vrednosti, pridobljene z izračunom agregatnih funkcij, se lahko uporabijo za prikaz ustreznih rezultatov ali za pogojevanje izbire skupin.

Pri uporabi agregatnih funkcij se morate zavedati, da lahko nabor rezultatov vsebuje samo vrednosti polj za združevanje in po možnosti vrednosti agregatnih funkcij. Ni dovoljeno združevati po eni vrednosti in prikazovati druge vrednosti. To bo sintaksna napaka.

Na primer, poizvedba, kot je ta, bo vedno neuspešna:

Izberite A

Skupina po B

Res, ugotovimo. Kaj hočemo najti? Poskušamo izpisati nekaj vrednosti stolpca A iz mize T, in hkrati izvedete grupiranje po drugem stolpcu, stolpcu IN. Izvajamo združevanje - to pomeni, da zberemo vse vrstice z enakimi vrednostmi stolpca B v eno skupino in nato, in potem ni jasno, prikažemo vrednost stolpca A, vendar je v eni skupini lahko veliko vrednosti, različne vrednosti stolpca A. Kakšno vrednost torej umaknemo? To ni nerazumljivo ne nam ne računalniku. Zato takšno zahtevo zavrne in navede, da imamo sintaktično napako.


Vrnimo se k naši bazi podatkov Session, vendar ji dodamo še nekaj atributov. Prvič, med študenti so lahko soimenjaki, zato bomo za identifikacijo študenta uporabili ime študentske knjižice, ki dijaka vedno enolično identificira. In drugič, predpostavimo, da lahko študent večkrat poskusi opraviti izpit iz iste discipline, zato bomo v relacijo R1 vnesli datum naslednjega poskusa opravljanja izpita. In končno, tretji dodatek, predpostavimo, da na naši univerzi obstaja veliko skupin, ki študirajo v različnih specialitetah, potem bo shema naše baze podatkov naslednja

Seja (N_zach,Disciplina,Oznaka,Podatki_ex)

Primer 21. Pridobite skupno število dobaviteljev (ključna beseda ŠTEJTE ):

IZBERI ŠTEVILO(*) KOT N

Rezultat je tabela z enim stolpcem in eno vrstico, ki vsebuje število vrstic iz tabele P:

Uporaba agregatnih funkcij z združevanjem

Primer 23 . Za vsak del pridobite skupno dobavljeno količino (ključna beseda ZDRUŽI PO …):

SUM(PD.VOLUME) KOT SM

GROUP BY PD.DNUM;

Ta zahteva bo izvedena na naslednji način. Najprej bodo vrstice izvorne tabele razvrščene tako, da vsaka skupina vsebuje vrstice z enakimi vrednostmi DNUM. Nato bo v vsaki skupini polje VOLUME sešteto. Ena vrstica iz vsake skupine bo vključena v nastalo tabelo:

Komentiraj. Na seznamu izbranih polj stavka SELECT, ki vsebuje razdelek GROUP BY, lahko vključite samo agregatne funkcije in polja, ki so vključeni v pogoj združevanja. Naslednja poizvedba bo povzročila sintaktično napako:

SUM(PD.VOLUME) KOT SM

GROUP BY PD.DNUM;

Razlog za napako je, da seznam izbranih polj vključuje polje PNUM, ki Izključeno v razdelek GROUP BY. Dejansko lahko vsaka nastala skupina vrstic vsebuje več vrstic z različno vrednosti polja PNUM. Iz vsake skupine vrstic bo ustvarjena ena skupna vrstica. Vendar ni jasnega odgovora na vprašanje, katero vrednost izbrati za polje PNUM v zadnji vrstici.

Komentiraj. Nekatera narečja SQL tega ne obravnavajo kot napako. Poizvedba bo izvedena, vendar je nemogoče predvideti, katere vrednosti bodo vnesene v polje PNUM v končni tabeli.

Primer 24 . Pridobite številke delov, katerih skupna dobavljena količina presega 400 (ključna beseda IMATI …):

Komentiraj. Pogoja, da mora biti skupna dobavljena količina večja od 400, ni mogoče formulirati v klavzuli WHERE, ker V tem razdelku ne morete uporabljati agregatnih funkcij. Pogoje, ki uporabljajo agregatne funkcije, je treba postaviti v poseben razdelek HAVING:

SUM(PD.VOLUME) KOT SM

SKUPINA PO PD.DNUM

HAVING SUM(PD.VOLUME) > 400;

Kot rezultat dobimo naslednjo tabelo:

Komentiraj. Ena poizvedba lahko vsebuje pogoje izbire vrstice v razdelku WHERE in pogoje izbire skupine v razdelku HAVING. Pogojev za izbiro skupine ni mogoče premakniti iz razdelka HAVING v razdelek WHERE. Podobno pogojev za izbiro vrstic ni mogoče premakniti iz razdelka WHERE v razdelek HAVING, z izjemo pogojev, ki vključujejo polja s seznama združevanja GROUP BY.

Uporaba podpoizvedb

Zelo priročno orodje, ki vam omogoča, da poizvedbe oblikujete na bolj razumljiv način, je možnost uporabe podpoizvedb, ugnezdenih znotraj glavne poizvedbe.

Primer 25 . Pridobite seznam dobaviteljev, katerih status je nižji od največjega statusa v tabeli dobaviteljev (primerjava s podpoizvedbo):

KJER P.STATYS<

(IZBERI MAX(P.STATUS)

Komentiraj. Ker polje P.STATUS se primerja z rezultatom podpoizvedbe, potem mora biti podpoizvedba oblikovana tako, da vrne tabelo, ki točno eno vrstico in en stolpec.

Komentiraj

    Izvedi enkrat ugnezdeno podpoizvedbo in dobite največjo vrednost statusa.

    Preglejte tabelo dobavitelja P, vsakič primerjajte vrednost statusa dobavitelja z rezultatom podpoizvedbe in izberite samo tiste vrstice, v katerih je status nižji od maksimuma.

Primer 26 . Uporaba predikata IN

(IZBERI DISTINKT PD.PNUM

KJE PD.DNUM = 2);

Komentiraj. V tem primeru lahko ugnezdena podpoizvedba vrne tabelo, ki vsebuje več vrstic.

Komentiraj. Rezultat izvedbe zahteve bo enakovreden rezultatu naslednjega zaporedja dejanj:

    Izvedi enkrat ugnezdeno podpoizvedbo in pridobite seznam številk dobaviteljev, ki dobavljajo številko dela 2.

    Preglejte tabelo dobavitelja P in vsakič preverite, ali je številka dobavitelja vsebovana v rezultatu podpoizvedbe.

Primer 27 . Uporaba predikata OBSTAJATI . Pridobite seznam dobaviteljev, ki dobavljajo del številka 2:

PD.PNUM = P.PNUM IN

Komentiraj. Rezultat izvedbe zahteve bo enakovreden rezultatu naslednjega zaporedja dejanj:

    Scan dobaviteljeva tabela P, vsakič, ko izvedete podpoizvedbo z novo vrednostjo številke dobavitelja, vzeto iz tabele P.

    V rezultat poizvedbe vključite samo tiste vrstice iz tabele dobaviteljev, za katere je ugnezdena podpoizvedba vrnila neprazen niz vrstic.

Komentiraj. Za razliko od prejšnjih dveh primerov ugnezdena podpoizvedba vsebuje parameter (zunanjo povezavo), posredovan iz glavne zahteve - številko ponudnika P.PNUM. Take podpoizvedbe imenujemo korelirano (korelirano ). Zunanja referenca lahko prevzame drugačno vrednost za vsako kandidatno vrstico, ki jo ovrednoti podpoizvedba, zato je treba podpoizvedbo znova izvesti za vsako vrstico, izbrano v glavni poizvedbi. Takšne podpoizvedbe so značilne za predikat EXIST, vendar jih je mogoče uporabiti v drugih podpoizvedbah.

Komentiraj. Morda se zdi, da bodo poizvedbe, ki vsebujejo korelirane podpoizvedbe, počasnejše od poizvedb z nekoreliranimi podpoizvedbami. Pravzaprav temu ni tako, saj... način, kako je uporabnik oblikoval zahtevo, ne opredeljuje kako bo ta zahteva izvršena. Jezik SQL ni proceduralen, ampak deklarativen. To pomeni, da uporabnik, ki oblikuje zahtevo, preprosto opisuje, kakšen naj bo rezultat poizvedbe, in kako bo ta rezultat dosežen, je odgovornost samega DBMS.

Primer 28 . Uporaba predikata NE OBSTAJA . Pridobite seznam dobaviteljev, ki ne dobavljajo dela številka 2:

PD.PNUM = P.PNUM IN

Komentiraj. Tako kot v prejšnjem primeru je tukaj uporabljena korelirana podpoizvedba. Razlika je v tem, da bo glavna poizvedba izbrala tiste vrstice iz tabele dobaviteljev, za katere ugnezdena podpoizvedba ne vrne niti ene vrstice.

Primer 29 . Pridobite imena dobaviteljev, ki dobavljajo vse dele:

IZBERI DISTINCT PNAME

PD.DNUM = D.DNUM IN

PD.PNUM = P.PNUM));

Komentiraj. Ta poizvedba vsebuje dve ugnezdeni podpoizvedbi in izvaja relacijsko operacijo delitve odnosov.

Najbolj notranja podpoizvedba je parametrizirana z dvema parametroma (D.DNUM, P.PNUM) in ima naslednji pomen: izberemo vse vrstice s podatki o dobavah dobavitelja s številko PNUM dela s številko DNUM. Zanikanje NE OBSTAJA pomeni, da ta dobavitelj ne dobavlja tega dela. Zunanja podpoizvedba, ki je sama ugnezdeni in parametrirani parameter P.PNUM, je smiselna: izbrati seznam delov, ki jih dobavitelj PNUM ne dobavi. Zanikanje NE OBSTAJA pomeni, da za dobavitelja s številko PNUM ne sme biti delov, ki jih ta dobavitelj ne dobavi. To točno pomeni, da zunanja poizvedba izbere samo dobavitelje, ki dobavljajo vse dele.

SQL je dodal dodatne funkcije, ki vam omogočajo izračun splošnih skupinskih vrednosti. Za uporabo agregatnih funkcij se predpostavlja operacija predhodnega združevanja. Pri združevanju je celoten nabor tulp relacije razdeljen na skupine, v katerih so zbrane tuple, ki imajo enake vrednosti atributov, ki so podane na seznamu združevanja.

Na primer, združimo relacijo R1 po vrednosti stolpca Disciplina. Dobili bomo 4 skupine, za katere lahko izračunamo nekatere vrednosti skupine, na primer število tuplev v skupini, največjo ali najmanjšo vrednost stolpca Score.

To se naredi z uporabo agregatnih funkcij. Združevalne funkcije izračunajo eno samo vrednost za celotno skupino tabel. Seznam teh funkcij je predstavljen v tabeli. 7.

Združevalne funkcije se uporabljajo podobno kot imena polj v stavku SELECT, z eno izjemo: vzamejo ime polja kot argument. S funkcijama SUM in AVG lahko uporabite samo številska polja. S funkcijami COUNT, MAX in MIN lahko uporabite številska in znakovna polja. Če se uporabljata s polji znakov, jih bosta MAX in MIN prevedla v enakovredno kodo ASCII in obdelala po abecednem vrstnem redu. Nekateri DBMS dovoljujejo uporabo ugnezdenih agregatov, vendar je to odstopanje od standarda ANSI z vsemi posledičnimi posledicami.

Na primer, lahko izračunate število študentov, ki so opravljali izpite iz posamezne discipline. Če želite to narediti, morate zagnati poizvedbo, združeno po polju »Disciplina«, in kot rezultat prikazati ime discipline in število vrstic v skupini za to disciplino. Uporaba znaka * kot argumenta za funkcijo COUNT pomeni štetje vseh vrstic v skupini.

IZBERI R1.Disciplina, ŠTEJO (*) OD R1SKUPINE PO R1.Disciplina

rezultat:

Primer. Pridobite seznam disciplin, pri katerih je izpit opravilo vsaj 5 oseb:

SELECT R1.DisciplineFROM R1GROUP BY R1.DisciplineHAVING COUNT(*) >= 5 Rezultat: tukaj stavek HAVING izbere skupine, ki izpolnjujejo dani pogoj.

Ugnezdene poizvedbe

S SQL lahko poizvedbe ugnezdite eno v drugo. Običajno notranja poizvedba ustvari vrednost, ki se preizkusi v predikatu zunanje poizvedbe (v členu WHERE ali HAVING), da se ugotovi, ali je resnična ali napačna. V povezavi s podpoizvedbo lahko uporabite predikat EXISTS, ki vrne true, če izhod podpoizvedbe ni prazen.

Razmerje D (podrobnosti)

Razmerje PD (dobava)

1. Pridobite seznam dobaviteljev, katerih status je nižji od največjega statusa v tabeli dobaviteljev (primerjava s podpoizvedbo):

KJER P.STATYS<

(IZBERI MAX(P.STATUS)

Komentiraj. Ker polje P.STATUS se primerja z rezultatom podpoizvedbe, potem mora biti podpoizvedba oblikovana tako, da vrne tabelo, ki točno eno vrstico in en stolpec.

Komentiraj

  1. Izvedi enkrat ugnezdeno podpoizvedbo in dobite največjo vrednost statusa.
  2. Pregledajte tabelo dobavitelja P, vsakič primerjajte vrednost statusa dobavitelja z rezultatom podpoizvedbe in izberite samo tiste vrstice, v katerih je status nižji od maksimuma.

2. Uporaba predikata IN

(IZBERI DISTINKT PD.PNUM

KJE PD.DNUM = 2);

Komentiraj. V tem primeru lahko ugnezdena podpoizvedba vrne tabelo, ki vsebuje več vrstic.

Komentiraj. Rezultat izvedbe zahteve bo enakovreden rezultatu naslednjega zaporedja dejanj:

  1. Izvedi enkrat ugnezdeno podpoizvedbo in pridobite seznam številk dobaviteljev, ki dobavljajo številko dela 2.
  2. Preglejte tabelo dobavitelja P in vsakič preverite, ali je številka dobavitelja vsebovana v rezultatu podpoizvedbe.

3. Uporaba predikata OBSTAJA . Pridobite seznam dobaviteljev, ki dobavljajo del številka 2:

PD.PNUM = P.PNUM IN

Komentiraj. Rezultat izvedbe zahteve bo enakovreden rezultatu naslednjega zaporedja dejanj:

  1. Scan dobaviteljeva tabela P, vsakič, ko izvedete podpoizvedbo z novo vrednostjo številke dobavitelja, vzeto iz tabele P.
  2. V rezultat poizvedbe vključite samo tiste vrstice iz tabele dobaviteljev, za katere je ugnezdena podpoizvedba vrnila neprazen niz vrstic.

Komentiraj. Za razliko od prejšnjih dveh primerov ugnezdena podpoizvedba vsebuje parameter (zunanjo povezavo), posredovan iz glavne zahteve - številko ponudnika P.PNUM. Take podpoizvedbe imenujemo korelirano (korelirano ). Zunanja referenca lahko prevzame drugačno vrednost za vsako kandidatno vrstico, ki jo ovrednoti podpoizvedba, zato je treba podpoizvedbo znova izvesti za vsako vrstico, izbrano v glavni poizvedbi. Takšne podpoizvedbe so značilne za predikat EXISTS, vendar jih je mogoče uporabiti v drugih podpoizvedbah.

Komentiraj. Morda se zdi, da bodo poizvedbe, ki vsebujejo korelirane podpoizvedbe, počasnejše od poizvedb z nekoreliranimi podpoizvedbami. Pravzaprav temu ni tako, saj... način, kako je uporabnik oblikoval zahtevo, ne opredeljuje kako bo ta zahteva izvršena. Jezik SQL ni proceduralen, ampak deklarativen. To pomeni, da uporabnik, ki oblikuje zahtevo, preprosto opisuje, kakšen naj bo rezultat poizvedbe, in kako bo ta rezultat dosežen, je odgovornost samega DBMS.

4. Uporaba predikata NE OBSTAJA . Pridobite seznam dobaviteljev, ki ne dobavljajo dela številka 2:

KJER NE OBSTAJA

PD.PNUM = P.PNUM IN

Komentiraj. Tako kot v prejšnjem primeru je tukaj uporabljena podpoizvedba. Razlika je v tem, da bo glavna poizvedba izbrala tiste vrstice iz tabele dobaviteljev, za katere ugnezdena podpoizvedba ne vrne niti ene vrstice.

5. Pridobite imena dobaviteljev, ki dobavljajo vse dele:

IZBERI DISTINCT PNAME

KJER NE OBSTAJA

KJER NE OBSTAJA

PD.DNUM = D.DNUM IN

PD.PNUM = P.PNUM));

Komentiraj. Ta poizvedba vsebuje dve ugnezdeni podpoizvedbi in izvaja relacijsko operacijo delitve odnosov.

Najbolj notranja podpoizvedba je parametrizirana z dvema parametroma (D.DNUM, P.PNUM) in ima naslednji pomen: izberemo vse vrstice s podatki o dobavah dobavitelja s številko PNUM dela s številko DNUM. Zanikanje NOT EXISTS pomeni, da dobavitelj ne dobavi dela. Zunanja podpoizvedba, ki je sama ugnezdeni in parametrirani parameter P.PNUM, je smiselna: izbrati seznam delov, ki jih dobavitelj PNUM ne dobavi. Zanikanje NOT EXISTS pomeni, da za dobavitelja s številko PNUM ne sme biti delov, ki jih ta dobavitelj ne dobavi. To točno pomeni, da zunanja poizvedba izbere samo dobavitelje, ki dobavljajo vse dele.

Zunanji priključki

Pogosto je treba tabele združevati tako, da so v rezultatu vse vrstice iz prve tabele, namesto tistih vrstic druge tabele, za katere pogoj združevanja ni izpolnjen, pa so v rezultatu nedefinirane vrednosti. Ali obratno, vključimo vse vrstice iz desne (druge) tabele, manjkajoče dele vrstic iz prve tabele pa dopolnimo z nedefiniranimi vrednostmi. Takšna združenja so se imenovala zunanja.

Na splošno je sintaksa za del FROM v standardu SQL2 naslednja:

OD<список исходных таблиц>< выражение естественного соединения >< выражение соединения >< выражение перекрестного соединения >< выражение запроса на объединение ><список исходных таблиц>::= <имя_таблицы_1>[ tabela_1 sinonim ime] [ …] [,<имя_таблицы_n>[ <имя синонима таблицы_n> ] ]<выражение естественного соединения>:: =<имя_таблицы_1>NARAVNI (NOTRANJI | POLNO LEVO | DESNO) SPOJ<имя_таблицы_2><выражение перекрестного соединения>:: = <имя_таблицы_1>KRIŽNI SPOJ<имя_таблицы_2><выражение запроса на объединение>::=<имя_таблицы_1>PRIDRUŽITE SE SINDIKATU<имя_таблицы_2><выражение соединения>::= <имя_таблицы_1>( NOTRANJA POLNA | LEVO | DESNA ) PRIDRUŽI (VKLJUČENO | )<имя_таблицы_2>

V teh definicijah INNER pomeni notranje (naravno) združevanje, LEFT pomeni levo združevanje, kar pomeni, da rezultat vključuje vse vrstice tabele 1 in deli nastalih tupl, za katere ni bilo ustreznih vrednosti v tabeli 2, so dopolnjen z NULL (nedefiniranimi) vrednostmi. Ključna beseda RIGHT pomeni desni zunanji spoj in za razliko od levega spoja so v tem primeru vse vrstice tabele 2 vključene v nastalo relacijo, manjkajoči deli iz tabele 1 pa so dopolnjeni z ničelnimi vrednostmi. Ključna beseda FULL določa popolno zunanjo združitev: levo in desno. Pri polnem zunanjem združevanju se izvedeta desno in levo zunanje združevanje, nastala relacija pa vključuje vse vrstice iz tabele 1, podložene z ničlami, in vse vrstice iz tabele 2, prav tako podložene z ničlami.

Ključna beseda OUTER pomeni zunanjo, če pa so podane ključne besede FULL, LEFT, RIGHT, se povezava vedno šteje za zunanjo.

Oglejmo si primere izvajanja zunanjih povezav. Vrnimo se k bazi podatkov »Session«. Ustvarimo relacijo, v kateri bodo veljale vse ocene, ki so jih dobili vsi študenti na vseh izpitih, ki so jih morali opravljati. Če študent tega izpita ni opravil, ima namesto ocene nedoločeno vrednost. Da bi to naredili, bomo izvedli zaporedno naravno notranjo združitev tabel R2 in R3 z uporabo atributa Group in povezali nastalo relacijo z levo zunanjo naravno združitvijo s tabelo R1 s pomočjo stolpcev Full Name in Discipline. Vendar pa standard dovoljuje uporabo strukture oklepaja, saj je lahko rezultat povezave eden od argumentov v delu FROM stavka SELECT.

IZBERI R1.Name, R1.Disciplina, R1.RatingFROM (R2 NATURAL INNER JOIN R3) LEFT JOIN R1 Z UPORABO (Ime, Disciplina)

rezultat:

Polno ime Disciplina Ocena
Petrov F.I. Baza podatkov
Sidorov K. A. Baza podatkov
Mironov A.V. Baza podatkov
Stepanova K. E. Baza podatkov
Krilova T.S. Baza podatkov
Vladimirov V. A. Baza podatkov
Petrov F.I. Teorija informacij Nič
Sidorov K. A. Teorija informacij
Mironov A.V. Teorija informacij Nič
Stepanova K. E. Teorija informacij
Krilova T.S. Teorija informacij
vrednost stolpca Score. Tabela 5.7. Agregatne funkcije
funkcija Rezultat
ŠTEJTE Število vrstic ali nepraznih vrednosti polj, ki jih je izbrala poizvedba
SUM Vsota vseh izbranih vrednosti za to polje
AVG Aritmetična sredina vseh izbranih vrednosti za to polje
MIN Najmanjša od vseh izbranih vrednosti za to polje
MAKS Največja od vseh izbranih vrednosti za to polje
R1
Polno ime Disciplina Ocena
1. skupina Petrov F.I. Baza podatkov 5
Sidorov K.A. Baza podatkov 4
Mironov A.V. Baza podatkov 2
Stepanova K.E. Baza podatkov 2
Krilova T.S. Baza podatkov 5
Vladimirov V. A. Baza podatkov 5
2. skupina Sidorov K.A. Teorija informacij 4
Stepanova K.E. Teorija informacij 2
Krilova T.S. Teorija informacij 5
Mironov A.V. Teorija informacij Nič
3. skupina Trofimov P.A. Omrežja in telekomunikacije 4
Ivanova E. A. Omrežja in telekomunikacije 5
Utkina N.V. Omrežja in telekomunikacije 5
Skupina 4 Vladimirov V. A. angleški jezik 4
Trofimov P.A. angleški jezik 5
Ivanova E. A. angleški jezik 3
Petrov F.I. angleški jezik 5

Agregatne funkcije se uporabljajo podobno kot imena polj v stavku SELECT, vendar z eno izjemo: vzamejo ime polja kot argument. S funkcijama SUM in AVG lahko uporabite samo številska polja. S funkcijami COUNT, MAX in MIN lahko uporabite številska in znakovna polja. Če se uporabljata s polji znakov, jih bosta MAX in MIN prevedla v enakovredno kodo ASCII in obdelala po abecednem vrstnem redu. Nekateri DBMS dovoljujejo uporabo ugnezdenih agregatov, vendar je to odstopanje od standarda ANSI z vsemi posledičnimi posledicami.

Na primer, lahko izračunate število študentov, ki so opravljali izpite iz posamezne discipline. Če želite to narediti, morate zagnati poizvedbo, združeno po polju »Disciplina«, in kot rezultat prikazati ime discipline in število vrstic v skupini za to disciplino. Uporaba znaka * kot argumenta za funkcijo COUNT pomeni štetje vseh vrstic v skupini.

IZBERI R1.Disciplina, ŠTEJO (*) IZ R1 SKUPINE PO R1.Disciplina

rezultat:

Če želimo prešteti število ljudi, ki so opravili izpit v kateri koli disciplini, moramo pred združevanjem iz prvotnega razmerja izključiti negotove vrednosti. V tem primeru bo zahteva videti takole:

Dobimo rezultat:

V tem primeru linija s študentom

Mironov A.V. Teorija informacij Nič

ne bo spadal v nabor tulp pred združevanjem, tako da je število tuplov v skupini disciplinirano " Teorija informacij" bo 1 manj.

Je lahko uporabljen agregatne funkcije tudi brez operacije predzdruževanja, v tem primeru se celotna relacija obravnava kot ena skupina in za to skupino je mogoče izračunati eno vrednost na skupino.

Če se znova obrnemo na bazo podatkov »Session« (tabele R1, R2, R3), najdemo število uspešno opravljenih izpitov:

To se seveda razlikuje od izbire polja, saj je vedno vrnjena ena sama vrednost, ne glede na to, koliko vrstic je v tabeli. Prepir agregatne funkcije lahko obstajajo ločeni stolpci tabele. Če pa želite na primer izračunati število različnih vrednosti določenega stolpca v skupini, morate uporabiti ključno besedo DISTINCT skupaj z imenom stolpca. Izračunajmo število različnih ocen, prejetih v vsaki disciplini:

rezultat:

Rezultat lahko vključuje vrednost polja združevanja in več agregatne funkcije, v pogojih združevanja pa lahko uporabite več polj. V tem primeru se skupine oblikujejo glede na nabor določenih polj za združevanje. Operacije agregatnih funkcij je mogoče uporabiti za združevanje več izvornih tabel. Na primer, zastavimo vprašanje: za vsako skupino in vsako disciplino določimo število študentov, ki so uspešno opravili izpit, in povprečno oceno pri disciplini.

rezultat:

Ne moremo uporabiti agregatne funkcije v klavzuli WHERE, ker so predikati ovrednoteni glede na eno vrstico, in agregatne funkcije- glede na skupine prog.

Klavzula GROUP BY vam omogoča, da definirate podmnožico vrednosti v določenem polju glede na drugo polje in uporabite agregatno funkcijo za podmnožico. To omogoča združevanje polj in agregatne funkcije v enem samem stavku SELECT. Agregatne funkcije lahko uporabite v izrazu za izpis rezultatov vrstice SELECT in v izrazu za pogoj obdelave generiranih skupin HAVING. V tem primeru se vsaka agregatna funkcija izračuna za vsako izbrano skupino. Vrednosti, pridobljene z izračunom agregatne funkcije, lahko uporabite za prikaz ustreznih rezultatov ali za pogojevanje izbire skupin.

Izdelajmo poizvedbo, ki prikazuje skupine, v katerih je bila pri eni disciplini na izpitih prejeta več kot ena slaba ocena:

V prihodnosti, kot primer, ne bomo delali z bazo podatkov »Session«, temveč z bazo podatkov »Bank«, sestavljeno iz ene tabele F, ki shranjuje relacijo F, ki vsebuje informacije o računih v podružnicah določene banke:

F = (N, polno ime, podružnica, datum odprtja, datum zaključka, stanje); Q = (podružnica, mesto);

saj je na tej podlagi možno nazorneje ponazoriti delo z agregatnimi funkcijami in združevanjem.

Denimo, da želimo najti skupno stanje bančnih računov. Za vsako od njih lahko ustvarite ločeno poizvedbo tako, da v tabeli za vsako vejo izberete SUM(Stanje). GROUP BY pa vam bo omogočil, da jih vse postavite v en ukaz:

SELECT Branch, SUM(Remaining) FROM F GROUP BY Branch;

Velja GROUP BY agregatne funkcije neodvisno za vsako skupino, definirano z vrednostjo polja Branch. Skupino sestavljajo vrstice z enako vrednostjo polja Branch in