Uvod u relacione baze podataka 25. novembar 2011. godine 7. čas SQL skalarne funkcije, operatori ANY (SOME) i ALL 1. Za svakog studenta izdvojiti ime i prezime i broj različitih ispita koje je pao (ako ne postoji nijedan - izdvojiti 0). select ime, prezime, count(distinct id_predmeta) br_padova i join dosije d on i.indeks = d.indeks where ocena = 5 group by d.indeks, ime, prezime union select ime, prezime, 0 br_padova from dosije d where not exists ( where indeks = d.indeks and ocena = 5); with padali as ( select indeks, id_predmeta where ocena=5) select ime, prezime,count(distinct id_predmeta) br_padova from padali i right outer join dosije d on i.indeks = d.indeks group by d.indeks, ime, prezime; 2. Izdvojiti broj studenata koji su položili neke predmete u bar 2 različita roka. with vise as(select distinct indeks, oznaka_roka,godina_roka i order by indeks, oznaka_roka), vise_od_tri as( select indeks, count(*) br from vise group by indeks having count(*)>=2) select count(*) br_studenata from vise_od_tri; with vise_od_tri as (select indeks, count(distinct concat(oznaka_roka,char(godina_roka))) n
group by indeks having count(*) >=2) select count(*) br from vise_od_tri; 3. Za sve studente izdvojiti broj položenih predmeta od 6 kredita i broj položenih predmeta od 8 kredita (sve podatke obraditi u jednom prolazu kroz tabelu ispit). select indeks, sum (case when krediti = 6 then 1 else 0 end) od_sest, sum (case when krediti = 8 then 1 else 0 end) od_osam i join predmet p on i.id_predmeta = p.id_predmeta group by indeks; 4. Izdvojiti parove mesta rođenja studenata takvih da ne postoji predmet koji je polagao drugi student, a koji nosi isti broj kredita kao neki koji je polagao prvi student. select distinct d1.mesto_rodjenja, d2.mesto_rodjenja from dosije d1, dosije d2 where not exists( i where i.indeks = d2.indeks and exists ( p where p.id_predmeta = i.id_predmeta and exists ( i2 where i2.indeks = d2.indeks and exists ( p2 where p2.id_predmeta = i2.id_predmeta and p2.krediti = p1.krediti)))); select d1.mesto_rodjenja, d2.mesto_rodjenja from dosije d1, dosije d2 except select d1.mesto_rodjenja, d2.mesto_rodjenja from dosije d1 join ispit i1 on d1.indeks = i1.indeks join predmet p1 on i1.id_predmeta = p1.id_predmeta join predmet p2 on p1.krediti = p2.krediti join ispit i2 on i2.id_predmeta = p2.id_predmeta join dosije d2 on d2.indeks = i2.indeks; 5. Izdvojiti informacije o svim predmetima osim o onima koji nose najviše kredita. where krediti < any(select krediti ); where krediti < (select max(krediti) );
6. Izdvojiti informacije o najstarijim studentima na fakultetu. from dosije where god_rodjenja <= all(select god_rodjenja from dosije); from dosije where god_rodjenja = (select min(god_rodjenja) from dosije); 7. Ako je predmetima potrebno uvećati broj kredita za 35%, a. prikazati koliko će svaki predmet imati kredita nakon uvećanja. Uvećani broj kredita prikazati sa jednom decimalnom cifrom. select sifra, naziv, decimal(krediti*1.35, 4, 1) as uvecanje ; Funkcija decimal(x,y,z), prikazuje broj x sa 4 najviše 4 značajne cifre od kojih je njih z iza decimalne tačke. b. prikazati koliko će kredita imati predmeti koji nakon uvećanja imaju više od 8 kredita. Uvećani broj kredita zaokružiti na veću celobrojnu vrednost. select sifra, naziv, ceil(krediti*1.35) as uvecanja where ceil(krediti*1.35)>8; Funkcija ceil(x) računa gornji ceo deo broja x, tj. prvi ceo broj veći od x. Analogno, postoji funkcija floor(x) koja računa donji ceo deo broja x. 8. Izdvojiti indeks, ime, prezime, mesto rođenja, broj slova u imenu i prezimenu i inicijale za svakog studenata. Ime i prezime napisati u jednoj koloni, a za studente rođene u Beogradu kao mesto rođenja ispisati Bg. select indeks, ime ' ' prezime "ime i prezime", length(ime)+length(prezime) "broj slova", substr(ime,1,1) substr(prezime,1,1) inicijali, replace(mesto_rodjenja, 'Beograd', 'Bg') "mesto rodjenja" Funkcija length(s) vraća dužinu niske, substr(s,x,y) vraća podnisku niske s počev od x-tog do y-tog karaktera(ukoliko se y izostavi izdvajaju se svi karakteriod x-tog do kraja niske s). Funkcija replace(s,x,y) u niski s zamenjuje svako pojavljivanje niske x, niskom y. Funkcija concat(x, y) nadovezuje nisku z na kraj niske x. select indeks, ime ' ' prezime "ime i prezime", length(ime)+length(prezime) "broj slova", concat(substr(ime,1,1),substr(prezime,1,1)) as inicijali, replace(mesto_rodjenja, 'Beograd', 'Bg') "mesto rodjenja" 9. Ispisati trenutno vreme, trenutni datum i korisnika. values (current_time, current_date, user);
ili select distinct current_time, current_date, user ; ili select current_time, current_date, user from sysibm.sysdummy1; 10. Izračunati koji je dan u nedelji (njegovo ime) bio 18.11.2010. ili values dayname(date( 2010-11-25 )); values dayname('2010-11-25'); 11. Za današnji datum izračunati: koji je dan u godini u kojoj je nedelji u godini dan u nedelji ime dana ime meseca values (dayofyear(current_date), week(current_date), dayofweek(current_date), dayname(current_date), monthname(current_date)); 12. Izdvojiti sate, minute i sekunde iz trenutnog vremena. values(hour(current_time),minute(current_time),second(current_time)); 13. Izračunati koji će datum biti za 12 godina, 5 meseci i 25 dana. values current date + 12 years + 5 months + 25 days 14. Izdvojiti ispite koji su održani posle 1. aprila 2011. godine. where datum_ispita>date('2011-04-01'); where datum_ispita>'2011-04-01'; 15. Pronaći sve ispite održane u poslednje 2 godine. where year(current_date-datum_ispita) < 2; 16. Za sve ispite koji su održani u poslednjih 5 godina izračunati koliko je godina, meseci i dana prošlo od njihovog održavanja. Izdvojiti indeks studenta, naziv predmeta, ocenu, broj godina, broj meseci i broj dana. select indeks, naziv, ocena, year(current_date-datum_ispita)godina, month(current_date-datum_ispita) meseci, day(current_date-datum_ispita) dana i join predmet p on i.id_predmeta=p.id_predmeta where year(current_date-datum_ispita)<=5;
17. Za svakog studenta, koji je polagao bar jedan ispit, izdvojiti indeks i broj dana od poslednjeg polaganja ispita. select indeks, days(current_date)-days(max(datum_ispita)) broj_dana group by indeks; Funkcija days(datum) vraća broj dana proteklih od 1.1.1.god do datuma datum. 18. Izdvojiti indeks, ime, prezime i mesto rođenja za svakog studenta. Ako je mesto rođenja nepoznato, umesto NULL vrednosti ispisati Nepoznato. select indeks, ime, prezime, coalesce(mesto_rodjenja, 'Nepoznato') as "mesto rodjenja" Funkcija coalesce(x, y) vraća x ukoliko x nije NULL, u suprotnom vraća y.