Download as pdf or txt
Download as pdf or txt
You are on page 1of 13

NAREDBA SELECT II

Ciljevi lekcije

Upoznati se sa mogunostima SELECT naredbe za generisanje sumarnih informacija. Nauiti osnove korienja naredbe SELECT za pretraivanje podataka u veem broju tabela. Upoznati se sa razliitim tipovima spoja koji mogu da postoje izmeu tabela. Upoznati se sa mogunou kombinovanja rezultata veeg broja upita.

U ovoj lekciji e biti obraene naprednije teme vezane za korienje SELECT naredbe za pretraivanje i pribavljanje podataka iz relacione baze podataka. U prethodnoj lekciji smo obradili osnovne oblike SELECT naredbe i videli kako naredba moe da se koristi za pribavljanje podataka iz jedne tabele. U ovoj lekciji upoznaemo se sa mogunou grupisanja podataka po razliitim kriterijumima. Videemo kako je u rezultujuoj tabeli mogue kombinovati podatke iz nekoliko razliitih tabela. Takoe, upoznaemo se i sa mogunostima kombinovanja rezultata veeg broja SQL upita.

NEOPHODNO PREDZNANJE
Relacija Tabela sa vrstama i kolonama. Atribut relacije Predstavlja osobinu entiteta predstavljenog relacijom. Atribut je praktino imenovana kolona relacije odnosno tabele, koje se odnose na svojstva objekta predstavljenog relacijom. Torka relacije Vrsta relacije. Spoljni klju / Strani klju Atribut ili skup atributa jedne relacije koji se uparuje sa kljuem kandidatom neke druge ili iste relacije.

Referencijalni integritet Ako postoji neki spoljni klju u relaciji, njegova vrednost mora biti jednaka vrednosti kljua kandidata neke torke u matinoj relaciji ili njegova vrednost mora biti NULL. SQL Programski jezik koji je projektovan za potrebe pretraivanja i upravljanja podacima u Sistemima za upravljanje relacionim bazama podataka (Relational Database Management Systems - RDBMS), za kreiranje i modifikacija ema relacione baze podataka i za kontrolu pristupa objektima baze podataka.

Naredba SELECT SQL naredba koja se koristi za pribavljanje podatke iz jedne tabele ili vie povezanih tabela koje se nalaze u relacionoj
bazi podataka.

KLAUZULE GROUP BY I HAVING


U prethodnoj lekciji upoznali smo se sa funkcijama agregacije. Ove funkcije imaju zadatak da omogue generisanje sumarnih informacija na osnovu podataka u relacionoj bazi podataka. Klauzula GROUP BY ima zadatak da omogui grupisanje vrsta u rezultujuoj tabeli na osnovu zajednikih vrednosti. Time se poveava vrednost funkcija agregacije jer se u kombinaciji sa GROUP BY klauzulom mogu primenjivati na grupe vrsta a ne samo na itavu rezultujuu tabelu. Primer 1 Potrebno je voditi rauna, da ukoliko ne postoji GROUP BY klauzula, u SELECT klauzuli nije mogue kombinovati funkcije agregacije sa imenima kolona. U nastavku je dat 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 zahteva od DBMS-a da izvri sortiranje rezultujue tabele prema specificiranim kolonama i izvri grupisanje vrsta koje imaju iste vrednosti za specificirane kolone. Ukoliko su prisutne funkcije agregacije one e se primeniti na tako dobijene grupe. Tek uz prisustvo GROUP BY klauzule mogue je u SELECT klauzuli kombinovati imena kolona i funkcije agregacije. Bitno je da napomenuti da se klauzula GROUP BY izvrava nakon klauzule WHERE odnosno da se grupisanje vri tek nakon to su odreene vrste koje treba da uu u sastav rezultujue tabele. Primer 2 U nastavku je dat primer SQL upita koji za svaki sektor rauna broj radnika koji rade u njemu. Za grupisanje radnika po broju sektora u kome radi iskoriena je GROUP BY klauzula. SELECT Sektor, COUNT(*) FROM RADNIK GROUP BY Sektor;

Klauzula HAVING omoguava filtriranje rezultata dobijenih korienjem GROUP BY klauzule. Ova klauzula primenjuje uslov filtriranje na formirane grupe. Primer 3 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;

