28
Klauzule GROUP BY i HAVING

Klauzule+GROUP+BY+i+HAVING.ppt

Embed Size (px)

Citation preview

Page 1: Klauzule+GROUP+BY+i+HAVING.ppt

Klauzule GROUP BY i HAVING

Page 2: Klauzule+GROUP+BY+i+HAVING.ppt

Klauzula GROUP BY

Klauzula GROUP BY ima zadatak da omogući grupisanje vrsta u rezultujućoj tabeli na osnovu identičnih vrednosti

Specijalan način upotrebe operatora GROUP BY je povezivanje neke agregatne funkcije sa grupom redova

Page 3: Klauzule+GROUP+BY+i+HAVING.ppt

Klauzula GROUP BYPrimer1:SQL upit koji NE MOŽE DA SE IZVRŠI i koji će dovesti do POJAVE GREŠKE.

SELECT Ime, Prezime, SUM(Plata) FROM RADNIK;

Ovaj upit je moguć samo uz upotrebu GROUP BY klauzule. klauzula GROUP BY izvršava nakon klauzule WHERE

Page 4: Klauzule+GROUP+BY+i+HAVING.ppt

Klauzula GROUP BYPrimer2: Naći 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š može biti konstanta ili agregatna funkcija.

Page 5: Klauzule+GROUP+BY+i+HAVING.ppt

Klauzula GROUP BYWHERE ili ORDER BY klauzule mogu postojati, u istom upitu, sa GROUP BY klauzulom.Naći srednju vrednost plate u svakom sektoru.Rješenje:

SELECT Sektor.Naziv, Avg(Radnik.Plata) AS ProsekPlataFROM Sektor, RadnikWHERE Sektor.Broj=Radnik.SektorGROUP BY Sektor.Naziv;

Page 6: Klauzule+GROUP+BY+i+HAVING.ppt

Klauzula GROUP BYPrimer3:Naći 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 UkupnoFROM Radnik,SektorWHERE Radnik.Sektor=Sektor.Broj

GROUP BY Sektor.Naziv, Sektor.Sef

Page 7: Klauzule+GROUP+BY+i+HAVING.ppt

Klauzula GROUP BY

Kvalifikovano grupisanje

HAVING logički_izraz.

Svaki upitni blok formulisan GROUP BY i HAVING operatorom može se preformulisati u oblik koji ih ne koristi.

Page 8: Klauzule+GROUP+BY+i+HAVING.ppt

Upotreba HAVING klauzoleKlauzula HAVING omogućava filtriranje rezultata dobijenih korišćenjem GROUP BY klauzule

HAVING je sličan WHERE klauzuli

Primer5:U izvještaju prikazati ime sektora i srednju platu u tom sektoru. Izještaj treba da da podatke za sektore u kojima je srednja plata veća od 40000.

Page 9: Klauzule+GROUP+BY+i+HAVING.ppt

Upotreba HAVING klauzole

SELECT Sektor.Naziv, Avg(Radnik.Plata) AS ProsekPlataFROM Sektor, RadnikWHERE Sektor.Broj=Radnik.SektorGROUP BY Sektor.NazivHAVING Avg(Radnik.Plata)>40000;

Page 10: Klauzule+GROUP+BY+i+HAVING.ppt

Upotreba HAVING klauzolePrimer 6 SQL upit iz prethodnog primera je modifikovan, korišćenjem HAVING klauzule, tako da su prikazani podaci samo o sektorima koji imaju više od jednog radnika.

SELECT Sektor, COUNT(*) FROM RADNIK GROUP BY Sektor HAVING COUNT(*) > 1;

Page 11: Klauzule+GROUP+BY+i+HAVING.ppt

