Você está na página 1de 28

Klauzule GROUP BY i

HAVING

Klauzula GROUP BY
Klauzula GROUP BY ima zadatak da omogui
grupisanje vrsta u rezultujuoj tabeli na
osnovu identinih vrednosti
Specijalan nain upotrebe operatora GROUP
BY je povezivanje neke agregatne funkcije sa
grupom redova

Klauzula GROUP BY
Primer1:
SQL upit koji NE MOE DA SE IZVRI i
koji e dovesti do POJAVE GREKE.
SELECT Ime, Prezime, SUM(Plata)
FROM RADNIK;
Ovaj upit je mogu samo uz upotrebu
GROUP BY klauzule.
klauzula GROUP BY izvrava nakon
klauzule WHERE

Klauzula GROUP BY
Primer2:
Nai srednju vrednost plate u svakom
sektoru.
SELECT <kolone1>
FROM <tabele>
WHERE <uslovi>
GROUP BY <kolone2>
Atribut u <kolone1> mora postojati i u
<kolone2>.
U <kolone1> jo moe biti konstanta ili
agregatna funkcija.

Klauzula GROUP BY
WHERE ili ORDER BY klauzule mogu
postojati, u istom upitu, sa GROUP BY
klauzulom.
Nai srednju vrednost plate u svakom
sektoru.
Rjeenje:
SELECT Sektor.Naziv, Avg(Radnik.Plata)
AS ProsekPlata
FROM Sektor, Radnik
WHERE Sektor.Broj=Radnik.Sektor

Klauzula GROUP BY
Primer3:
Nai ukupnu vrednost plata u svakom sektoru
za svako radno mesto.
*Gupisati po sektoru pa po radnom mestu.
SELECT Sektor.Naziv, Sektor.Sef,
SUM(Radnik.Plata) AS Ukupno
FROM Radnik,Sektor
WHERE Radnik.Sektor=Sektor.Broj
GROUP BY Sektor.Naziv, Sektor.Sef

Klauzula GROUP BY
Kvalifikovano grupisanje
HAVING logiki_izraz.
Svaki upitni blok formulisan GROUP
BY i HAVING operatorom moe se
preformulisati u oblik koji ih ne
koristi.

Upotreba HAVING klauzole


Klauzula HAVING omoguava filtriranje
rezultata dobijenih korienjem GROUP
BY klauzule
HAVING je slian WHERE klauzuli
Primer5:U izvjetaju prikazati ime
sektora i srednju platu u tom sektoru.
Izjetaj treba da da podatke za sektore u
kojima je srednja plata vea od 40000.

Upotreba HAVING klauzole


SELECT Sektor.Naziv,
Avg(Radnik.Plata) AS
ProsekPlata
FROM Sektor, Radnik
WHERE
Sektor.Broj=Radnik.Sektor
GROUP BY Sektor.Naziv
HAVING
Avg(Radnik.Plata)>40000;

Upotreba HAVING klauzole


Primer 6
SQL upit iz prethodnog primera je
modifikovan, korienjem HAVING
klauzule, tako da su prikazani podaci
samo o sektorima koji imaju vie od
jednog radnika.
SELECT Sektor, COUNT(*)
FROM RADNIK
GROUP BY Sektor
HAVING COUNT(*) > 1;

Klauzule GROUP BY i
HAVING

Primena
Klauzule GROUP BY i HAVING je mogue
kombinovati sa WHERE klauzulom
WHERE - primenjuje se predikat koji odreuje
vrste koje ulaze u sastav rezultujue tabele
GROUP BY - vri se grupisanje vrsta u
rezultujuoj tabeli
HAVING - primenjuje se predikat koji odreuje
vrste koje e ostati u rezultatu upita
ORDER BY - sortiranje rezultata se vri tek na
kraju

Klauzule GROUP BY i
HAVING
Primer 7
SELECT Sektor, COUNT(*) AS
BrojRadnika
FROM RADNIK
WHERE Pol = ''
GROUP BY Sektor
HAVING COUNT(*) > 1;

Klauzule GROUP BY i
HAVING
Primer 8
SELECT Sektor, Pol, COUNT(*) AS
ProsekPlata
FROM RADNIK
GROUP BY Sektor, Pol
ORDER BY AVG(Plata);

Spajanje tabela
Svi SQL upiti koje smo do sada razmatrali su
koristili podatke iz samo jedne tabele.
esto se javlja situacija da se traena
informacija nalazi u veem broju tabela.
U takvim situacijama potrebno je izvriti
spajanje vrsta iz razliitih tabela i
generisanje rezultujue tabele.
Za pribavljanje podataka iz veeg broja
tabela dovoljno je u klauzuli FROM navesti
imena tabela iz kojih elimo da pribavimo
podatke.

Spajanje tabela
Da bi spajanje tabela bilo uspeno, osim u
nekim specijalnim sluajevima, potrebno je
da navedemo uslov spoja, odnosno da
navedemo kolone na osnovu ijih vrednosti
se vri spajanje vrsta iz razliitih tabela.
Spajanje tabela se vri tako to se najee
uparuje strani klju iz jedne tabele sa
primarnim kljuem koji referencira u drugoj
tabeli.