PRIMENA
Klauzule GROUP BY i HAVING je mogue kombinovati sa WHERE klauzulom. Pri tome treba voditi rauna o redosledu izvravanja (isti je redosled po kome se klauzule reaju prilikom pisanja SELECT naredbe): 1. 2. 3. 4. 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

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

Prilikom korienja klauzule GROUP BY, sve kolone koje su navedene u klauzuli SELECT a na koje nije primenjena neka funkcija agregacije, MORAJU BITI NAVEDENE U GROUP BY KLAUZULI. U suprotnom SQL upit nee moi da se izvri.

Primer 4 Klauzulu GROUP BY je mogue primeniti istovremeno na vei broj kolona. Pri tome su kriterijum za formiranje grupa zajednike vrednosti u specificiranim kolonama. Prilikom formiranja grupa vodi se rauna i o redosledu po kome su kolone za grupisanje navedene (kao da se formiraju grupe sa podgrupama u okviru njih). 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. 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 (Videti ogranienja stranog kljua u Lekciji 2 Videti ta e biti naslov lekcije 2). 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. 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) Spoljni spoj (outer-join) omoguava spajanje dve tabele po vrednosti nekog atributa (kao kod equi-join), 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.

Tabela 1 Modifikovana tabela RADNIK

Tabela 2 Modifikovana tabela SEKTOR

DEKARTOV PROIZVOD (CROSS-JOIN)


Dekartov proizvod dve tabele (A CROSS JOIN B) se dobija tako to se svaa vrsta iz jedne tabele kombinuje sa svakom vrstom iz druge tabele. Primer 5 5

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;

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. 6

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). Primer 6 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. 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. Primer 7 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). Primer 8 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. Primer 9 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; 8

PRIMENA
Primer 10 U nastavku je dat SQL upit koji prikazuje imena sektora i broj radnika koji rade u njima. Obratite panju da je kod ovog upita iskoriena mogunost da se tabelama dodele pseudonimi. SELECT S.Broj, S.Naziv, COUNT(*) AS BrojR FROM SEKTOR1 AS S INNER JOIN RADNIK1 AS R ON S.Broj=R.Sektor GROUP BY S.Broj, S.Naziv;

Primer 11 Sledei SQL upit za sve ene radnike odreuje imena projekata na kojima su angaovane. Spajanje tabela u ovom upitu izvedeno je korienjem WHERE klauzule. Obratite panju da WHERE klauzula pored uslova spoja moe da sadri i uslove kojima se selektuju vrste koje e ui u rezultujuu tabelu. Takoe, obratite panju da sada podatke izvlaimo iz tri tabela: RADNIK, RADI_NA i PROJEKAT. Broj tabela iz kojih izvlaimo podatke nije niim ogranien. Potrebno je voditi rauna da spojevi izmeu tabela budu definisani na odgovarajui nain kako bi dobili eljene podatke. Kako je ve napomenuto spoj se najee definie izmeu spoljanjeg kljua u jednoj tabeli i primarnog kljua koji se referencira u drugoj tabeli (RADI_NA.Radnik i RADNIK.MatBr, RADI_NA.Projekat i PROJEKAT.Broj). Za spajanje razliitih tabela mogu se kombinovati razliiti tipovi spoja. SELECT R.MatBr, R.Ime, R.Prezime, P.Naziv 9

FROM RADNIK R, RADI_NA RN, PROJEKAT P WHERE R.MatBr = RN.Radnik AND RN.Projekat = P.Broj AND R.Pol = "";

Primer 12 Naredni SQL upit za svaki sektor daje ukupan broj radnih sati koje radnici provode na projektima za koje je taj sektor zaduen. MS Access zahteva da spojevi izmeu tabela budu grupisani korienjem zagrada. SELECT S.Broj, S.Naziv, SUM(Sati) AS SatiUkupno FROM (SEKTOR AS S INNER JOIN PROJEKAT AS P ON S.Broj = P.Sektor) INNER JOIN RADI_NA AS RN ON P.Broj = RN.Projekat GROUP BY S.Broj, S.Naziv;

KOMBINOVANJE REZULTATA VIE SQL UPITA