Klauzule GROUP BY i HAVINGPrimenaKlauzule GROUP BY i HAVING je moguće kombinovati sa WHERE klauzulom WHERE - primenjuje se predikat koji određuje vrste koje ulaze u sastav rezultujuće tabele GROUP BY - vrši se grupisanje vrsta u rezultujućoj tabeli HAVING - primenjuje se predikat koji određuje vrste koje će ostati u rezultatu upita ORDER BY - sortiranje rezultata se vrši tek na kraju

Page 12: Klauzule+GROUP+BY+i+HAVING.ppt

Klauzule GROUP BY i HAVING

Primer 7

SELECT Sektor, COUNT(*) AS BrojRadnikaFROM RADNIK WHERE Pol = 'Ž' GROUP BY Sektor HAVING COUNT(*) > 1;

Page 13: Klauzule+GROUP+BY+i+HAVING.ppt

Klauzule GROUP BY i HAVING

Primer 8

SELECT Sektor, Pol, COUNT(*) AS ProsekPlata FROM RADNIK GROUP BY Sektor, Pol ORDER BY AVG(Plata);

Page 14: Klauzule+GROUP+BY+i+HAVING.ppt

Spajanje tabela

Svi SQL upiti koje smo do sada razmatrali su koristili podatke iz samo jedne tabele. Često se javlja situacija da se tražena informacija nalazi u većem broju tabela. U takvim situacijama potrebno je izvršiti spajanje vrsta iz različitih tabela i generisanje rezultujuće tabele. Za pribavljanje podataka iz većeg broja tabela dovoljno je u klauzuli FROM navesti imena tabela iz kojih želimo da pribavimo podatke.

Page 15: Klauzule+GROUP+BY+i+HAVING.ppt

Spajanje tabela

Da bi spajanje tabela bilo uspešno, osim u nekim specijalnim slučajevima, potrebno je da navedemo uslov spoja, odnosno da navedemo kolone na osnovu čijih vrednosti se vrši spajanje vrsta iz različitih tabela.

Spajanje tabela se vrši tako što se najčešće uparuje strani ključ iz jedne tabele sa primarnim ključem koji referencira u drugoj tabeli.

Page 16: Klauzule+GROUP+BY+i+HAVING.ppt

Spajanje tabela

Uslov spajanja može da se zada u okviru WHERE klauzule ili korišćenjem ključne reči JOIN u okviru FROM klauzule. Spoj na jednakost (equi-join) obezbeđuje spajanje podataka iz dve ili više tabela na osnovu jednakosti odgovarajućih atributa, obično na osnovu primarnih i spoljnih ključeva.Najjednostavniji slučaj navođenja spoja je kada se u WHERE klauzuli specificira uslov spoja po jednakosti.

Page 17: Klauzule+GROUP+BY+i+HAVING.ppt

Spajanje tabela

Dekartov proizvod je slučaj kada u WHERE klauzuli ne postoji uslov spoja, a u FROM klauzuli je navedeno više tabela. U tom slučaju nema spajanja vrsta po vrednosti nekog atributa, već se pravi kombinacija svake vrste iz jedne tabele sa svakom vrstom iz druge tabele (u slučaju Dekartovog proizvoda dve tabele)

Page 18: Klauzule+GROUP+BY+i+HAVING.ppt

Spajanje tabelaSpoljni spoj (outer-join) omogućava spajanje dve tabele po vrednosti nekog atributa, ali i uključivanje onih torki (vrsta) iz jedne ili druge tabele (ili iz obe), koje ne zadovoljavaju uslov jednakosti.

Da bi bolje razumeli različite tipove spoja koristićemo tabele RADNIK i SEKTOR ali u nešto jednostavnijem obliku. Pojednostavljene verzije tabela, RADNIK1 i SEKTOR1, su date u nastavku. Za svaki tip spoja daćemo oba oblika navođenja uslova spoja: i korišćenjem WHERE klauzule i korišćenjem ključne reči JOIN u klauzuli FROM.

Page 19: Klauzule+GROUP+BY+i+HAVING.ppt

Spajanje tabela

