Baze podataka SQL Jezik relacione BP
UPIT - SELECT - SQL je jezik veoma visokog nivoa (very-high-level language) Programer izbegava korišćenje komplikovanih manipulacija nad podacima (što je neophodno u jezicima kao što je C++, Java, itd.) Pogodnost SQL-a Upiti su veoma dobro optimizovani Upiti se efikasno izvršavaju
UPIT - SELECT - Najznačajnija i najčešće korišćena SQL naredba za manipulaciju podacima Kod svakog upita zadajemo (u principu): Koje podatke tražimo kao rezultat, Iz kojih tabela to tražimo, Koji uslov treba da zadovolje podaci, da bi bili uključeni u rezultat U kom redosledu želimo prikaz podataka
Principska šema za postavljanje upita je: SELECT koji atributi FROM iz kojih tabela WHERE uslov nad zapisima date tabele; UPIT - SELECT -
UPIT - SELECT - Tipičan SQL upit: SELECT A1, A2,..., An FROM r1, r2,...rm WHERE P gde su Ai atributi, ri relacije, a P je uslov selekcije (predikat) Navedeni upit je ekvivalentan sledećem upitu relacione algebre π A 1, A2,..., An(σ P (r1 r2... rn)) Rezultat SQL upita je opet relacija
Prost upit nad jednom tabelom Sintaksa SELECT * {[ALL DISTINCT] R-Lista} FROM ImeTabele [WHERE R-Predikat] [ORDER BY ImeKolone [DESC] {, ImeKolone [DESC]} ]; * - Specijalni slučaj R-liste, kada u rezultat želimo da uključimo sve kolone tabele ALL iz rezultata neuklanja istovetne redove, DISTINCT suprotno. Podrazumeva se ALL. R-Lista se zadaje kao jedan ili više R-Izraza, pored naziva kolone javljaju se i konstante
Prost upit nad jednom tabelom Klauzula FROM ( odakle ), specificira se ImeTabele. To je ime osnovne tabele ili pogleda nad kojim se vrši upit. Ovo je obavezna klauzula. R_Predikat, uslov prikazivanja rezultata, to je logički izraz izračunljiv nad svakim pojedinim redom tabele. Rezultat upita se dobija samo za one vrednosti R_Predikata koje daju istinitosnu vrednost. Najčešće je to relacioni izraz (>,<,=, ) sa kolonama, a sa desne strane može se javiti i konstanta ORDER BY daje željeni redosled prikaza rezultata. Podrazumeva se rastući redosled (ASC). U suprotnom se navodi DESC uz odgovarajuću kolonu. Uvek je poslednja klauzula u SELECT bloku.
Prost upit nad jednom tabelom Najjednostavniji mogući SQL upit je u formi: SELECT * FROM ImeTabele; Ova naredba prikazuje sve redove tabele čije je ime navedeno iza FROM klauzule U svakom redu prikazuju se vrednosti svih kolona, onim redom kako je to zapisano u datoteci (tj. kreirano sa CREATE TABLE) Kod upita se obično traži prikaz samo određenih kolona, ili prikaz svih kolona u redosledu koji je drugačije određen. Ovo odgovara operaciji projekcije, ali se ne eliminišu višestruka ponavljanja istih vrednosti
Prost upit nad jednom tabelom Primeri: Upiti sa dobijenim rezultatima Upit za prikaz cele tabele (simbol *) Ogovara restrikciji σ - kada nema uslova P SELECT * FROM Student ; Student BrInd Ime Prezime 1 Marko Marković 2 Petar Petrović 3 Aleksa Perić SELECT BrInd Ime Prezime 1 Marko Marković 2 Petar Petrović 3 Aleksa Perić
Tri iste naredbe! SELECT * FROM Student; SELECT BrInd, Ime, Prezime FROM Student; Prost upit nad jednom tabelom SELECT Student.BrInd, Student.Ime, Student.Prezime FROM Student; Student BrInd Ime Prezime 1 Marko Marković 2 Petar Petrović 3 Aleksa Perić SELECT BrInd Ime Prezime 1 Marko Marković 2 Petar Petrović 3 Aleksa Perić
Prost upit nad jednom tabelom Upit za prikaz cele tabele u željenom redosledu SELECT * FROM Student ORDER BY Ime; Student BrInd Ime Prezime 1 Marko Marković 2 Petar Petrović 3 Aleksa Perić SELECT BrInd Ime Prezime 1 Aleksa Perić 2 Marko Marković 3 Petar Petrović 28.11.2006. Predavanja 11
Prost upit nad jednom tabelom Upit za prikaz samo jedne kolone iz tabele i bez eliminacije duplikata SELECT Fakultet FROM Student; Odgovara upitu relacione algebre π Fakultet (Student) Student BrInd Ime Prezime Fakultet 1 Marko Marković PFB 2 Petar Petrović FIM 3 Aleksa Perić FIM 4 Marko Marić FTHM 5 Petar Lazić PFB 6 Jovan Marić PFB SELECT Fakultet PFB FIM FIM FTHM PFB PFB
Prost upit nad jednom tabelom Upit za prikaz samo jedne kolone iz tabele i sa eliminacijom duplikata : SELECT DISTINCT Fakultet FROM Student ; Student BrInd Ime Prezime Fakultet 1 Marko Marković PFB 2 Petar Petrović FIM 3 Aleksa Perić FIM SELECT 4 Marko Marić FTHM 5 Petar Lazić PFB 6 Jovan Marić PFB 28.11.2006. Predavanja Fakultet PFB FIM FTHM
Prost upit nad jednom tabelom Upit za prikaz samo jedne kolone iz tabele i sa eliminacijom duplikata, a u željenom redosledu: SELECT DISTINCT Fakultet FROM Student ORDER BY Fakultet ; Student BrInd Ime Prezime Fakultet 1 Marko Marković PFB 2 Petar Petrović FIM 3 Aleksa Perić FIM 4 Marko Marić FTHM 5 Petar Lazić PFB 6 Jovan Marić PFB 28.11.2006. Predavanja SELECT Fakultet FIM FTHM PFB
Prost upit nad jednom tabelom Upit za prikaz više kolona sa zadavanjem uslova: SELECT BrInd, Ime, Prezime FROM Student WHERE Fakultet= FIM ; Student BrInd Ime Prezime Fakultet 1 Marko Marković PFB 2 Petar Petrović FIM 3 Aleksa Perić FIM 4 Marko Marić FTHM 5 Petar Lazić PFB 6 Jovan Marić PFB SELECT BrInd Ime Prezime 2 Petar Petrović 3 Aleksa Perić
Prost upit nad jednom tabelom Upit za prikaz dve kolone sa zadavanjem uslova, a u željenom redosledu: SELECT BrInd, Ime, Prezime FROM Student WHERE Fakultet= FIM ORDER BY Ime; Student BrInd Ime Prezime Fakultet 1 Marko Marković PFB 2 Petar Petrović FIM 3 Aleksa Perić FIM 4 Marko Marić FTHM 5 Petar Lazić PFB 6 Jovan Marić PFB SELECT BrInd Ime Prezime 3 Aleksa Perić 2 Petar Petrović
Prost upit nad jednom tabelom U WHERE klauzuli se mogu koristiti logičke i aritmetičke operacije: SELECT BrInd, Ime, Prezime FROM Student WHERE Fakultet= FIM OR Fakultet= FTHM ORDER BY Ime; Student BrInd Ime Prezime Fakultet 1 Marko Marković PFB 2 Petar Petrović FIM 3 Aleksa Perić FIM 4 Marko Marić FTHM 5 Petar Lazić PFB 6 Jovan Marić PFB SELECT BrInd Ime Prezime 3 Aleksa Perić 4 Marko Marić 2 Petar Petrović
Prost upit nad jednom tabelom Komanda SELECT može da sadrži aritmetičke izraze koji uključuju operacije, +,,, /, na konstantama ili atributima: SELECT SifP, NazivP, Cena 100 FROM Racun; Racun SifP NazivP Kolicina Cena 005 P1 1 1800,00 010 P2 6 300,00 020 P3 5 250,00 001 P3 2 1100,00 003 P3 4 600,00 011 P1 3 700,00 SELECT SifP NazivP Cena 005 P1 180000,00 010 P2 30000,00 020 P3 25000,00 001 P3 110000,00 003 P3 60000,00 011 P1 70000,00
Prost upit nad jednom tabelom Pojedine vrednosti atributa mogu NULL vrednost Predikat IS NULL se koristi za proveru null vrednosti Npr: Naći sve šifre prouzvoda kod kojih je cena NULL SELECT SifP FROM Racun WHERE Cena IS NULL ; Racun SifP NazivP Kolicina Cena 005 P1 1 1800,00 010 P2 6 NULL 020 P3 5 250,00 001 P3 2 1100,00 003 P3 4 NULL 011 P1 3 NULL SELECT SifP 010 003 011
Prost upit nad jednom tabelom sa izvedenim rezultatom Podrazumeva se naredba upita SELECT nad jednom tabelom koja kao rezultat daje jedan red podataka koji su izvedeni iz svih redova tabele, koji zadovoljavaju zadati uslov SELECT lista takvog upita se sastoji iz jednog ili više izraza Zadavanje redosleda redova u rezultatu nema smisla (dobija se samo jedan red)
Prost upit nad jednom tabelom sa svodnim rezultatom Sintaksa za SELECT (prost upit nad jednom T sa svodnim rezultatom) SELECT G-Izrazi FROM ImeTabele [WHERE R-Predikat]; G-Izrazi: najčešće ih čine posebne SQL funkcije (svodne ili agregatne funkcije) Svodne funkcije: SUM (ImeKolone) Nalazi sumu svih ne-null vrednosti zadate kolone AVG (ImeKolone) Nalazi prosečnu vrednost svih ne- NULL vrednosti zadate kolone
Prost upit nad jednom tabelom sa izvedenim rezultatom MIN (ImeKolone) Nalazi minimalnu vrednost svih ne- NULL vrednosti zadate kolone MAX (ImeKolone) Nalazi maksimalnu vrednost svih ne-null vrednosti zadate kolone COUNT(*) Nalazi ukupan broj redova u tabeli COUNT([ALL DISTINCT] ListaKolona) Bez DISTINCT nalazi ukupan broj ne-null vrednosti zadate kombinacije kolona Sa DISTINCT nalazi ukupan broj različitih ne-null vrednosti zadate kombinacije kolona
Prost upit nad jednom tabelom sa izvedenim rezultatom Upit za prikaz ukupnog broja studenata (odgovara broju redova u tabeli Student) SELECT COUNT(*) FROM Student ; Student BrInd Ime Prezime Fakultet 1 Marko Marković PFB 2 Petar Petrović FIM 3 Aleksa Perić FIM 4 Marko Marić FTHM 5 Petar Lazić PFB 6 Jovan Marić PFB SELECT 6
Prost upit nad jednom tabelom sa izvedenim rezultatom Student Upit za prikaz broja fakulteta na koje su upisani studenati (odgovara broju različitih vrednosti kolone Fakultet u tabeli Student) SELECT COUNT(DISTINCT Fakultet) FROM Student ; BrInd Ime Prezime Fakultet 1 Marko Marković PFB 2 Petar Petrović FIM 3 Aleksa Perić FIM 4 Marko Marić FTHM 5 Petar Lazić PFB 6 Jovan Marić PFB SELECT 3
Prost upit nad jednom tabelom sa izvedenim rezultatom Upit za prikaz broja studenata koji su upisali FTHM SELECT COUNT(*) FROM Student WHERE Fakultet= FTHM ; Student BrInd Ime Prezime Fakultet 1 Marko Marković PFB 2 Petar Petrović FIM 3 Aleksa Perić FIM 4 Marko Marić FTHM 5 Petar Lazić PFB 6 Jovan Marić PFB SELECT 1
Prost upit nad jednom tabelom sa izvedenim rezultatom Upit za prikaz sume cena svih proizvoda: SELECT SUM(Cena) FROM Racun; Racun SifP NazivP Kolicina Cena 005 P1 1 1800,00 010 P2 6 300,00 020 P3 5 250,00 001 P3 2 1100,00 003 P3 4 600,00 011 P1 3 700,00 SELECT 1800+300+250+1100...
Prost upit nad jednom tabelom sa izvedenim rezultatom Upit za prikaz minimalne i maksimalne cene iz računa: SELECT MIN(Cena), MAX(Cena) FROM Racun; Racun SifP NazivP Kolicina Cena 005 P1 1 1800,00 010 P2 6 300,00 020 P3 5 250,00 001 P3 2 1100,00 003 P3 4 600,00 011 P1 3 700,00 SELECT 250 1800
Racun Prost upit nad jednom tabelom sa izvedenim rezultatom Upit za prikaz sume i proseka cena za proizvod P1: SELECT SUM(Cena), AVG(Cena) FROM Racun WHERE NazivP= P1 ; Primedba: rezultat AVG funkcije preuzima tip podataka od argumenta (tip kolone) SifP NazivP Kolicina Cena 005 P1 1 1800,00 010 P2 6 300,00 020 P3 5 250,00 001 P3 2 1100,00 SELECT 2500 1250 003 P3 4 600,00 011 P1 3 700,00
Prost upit nad jednom tabelom sa izvedenim rezultatom Rezultat bilo kog aritemitičkog izraza sa NULL je NULL Na primer: 10+NULL daje NULL Agregatne funkcije ignorišu NULL vrednosti (izuzev COUNT(*) Poređenje sa NULL daje unknown Npr: 10<NULL, NULL<>NULL, NULL=NULL
Prost upit nad jednom tabelom sa izvedenim rezultatom Istinosna logika sa unknown: OR: (unknown OR true) = true, (unknown OR false) = unknown (unknown OR unknown) = unknown AND: (true AND unknown) = unknown, (false AND unknown) = false, (unknown AND unknown) = unknown NOT: (NOT unknown) = unknown P is unknown je true ako je predikat P unknown Rezultat predikata komande WHERE se tretira kao false ako je unknown
Prost upit nad jednom tabelom sa izvedenim rezultatom Upit koji nema smisla: SELECT SifC, SUM(Dana) FROM Pozajmica; Ovde je SifC podatak na nivou jednog reda, a SUM(Dana) podatak sveden iz više redova Pozajmica (SifP,SifC,SifK,Dana)
Svodni upit nad jednom tabelom Prethodni primer: Želeo se prikaz sume trajanja pozajmica po šiframa članova. Dopuna: Prikazati samo podatke za članove za koje je npr. trajanje pozajmice >10 Postupak je sledeći: Od tabele Pozajmica formira se međurezultat sa kolonama (SifC i Dana) grupisane po SifC Formira se nova tabela sa jednom vrednošću za SifC i izračunate SUM (Dana) po SifC Prikazati redove koji zadovoljavaju traženi uslov
Svodni upit nad jednom tabelom SifP SifC SifK Dana 1 JJ0 004 5 2 PP0 007 2 3 JJ1 005 6 4 JJ0 008 7 5 PP0 002 4 6 JJ1 009 3 SifC Dana JJ0 5 JJ0 7 PP0 2 PP0 4 JJ1 6 JJ1 3 SifC Dana JJ0 12 PP0 6 JJ1 9 Rezultat JJ0 12 Uslov: SUM(Dana)>10 Potrebno je dodatno precizirati: Po kojim kolonama se vrši grupisanje, i koje svodne funkcije se traže unutar grupe Koji uslov se zadaje za uključenje svodnih redova u rezultat
Svodni upit nad jednom tabelom Sintaksa za SELECT za svodni upit nad jednom tabelom SELECT ListaKolona [ListaFunkcija] FROM ImeTabele [WHERE R-Predikat] GROUP BY ListaKolona HAVING G-Predikat [ORDER BY Element [DESC] {, Element [DESC]} ];
Svodni upit nad jednom tabelom WHERE, zadaje se uslov koji svaki red u tabeli ImeTabele mora da zadovolji GROUP BY, navodi se jedna ili više kolona po kojima se vrši grupisanje Kolone koje se navode ne moraju biti uz SELECT Kolene koje su uz SELECT moraju se naći uz GRUP BY HAVING, formira se uslov koji svaki red formiran svođenjem mora da zadovolji da bi bio uključen u rezultat Mogu da se jave kolone i funkcije koje nisu uz SELECT ORDER BY, mogu se kao Element navoditi samo kolone ili funkcije koje su navedene uz klauzulu SELECT
Svodni upit nad jednom tabelom SifP SifC SifK Dana 1 JJ0 004 5 2 PP0 007 2 3 JJ1 005 6 4 JJ0 008 7 5 PP0 002 4 6 JJ1 009 3 SifC Dana JJ0 5 JJ0 7 PP0 2 PP0 4 JJ1 6 JJ1 3 GROUP BY SifC, Dana SifC Dana JJ0 12 PP0 6 JJ1 9 HEAVING SUM(Dana)>10 Rezultat JJ0 12
Svodni upit nad jednom tabelom Primeri: Upit za prikaz šifara autora i broja naslova koje su napisali SELECT SifA, COUNT(*) AP0 1 FROM Je_Autor JN0 1 GROUP BY SifA ; DM0 2 ZP0 2 AP1 1 IT0 1
Primer Svodni upit nad jednom tabelom BrInd IdPred IdProf Ocena Sala Datum Vreme 100/2007 BP03 MV01 8 200/2007 BP03 MV01 7 100/2007 OOP02 RP00 6 150/2008 BP03 MV01 7 250/2008 OOP02 RP00 8 300/2006 RM03 MV01 7 100/2007 RM03 MV01 9 300/2006 RM03 MV01 8
Svodni upit nad jednom tabelom SELECT BrInd,AVG(Ocena) FROM Ispit GROUP BY BrInd; Ispit BrInd IdPred IdProf Ocena Sala Datum Vreme 100/2007 BP03 MV01 8 200/2007 BP03 MV01 7 100/2007 OOP02 RP00 6 150/2008 BP03 MV01 7 250/2008 OOP02 RP00 8 300/2006 RM03 MV01 7 100/2007 RM03 MV01 9 300/2006 RM03 MV01 8
Svodni upit nad jednom tabelom SELECT IdPred,AVG(Ocena) FROM Ispit GROUP BY IdPred; Ispit BrInd IdPred IdProf Ocena Sala Datum Vreme 100/2007 BP03 MV01 8 200/2007 BP03 MV01 7 100/2007 OOP02 RP00 6 150/2008 BP03 MV01 7 250/2008 OOP02 RP00 8 300/2006 RM03 MV01 7 100/2007 RM03 MV01 9 300/2006 RM03 MV01 8
Svodni upit nad jednom tabelom SELECT IdProf,AVG(Ocena) FROM Ispit GROUP BY IdProf; Ispit BrInd IdPred IdProf Ocena Sala Datum Vreme 100/2007 BP03 MV01 8 200/2007 BP03 MV01 7 100/2007 OOP02 RP00 6 150/2008 BP03 MV01 7 250/2008 OOP02 RP00 8 300/2006 RM03 MV01 7 100/2007 RM03 MV01 9 300/2006 RM03 MV01 8
Svodni upit nad jednom tabelom SELECT IdProf,IdPred,AVG(Ocena) FROM Ispit GROUP BY IdProf, IdPred; Ispit BrInd IdPred IdProf Ocena Sala Datum Vreme 100/2007 BP03 MV01 8 200/2007 BP03 MV01 7 100/2007 OOP02 RP00 6 150/2008 BP03 MV01 7 250/2008 OOP02 RP00 8 300/2006 RM03 MV01 7 100/2007 RM03 MV01 9 300/2006 RM03 MV01 8
Svodni upit nad jednom tabelom SELECT IdProf,IdPred,BrInd,AVG(Ocena) FROM Ispit GROUP BY IdProf, IdPred; Ispit BrInd IdPred IdProf Ocena Sala Datum Vreme 100/2007 BP03 MV01 8 200/2007 BP03 MV01 7 100/2007 OOP02 RP00 6 150/2008 BP03 MV01 7 250/2008 OOP02 RP00 8 300/2006 RM03 MV01 7 100/2007 RM03 MV01 9 300/2006 RM03 MV01 8 neispravno
Dekartov (Kartezijanov) proizvod Neka je zadata relacija r(r) i s(s), pri čemu je R S= Nakon Dekartovog proizvoda p=r s dobija se relacija p(p), gde je P=R S deg(p)=deg(r)+deg(s) card(p)=card(r) card(s)
Student BrInd Ime Prezime 100/2010 Marko Marković 200/2011 Petar Petrović Upis = Student Predmet Dekartov (Kartezijanov) proizvod Predmet Sifra SPRI01 SPRI02 BrInd Ime Prezime Sifra Naziv Naziv Informatika Matematika SPRI03 Engleski jezik 1 100/2010 Marko Marković SPRI01 Informatika 100/2010 Marko Marković SPRI02 Matematika 100/2010 Marko Marković SPRI03 Engleski jezik 1 200/2011 Petar Petrović SPRI01 Informatika 200/2011 Petar Petrović SPRI02 Matematika 200/2011 Petar Petrović SPRI03 Engleski jezik 1 SELECT * FROM Student, Predmet;
Upiti nad više tabela Ako se u SELECT naredbi navedu dve tabele obavezno se dešava Dekartov proizvod SELECT * FROM Student, Predmet; Drugačija sintaksa: SELECT * FROM Student CROSS JOIN Predmet; Dekartov proizvod nad 3 relacije (r1, r2, r3): SELECT * FROM r1 CROSS JOIN r2 CROSS JOIN r3;
θ spajanje Neka je zadata relacija r(r) i s(s), pri čemu je R S= Neka postoji atribut A iz R i atribut B iz S nad kojima je moguće izvršiti A θ B θ je operator poređenja; <,,=,>,
Linija Let Udaljenost AA251 1000 UX112 4000 CC222 11000 Avion Tip Dolet B747 15000 A320 7000 DC9 3000 θ spajanje Mogucnost = Linija >< Avion Dolet Udaljenost Let Udaljenost Tip Dolet AA251 1000 B747 15000 AA251 1000 A320 7000 AA251 1000 DC9 3000 UX112 4000 B747 15000 UX112 4000 A320 7000 CC222 11000 B747 15000
SELECT * FROM Linija, Avion WHERE Dolet Udaljenost; θ spajanje Drugačija sintaksa: SELECT * FROM Linija JOIN Avion ON Dolet Udaljenost; θ spajanje nad 3 relacije (r1, r2, r3): SELECT * FROM r1 JOIN r2 ON JoinCondition JOIN r3 ON Join Condition;
θ spajanje Kako pronaći linije i avione koji na tim linijama mogu leteti, ali samo za one linije na kojima je udaljenost veća od 3000km Dolet Udaljenost SELECT * FROM Linija, Avion WHERE Dolet Udaljenost AND Udaljenost 3000; Drugačija sintaksa: SELECT * FROM Linija JOIN Avion ON Dolet Udaljenost WHERE Udaljenost 3000;
Spoljašnje spajanje Zapis <105/2008, Nikola> neće se pojaviti u rezultatu zato što ne postoji ni jedan zapis koji zadovoljava uslov prirodnog spajanja sa tim zapisom Student BrInd Ime 100/2009 Marko 101/2009 Petar 105/2008 Nikola UpisaniPredmet BrInd Predmet 100/2009 Baze podataka 101/2009 Baze podataka 100/2009 Internet tehnologije Upis = Student >< UpisaniPredmet BrInd Ime Predmet 100/2009 Marko Baze podataka 100/2009 Marko Internet tehnologije 101/2009 Petar Baze podataka
Levo spoljašnje spajanje Svi zapisi relacije Student će se pojaviti u rezultatu Student BrInd Ime 100/2009 Marko 101/2009 Petar 105/2008 Nikola UpisaniPredmet BrIndSt Predmet 100/2009 Baze podataka 101/2009 Baze podataka 100/2009 Internet tehnologije Upis = Student *>< UpisaniPredmet BrInd = BrIndSt BrInd Ime BrIndSt Predmet 100/2009 Marko 100/2009 Baze podataka 100/2009 Marko 100/2009 Internet tehnologije 101/2009 Petar 101/2009 Baze podataka 105/2008 Nikola NULL NULL
Levo spoljašnje spajanje SELECT Student.*, UpisaniPredmet.*, FROM Student LEFT OUTER JOIN UpisaniPredmet ON BrInd = BrIndSt; Student UpisaniPredmet BrInd Ime BrIndSt Predmet 100/2009 Marko 101/2009 Petar 105/2008 Nikola 100/2009 Baze podataka 101/2009 Baze podataka 100/2009 Internet tehnologije Upis = Student >< UpisaniPredmet MatBr = MatBrSt BrInd Ime BrIndSt Predmet 100/2009 Marko 100/2009 Baze podataka 100/2009 Marko 100/2009 Internet tehnologije 101/2009 Petar 101/2009 Baze podataka 105/2008 Nikola NULL NULL
Desno spoljašnje spajanje Svi zapisi relacije ProfesorPredmet će se pojaviti u rezultatu StudentPredmet BrInd Ime Predmet 100/2009 Marko Baze podatka 101/2009 Petar Programiranje ProfesorPredmet IdProf PredmetProf MV Baze podataka DZ Programiranje AJ Baze podataka AJ Internet tehnologije MogucMentor = StudentPredmet >< *ProfesorPredmet Predmet = PredmetProf BrInd Ime Predmet IdProf PredmetProf 100/2009 Marko Baze podataka MV Baze podataka 100/2009 Marko Baze podataka AJ Baze podataka 101/2009 Petar Programiranje DZ Programiranje NULL NULL NULL AJ InternetTehnologije
SELECT StudentPredmet.*, ProfesorPredmet.*, Desno spoljašnje spajanje FROM StudentPredmet RIGHT OUTER JOIN PredmetProf StudentPredmet BrInd Ime Predmet ON Predmet = PredmetProf; 100/2009 Marko Baze podatka 101/2009 Petar Programiranje ProfesorPredmet IdProf MV DZ MogucMentor = StudentPredmet >< *ProfesorPredmet Predmet = PredmetProf AJ AJ PredmetProf BrInd Ime Predmet IdProf PredmetProf Baze podataka Programiranje Baze podataka 100/2009 Marko Baze podataka MV Baze podataka 100/2009 Marko Baze podataka AJ Baze podataka 101/2009 Petar Programiranje DZ Programiranje Internet tehnologije NULL NULL NULL AJ InternetTehnologije
Puno spoljašnje spajanje Svi zapisi iz obe relacije će se pojaviti u rezultatu StudentPredmet BrInd Ime Predmet 100/2009 Marko Baze podatka 101/2009 Petar Programiranje 105/2008 Nikola Zaštita IS ProfesorPredmet IdProf PredmetProf MV Baze podataka DZ Programiranje AJ Baze podataka AJ Internet tehnologije MogucMentor = StudentPredmet * >< *ProfesorPredmet Predmet = PredmetProf Ili SELECT * SELECT StudentPredmet.*, ProfesorPredmet.*, FROM StudentPredmet FULL OUTER JOIN PredmetProf ON Predmet = PredmetProf;
Puno spoljašnje spajanje Svi zapisi iz obe relacije će se pojaviti u rezultatu StudentPredmet BrInd Ime Predmet 100/2009 Marko Baze podatka 101/2009 Petar Programiranje 105/2008 Nikola Zaštita IS ProfesorPredmet IdProf PredmetProf MV Baze podataka DZ Programiranje AJ Baze podataka AJ Internet tehnologije MogucMentor = StudentPredmet * >< *ProfesorPredmet Predmet = PredmetProf BrInd Ime Predmet IdProf PredmetProf 100/2009 Marko Baze podataka MV Baze podataka 100/2009 Marko Baze podataka AJ Baze podataka 101/2009 Petar Programiranje DZ Programiranje NULL NULL NULL AJ InternetTehnologije 105/2008 Nikola Zaštita IS NULL NULL
Upiti nad više tabela Podrazumevaju spajanje tabela po nekom uslovu Iza FROM klauzule SELECT naredbe navodi se više tabela odvojenih zarezima Sintaksa: SELECT * {[ALL DISTINCT] R-Lista} FROM ImeTabele [NadimakTabele] {, } [WHERE R-Predikat] [ORDER BY ImeKolone [DESC] {, ImeKolone [DESC]} ];
Upiti nad više tabela Za kolone koje se nalaze u više tabele obavezno je navođenje ImeTabele.ImeKolone NadimakTabele.ImeKolone R-Predikat- navodi se uslov spajanja u formi uslova jednakosti vrednosti odgovarajućih kolona u tabelama Upit nad više tabela bez uslova spajanja daje kao rezultat Dekartov proizvod tih tabela
Upiti nad više tabela Primeri: Upit koji daje nazive naslova i nazive njihovih oblasti (spajaju se tabele Naslov i Oblast po uslovu jednakosti kolona SifO) SELECT N.Naziv, O.Naziv FROM Naslov N, Oblast O WHERE N.SifO=O.SifO ORDER BY N.Naziv ;
Upiti nad više tabela Upit koji daje šifre i nazive naslova knjiga koje članovi drže kod sebe (spajaju se tabele Drzi, Knjiga i Naslov po dva uslova jednakosti kolona koja se kombinuju sa AND) SELECT DISTINCT N.SifN, Naziv FROM Drzi D, Knjiga K, Naslov N WHERE D.SifK=K.SifK AND K.SifN=N.SifN;
Klauzule WHERE i HAVING Predikati to su relacioni izrazi, koji se mogu kombinovati Predikati: prosti i složeni Prost predikat: elementarni logički izraz izračunljiv nad svakim redom neke tabele Složen predikat: formira se od prostih, primenom logičkih operatora AND, OR i NOT Forme prostih predikata: Izraz1 {< <= = <> >= >} Izraz2 ispituje da li su vrednosti navedenih izraza u zadatom odnosu
Klauzule WHERE i HAVING Izraz [NOT] BETWEEN Izraz1 AND Izraz2 ispituje da li je (ili nije) vrednost izraza u zadatim granicama. Ekvivalentno bi bilo: [NOT] Izraz>=Izraz1 AND Izraz<=Izraz2 Kolona IS [NOT] NULL ispituje da li je (ili nije) vrednost kolone NULL ZnakovniIzraz [NOT] LIKE ZnakovnaMaska Znakovna vrednost tipa CHARACTER Dva specijalna znaka (džokeri): _ bilo koji znak (može ih biti više), % bilo koji broj znakova
Klauzule WHERE i HAVING Izraz [NOT] IN (Konstanta {, Konstanta}) ispituje da li je (ili nije) vrednost izraza jednaka nekoj od navedenih konstanti (isti tip) Izraz {< <= = <> >= >} ANY (Konstanta {, Konstanta}) ispituje da li je (ili nije) vrednost izraza u navedenom odnosu sa bar jednom konstantom Izraz {< <= = <> >= >} ALL (Konstanta {, Konstanta}) ispituje da li je (ili nije) vrednost izraza u navedenom odnosu sa svim navedenim konstantama (zahteva se isti tip)
Klauzule WHERE i HAVING Primeri upotrebe: Upiti za RBP BIBLIOTEKA sa dobijenim rezultatima Upit koji daje šifre članova i ukupna trajanja pozajmica od 5 do 10 dana: SELECT SifC,SUM(Dana) FROM Pozajmica GROUP BY SifC HAVING SUM(Dana) BETWEEN 5 AND 10; Upit koji daje nazive svih naslova u kojima se nalazi reč jezik SELECT Naziv FROM Naslov WHERE Naziv LIKE %jezik% ;
Klauzule WHERE i HAVING Upit koji daje šifre knjiga koje odgovaraju naslovima šifara RBP0 i RK00 SELECT SifK FROM Knjiga WHERE SifN IN ( RBP0, RK00 ); Prethodni upit, uz upotrebu ANY forme SELECT SifK FROM Knjiga WHERE SifN ANY ( RBP0, RK00 ); Upit koji daje šifre naslova za sve knjige osim za one sa šiframa 001, 002, 003 SELECT DISTINCT SifN FROM Knjiga WHERE SifK <> ALL ( 001, 002, 003 );
Upiti sa podupitima Podupit (ugnježdeni upit) je SELECT-FROM-WHERE izraz zadat unutar drugog izraza. Definicija podupita: SELECT naredba koja se nalazi u sklopu WHERE i HAVING klauzula Izvršavanje podupita prethodi vrednovanju predikata u datim klauzulama
Upiti sa podupitima Klasifikacija podupita po načinu izvršavanja: Nekorelisani podupit njegovo izvršavanje ne zavisi od izvršavanja spoljnog upita; Izvršava se samo jednom na početku. Korelisani podupit njegovo izvršavanje zavisi od spoljnog upita; Izvršava se za svaki red tabele koju obrađuje spoljni upit Posebna forma prostog predikata: [NOT] EXISTS (R-Upit) Utvrđuje se ishod podupita. Ako R-Upit kao rezultat daje bar jedan red, EXISTS daje vrednost istina. U suprotnom je nije istina.
Upiti sa podupitima Primer 1: Sastaviti upit koji daje podatke o pozajmicama natprosečnog trajanja. 1) Određuje se prosek trajanja svih pozajmica 2) Trajanje svake pozajmice poredimo sa dobijenom srednjom vrednosti SELECT * FROM Pozajmica WHERE Dana > (SELECT AVG (Dana) FROM Pozajmica); Radi se o nekorelisanom podupitu
Upiti sa podupitima Primer 2: Sastaviti upit koji daje imena članova čije je ukupno trajanje pozajmica veće od 10 dana. Za svakog člana iz tabele Clan treba prema njegovoj šifri utvrditi da li je njegovo ukupno trajanje pozajmica iznad 10 SELECT Ime FROM Clan C WHERE 10 < (SELECT SUM (Dana) FROM Pozajmica WHERE SifC=C.SifC); Podupit je korelisan i izvršava se za svakog člana Spoljni SELECT određuje kolonu koja se koristi u podupitu
Upiti sa podupitima Primer 3: Sastaviti upit koji daje imena članova koji drže knjige. Ovo je primer za korišćenje IN forme predikata. Šifre članova koji drže knjige daje nekorelisani podupit SELECT Ime FROM Clan WHERE SifC IN (SELECT SifC FROM Drzi);
Upiti sa podupitima Primer 4: Sastaviti upit koji daje podatke o pozajmicama koje su trajale duže od svih pozajmica člana šifre PP0. Rešenje primenom ALL konstrukcije SELECT * FROM Pozajmica WHERE Dana > ALL (SELECT Dana FROM Pozajmica WHERE SifC= PP0 );
Unija, razlika i presek upita Primena skupovnih operatora na skupove redova koje daju pojedini upiti Upiti koji se kombinuju moraju zadovoljavati uslov unijske kompatibilnosti Definicija klauzula: UNION [ALL] unija dva upita sa eliminacijom identičnih, ako se ne naglasi ALL INTERSECT presek dva upita, ostaju samo oni redovi koji se nalaze u rezultatima oba upita EXCEPT razlika dva upita, od redova upita ispred except klauzule ostaju samo oni koji se ne nalaze u rezultatu upita iza te klauzule (MINUS)
Unija, razlika i presek upita Primer 1: Sastaviti upit koji daje šifre knjiga koje su bile u prometu Članovi ih drže kod sebe ili su ranije pozajmljivane. SELECT SifK FROM Drzi UNION SELECT DISTINCT SifK FROM Pozajmica;
Unija, razlika i presek upita Primer 2: Sastaviti upit koji daje naslove knjiga koje su kod članova, a ranije nisu pozajmljivane SELECT DISTINCT Naziv FROM Naslov N, Knjiga K WHERE N.SifN=K.SifN AND SifK IN (SELECT SifK FROM Drzi EXCEPT SELECT DISTINCT SifK FROM Pozajmica);
Pitanja???