Programski jezik SQL dozvoljava kombinovanje rezultata veeg broj SQL upit korienjem operacija za rad sa skupovima: unija (UNION), presek (INTERSECT) i razlika (MINUS). Klauzula UNION kombinuje rezultate dva ili vie upita u jednu rezultujuu tabelu. Rezultati upita koji se kombinuju moraju imati kolone koje se slau po broju (isti broj kolona), redosledu (odgovarajue kolone se nalaze na istim pozicijama) i tipu (odgovarajue kolone moraju imati kompatibilne tipove). Klauzula INTERSECT vraa samo vrste koje se javljaju u rezultujuim tabelama svih SQL upita koji se kombinuju. Klauzula MINUS vraa samo one vrste koje se javljaju u rezultatu provg SQL upita ali se ne javljaju I u rezultatima ostalih SQL upita.

10

Primer 13 SQL upit u nastavku koristi klauzulu UNION da bi implementirao full-outer join koji nije podran u MS Access-u. SELECT * FROM SEKTOR1 LEFT OUTER JOIN RADNIK1 ON SEKTOR1.Broj=RADNIK1.Sektor UNION SELECT * FROM SEKTOR1 RIGHT OUTER JOIN RADNIK1 ON SEKTOR1.Broj=RADNIK1.Sektor;

Primer 14 U nastavku je dat SQL upit koji vraa nazive sektora u kojima rade radnici koji se prezivaju Petrovi i Jovanovi. SELECT Naziv FROM SEKTOR, RADNIK WHERE Broj = Sektor AND Prezime = 'Jovanovi' UNION SELECT Naziv FROM SEKTOR, RADNIK WHERE Broj = Sektor AND Prezime = 'Petrovi';

Primer 15 U sledeem primeru imamo SQL upit koji korienjem klauzule INTERSECT odreuje podatke o radnicima koji rade u sektoru Administracija I koji imaju platu veu od 40000. MS Access ne podrava klauzulu INTERSECT. SELECT MatBr, Ime, Prezime FROM SEKTOR, RADNIK WHERE Broj = Sektor AND Naziv = 'Administracija' 11

INTERSECT SELECT MatBr, Ime, Prezime FROM SEKTOR, RADNIK WHERE Broj = Sektor AND plata > 40000;

Primer 16 Ukoliko elimo da dobijemo podake o radnicima koji rade u sektoru Administracija a plata im je manja od 40000, upit iz prethodnog primera treba modifikovati takod a se umesto klauzule INTERSECT koristi klauzula MINUS. MS Access ne podrava klauzulu MINUS. SELECT MatBr, Ime, Prezime FROM SEKTOR, RADNIK WHERE Broj = Sektor AND Naziv = 'Administracija' INTERSECT SELECT MatBr, Ime, Prezime FROM SEKTOR, RADNIK WHERE Broj = Sektor AND plata > 40000;

12

PITANJA ZA SAMOSTALNI RAD


SQL upiti Pokuajte da reite niz zadataka koji je dat u nastavku. Za reavanje koristite bazu podataka PREDUZEE koje je priloena uz ovaj materijal. 1. Napisati SQL upit koji za svaki broj sektora odreuje broj projekata koji su zadueni za taj sektor. 2. Napisati SQL upit koji za svaki broj sektora rauna prosenu i maksimalnu platu radnika koji rade u tom sektoru. 3. Napisati SQL upit koji za svaki tip srodstva odreuje broj lanova porodice koji imaju taj tip srodstva. 4. Napisati SQL upit koji odreuje brojeve sektora koji su zadueni za dva i vie projekta. 5. Napisati SQL upit koji za svakog radnika prikazuje ime, prezime, pol i naziv sektora u kome rade. 6. Napisati SQL upit koji za svaki projekat prikazuje njegov broj, naziv i broj angaovanih radnika. 7. Modifikovati upit iz zadatka 7 tako da se prikazuju samo podaci o projektima koji imaju vie od jednog angaovanog radnika. 8. Napisati SQL upit koji prikazuje imena i prezimena radnika koji imaju vie od jednog lana porodice. 9. Napisati SQL upit koji odreuje imena i prezimena radnika koji rade u sektoru broj 4 i nemaju nijednog lana porodice. 10. Napisati SQL upit koji za svaki projekat odreuje ime i prezime rukovodioca sektora koji je zaduen za taj projekat. 11. Napisati SQL upit koji odreuje imena i prezimena radnika koji rade u sektoru broj a angaovani su na projektima koji su u nadlenosti sektora broj 5. 12. Napisati SQL upit koji odreuje imena i prezimena radnika koji se ne nalaze na poziciji ef sektora.

13

You might also like