-- 1. napraviti tabelu polozeni predmeti u kojoj ce se nalaziti -- podaci o polozneim predmetima studenata -- tabela koja ima iste kolone kao tabela ispit -- dodamo strani kljuc na tabelu dosije sa opcijom kaskadnog brisanja -- dodati ogranicenje da ocena mora biti izmedju 6 i 10 -- CREATE TABLE polozeni_predmeti( skgodina SMALLINT NOT NULL, oznakaroka VARCHAR(20) NOT NULL, indeks INTEGER NOT NULL, idpredmeta INTEGER NOT NULL, status CHAR NOT NULL, datpolaganja DATE, poeni SMALLINT, ocena SMALLINT, PRIMARY KEY (skgodina, oznakaroka, indeks, idpredmeta), FOREIGN KEY fk_PolozeniPredmeti_Dosije(indeks) REFERENCES dosije ON DELETE CASCADE, CONSTRAINT chk_pp_vrednost_ocene check (ocena BETWEEN 6 AND 10) ); -- 2. izbirsati tabelu polozeni_predmeti iz nase baze DROP TABLE polozeni_predmeti; -- ubacivanje podataka u tabele -- 3. Dodati ispitni rok oktobar 3 2015. INSERT INTO ispitnirok VALUES (2015, 'okt3', 'Oktobar 3 2015', '2016-10-08', '2016-10-09'); SELECT * FROM ispitnirok WHERE skgodina = 2015; -- 4. Dodati studenta ivana markovica sa brojem indeksa 20140058 rodjenog u Beogradu.. INSERT INTO dosije(ime, prezime, indeks, mestorodjenja, idprograma, idstatusa, datupisa) VALUES ('Ivan', 'Markovic', 20140058, 'Beograd', 101, 1, '2014-06-10'); -- 5. dodati u tabelu ispit polaganje ispita analiza 3 u roku okt3 2015 sa ocenom 5 -- VISE O OVOME KAD(AKO) BUDEMO RADILI TRIGGERE INSERT INTO upisankurs(indeks, idpredmeta, skgodina, semestar) SELECT DISTINCT 20140058, p.id, 2015, uk.semestar FROM predmet p JOIN upisankurs uk ON p.id = uk.idpredmeta WHERE p.naziv = 'Analiza 3'; INSERT INTO ispit(skgodina, oznakaroka, indeks, idpredmeta, ocena, status) SELECT DISTINCT 2015, 'okt3', 20140058, p.id, 5, 'o' FROM predmet p WHERE p.naziv = 'Analiza 3'; -- 6. za sve ispite iz programiranja 1 sa ocenom 5 promeniti ocenu na 6 SELECT DISTINCT ocena FROM ispit WHERE idpredmeta IN (SELECT id FROM predmet WHERE naziv = 'Programiranje 1'); UPDATE ispit SET ocena = 6 WHERE ocena = 5 AND status = 'o' AND idpredmeta IN (SELECT id FROM predmet WHERE naziv = 'Diskretne strukture 1'); -- 1. na 'bolji nacin' CREATE TABLE polozeni_predmeti LIKE ispit; ALTER TABLE polozeni_predmeti ADD PRIMARY KEY (skgodina, oznakaroka, indeks, idpredmeta) ADD FOREIGN KEY fk_PolozeniPredmeti_Dosije(indeks) REFERENCES dosije ON DELETE CASCADE ADD CONSTRAINT chk_pp_vrednost_ocene check (ocena BETWEEN 6 AND 10); DROP TABLE polozeni_predmeti; CREATE table polozeni_predmeti AS ( SELECT * FROM ispit ) DEFINITION ONLY; ALTER TABLE polozeni_predmeti ADD PRIMARY KEY (skgodina, oznakaroka, indeks, idpredmeta) ADD FOREIGN KEY fk_PolozeniPredmeti_Dosije(indeks) REFERENCES dosije ON DELETE CASCADE ADD CONSTRAINT chk_pp_vrednost_ocene check (ocena BETWEEN 6 AND 10); INSERT INTO polozeni_predmeti SELECT * FROM ispit WHERE ocena > 5 AND status = 'o'; SELECT * FROM polozeni_predmeti; ALTER TABLE polozeni_predmeti ADD CONSTRAINT chk_pp_broj_bodova CHECK (poeni > 51); ALTER TABLE polozeni_predmeti DROP datpolaganja; SELECT * FROM polozeni_predmeti ORDER BY 1, 2, 3, 4; -- napraviti tabelu student_ispiti koja ima sledece kolone: -- indeks - indeks studenta -- ime - ime studenta -- prezime - prezime studenta -- polozeni_ispiti - proj polozenih ispita -- prosek - prosek studenta -- strani kljuc na tabelu dosije -- primarni kljuc je indeks CREATE TABLE student_ispiti( indeks INTEGER NOT NULL PRIMARY KEY, ime VARCHAR(50) NOT NULL, prezime VARCHAR(50) NOT NULL, polozeni_ispiti SMALLINT, prosek DOUBLE, FOREIGN KEY fk_si_dosije (indeks) REFERENCES dosije ); -- dodacemo kolonu broj_ispita predstavlja broj izlazaka na ispit -- dodamo ogranicenje da je broj_ispita >= polozeni_ispiti ALTER TABLE student_ispiti ADD broj_ispita SMALLINT ADD constraint chk_br_ispita_polozenih CHECK (broj_ispita >= polozeni_ispiti); -- ubacimo info u tabelu: -- dodati podatke za SVAKOG studenta iz tabele dosije -- ukoliko nema polozenih ispita ili nema izlazaka na ispite -- hocemo da te kolone budu NULL INSERT INTO student_ispiti(indeks, ime, prezime, polozeni_ispiti, broj_ispita, prosek) SELECT d.indeks, d.ime, d.prezime, NULLIF(SUM( CASE WHEN ocena > 5 AND status = 'o' THEN 1 ELSE 0 END ), 0) , NULLIF(COUNT(i.indeks), 0) , AVG( CASE WHEN ocena > 5 AND status = 'o' THEN ocena * 1.0 ELSE NULL END ) FROM dosije d LEFT JOIN ispit i ON d.indeks = i.indeks GROUP BY d.indeks, d.ime, d.prezime;