Spajanje tabela
Uslov spajanja moe da se zada u okviru
WHERE klauzule ili korienjem kljune
rei JOIN u okviru FROM klauzule.
Spoj na jednakost (equi-join)
obezbeuje spajanje podataka iz dve ili
vie tabela na osnovu jednakosti
odgovarajuih atributa, obino na osnovu
primarnih i spoljnih kljueva.
Najjednostavniji sluaj navoenja spoja je
kada se u WHERE klauzuli specificira uslov
spoja po jednakosti.

Spajanje tabela
Dekartov proizvod je sluaj kada u
WHERE klauzuli ne postoji uslov spoja, a u
FROM klauzuli je navedeno vie tabela.
U tom sluaju nema spajanja vrsta po
vrednosti nekog atributa, ve se pravi
kombinacija svake vrste iz jedne tabele sa
svakom vrstom iz druge tabele (u sluaju
Dekartovog proizvoda dve tabele)

Spajanje tabela
Spoljni spoj (outer-join) omoguava spajanje
dve tabele po vrednosti nekog atributa, ali i
ukljuivanje onih torki (vrsta) iz jedne ili druge
tabele (ili iz obe), koje ne zadovoljavaju uslov
jednakosti.
Da bi bolje razumeli razliite tipove spoja
koristiemo tabele RADNIK i SEKTOR ali u neto
jednostavnijem obliku. Pojednostavljene verzije
tabela, RADNIK1 i SEKTOR1, su date u nastavku.
Za svaki tip spoja daemo oba oblika navoenja
uslova spoja: i korienjem WHERE klauzule i
korienjem kljune rei JOIN u klauzuli FROM.

Spajanje tabela

Modifikovane tabele RADNIK i SEKTOR

Dekartov proizvod (cross-join)


Dekartov proizvod dve tabele (A CROSS JOIN B)
se dobija tako to se svaka vrsta iz jedne tabele
kombinuje sa svakom vrstom iz druge tabele.
Prilikom korienja Dekartovog proizvoda tabela treba
voditi rauna da sintaksa CROSS JOIN nije podrana od
strane MS Access-a.
SELECT *
FROM SEKTOR1, RADNIK1;
SELECT *
FROM SEKTOR1 CROSS JOIN RADNIK1;

Dekartov proizvod (cross-join)

Unutranji spoj (inner-join)


Inner join predstavlja najee korieni tip spoja. Ovaj
tip spoja, u osnovi, definie presek vrsta iz tabela koje
uestvuju u spoju.
Prilikom spajanja dve tabele (A INNER JOIN B) uzimaju
se sve vrste iz tabele A i pronalazi im se odgovarajua
vrsta u tabeli B.
Ukoliko vrsta iz tabele A nema odgovarajuu vrstu u
tabeli B ne ukljuuje se u rezultat.
Ukoliko vrsti iz tabele A odgovara vie vrsta tabele B ona
se u rezultatu ponavlja vie puta (po jednom za svaku
odgovarajuu vrstu u tabeli B).

Dekartov proizvod (cross-join)


Prilikom spajanja tabela treba voditi rauna o
tome da kolone u razliitim tabelama mogu imati
ista imena. Potrebno je obezbediti mehanizam koji
e DBMS-u precizno specificirati kolonu koju elite
da referencirate.
U takvim situacijama se koristi sintaksa
IME_TABELE.IME_KOLONE. U SQL upitima koji su dati u
nastavku taj pristup je iskorien za kolone SEKTOR1.Broj
i RADNIK1.Sektor mada nije bilo neophodno jer kolone
imaju razliita imena.
Isti pristup treba primeniti i za klauzulu SELECT ukoliko
se javi slian problem.

Unutranji spoj (inner-join)


SELECT *
FROM SEKTOR1, RADNIK1
WHERE SEKTOR1.Broj = RADNIK1.Sektor;
SELECT *
FROM SEKTOR1 INNER JOIN RADNIK1 ON
SEKTOR1.Broj = RADNIK1.Sektor;

Levi spoljanji spoj (left-outer join)


Left-outer join u osnovi predstavlja proireni inner-join.
Ovaj tip spoja pred vrsta koje ukljuuje unutranji spoj i
vrste iz tabele A (leve tabele) koje nemaju odgovarajuu
vrstu u tabeli B (desnoj tabeli). Kolone iz tabele B u ovom
sluaju imaju vrednost NULL.
SELECT *
FROM SEKTOR1 LEFT OUTER JOIN RADNIK1 ON
SEKTOR1.Broj = RADNIK1.Sektor;

Desni spoljanji spoj (right-outer join)


Right outer join funkcionie kao i left outer join samo je
sada uloga tabela promenjena. Desni spolja[nji spoj u
rezultat ukljuuje vrste iz tabele B (desne tabele) koje
nemaju odgovarajuu vrstu u tabeli A (levoj tabeli).
SELECT *
FROM SEKTOR1 RIGHT OUTER JOIN RADNIK1 ON
SEKTOR1.Broj = RADNIK1.Sektor;

Potpuni spoljanji spoj (full-outer join)


Full outer join predstavlja kombinaciju rezultata koje
vraaju left outer i right outer join. Poptpuni spoljanji spoj
sadri vrste iz obe tabele (i iz A i iz B) koje nemaju
odgovarajue slogove u drugoj tabeli.
MS Access ne podrava FULL OUTER JOIN sintaksu koja je koriena
u narednom SQL upitu.

SELECT *
FROM SEKTOR1 FULL OUTER JOIN RADNIK1 ON
SEKTOR1.Broj = RADNIK1.Sektor;

Você também pode gostar