Modifikovane tabele RADNIK i SEKTOR

Page 20: Klauzule+GROUP+BY+i+HAVING.ppt

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 korišćenja Dekartovog proizvoda tabela treba voditi računa da sintaksa CROSS JOIN nije podržana od

strane MS Access-a. SELECT *

FROM SEKTOR1, RADNIK1;

SELECT *

FROM SEKTOR1 CROSS JOIN RADNIK1;

Page 21: Klauzule+GROUP+BY+i+HAVING.ppt

Dekartov proizvod (cross-join)

 

Page 22: Klauzule+GROUP+BY+i+HAVING.ppt

Unutrašnji spoj (inner-join)

Inner join predstavlja najčešće korišćeni tip spoja. Ovaj tip spoja, u osnovi, definiše presek vrsta iz tabela koje učestvuju u spoju. Prilikom spajanja dve tabele (A INNER JOIN B) uzimaju se sve vrste iz tabele A i pronalazi im se odgovarajuća vrsta u tabeli B.

Ukoliko vrsta iz tabele A nema odgovarajuću vrstu u tabeli B ne uključuje se u rezultat.

Ukoliko vrsti iz tabele A odgovara više vrsta tabele B ona se u rezultatu ponavlja više puta (po jednom za svaku odgovarajuću vrstu u tabeli B).

Page 23: Klauzule+GROUP+BY+i+HAVING.ppt

Dekartov proizvod (cross-join)

Prilikom spajanja tabela treba voditi računa o tome da kolone u različitim 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 iskorišćen za kolone SEKTOR1.Broj i RADNIK1.Sektor mada nije bilo neophodno jer kolone imaju različita imena.

Isti pristup treba primeniti i za klauzulu SELECT ukoliko se javi sličan problem.

Page 24: Klauzule+GROUP+BY+i+HAVING.ppt

Unutrašnji spoj (inner-join)SELECT *

FROM SEKTOR1, RADNIK1

WHERE SEKTOR1.Broj = RADNIK1.Sektor;

SELECT *

FROM SEKTOR1 INNER JOIN RADNIK1 ON SEKTOR1.Broj = RADNIK1.Sektor;

Page 25: Klauzule+GROUP+BY+i+HAVING.ppt

Levi spoljašnji spoj (left-outer join)

Left-outer join u osnovi predstavlja prošireni inner-join. Ovaj tip spoja pred vrsta koje uključuje unutrašnji spoj  i vrste iz tabele A (leve tabele) koje nemaju odgovarajuću vrstu u tabeli B (desnoj tabeli). Kolone iz tabele B u ovom slučaju imaju vrednost NULL. SELECT *

FROM SEKTOR1 LEFT OUTER JOIN RADNIK1 ON SEKTOR1.Broj = RADNIK1.Sektor;

Page 26: Klauzule+GROUP+BY+i+HAVING.ppt

Desni spoljašnji spoj (right-outer join)

Right outer join funkcioniše kao i left outer join samo je sada uloga tabela promenjena. Desni spolja[nji spoj u rezultat uključuje vrste iz tabele B (desne tabele) koje

nemaju odgovarajuću vrstu u tabeli A (levoj tabeli). SELECT *

FROM SEKTOR1 RIGHT OUTER JOIN RADNIK1 ON SEKTOR1.Broj = RADNIK1.Sektor;

Page 27: Klauzule+GROUP+BY+i+HAVING.ppt

Potpuni spoljašnji spoj (full-outer join)Full outer join predstavlja kombinaciju rezultata koje vraćaju left outer i right outer join. Poptpuni spoljašnji spoj sadrži vrste iz obe tabele (i iz A i iz B) koje nemaju odgovarajuće slogove u drugoj tabeli. MS Access ne podržava FULL OUTER JOIN sintaksu koja je korišćena u narednom SQL upitu.

SELECT *

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

Page 28: Klauzule+GROUP+BY+i+HAVING.ppt