-- 1. izdvojiti nazive predmeta koje je polagao student
-- sa indeksom 22/2017

SELECT p.naziv
FROM predmet p JOIN ispit i
    ON p.id = i.idpredmeta
WHERE i.indeks = 20170022;

SELECT p.naziv
FROM  predmet p
WHERE EXISTS(SELECT * 
            FROM ispit i
            WHERE i.indeks = 20170022
                AND i.idpredmeta = p.id);

-- ovde je koriscen KORELISANI podupit


SELECT p.naziv
FROM  predmet p
WHERE p.id IN (SELECT i.idpredmeta 
               FROM ispit i
               WHERE i.indeks = 20170022);

-- ovde je koriscen NEKORELISANI podupit

SELECT p.naziv
FROM  predmet p
WHERE 20170022 IN (SELECT i.idpredmeta 
               FROM ispit i
               WHERE i.idpredmeta = p.id);

-- ANY i SOME
SELECT p.naziv
FROM predmet p
WHERE p.id = ANY(SELECT i.idpredmeta
                 FROM ispit i
                 WHERE i.indeks = 20170022);

SELECT p.naziv
FROM predmet p
WHERE p.id = SOME(SELECT i.idpredmeta
                 FROM ispit i
                 WHERE i.indeks = 20170022);

-- 2. izdvojiti informacije o svim predmetima osim o onima
--    koji nose najvise bodova

SELECT *
FROM predmet p
WHERE p.espb < ANY(SELECT espb FROM predmet);

SELECT *
FROM predmet p
WHERE EXISTS(SELECT *
             FROM predmet p1
             WHERE p1.espb > p.espb);

-- 3. izdvojiti informacije o predmetima sa maksimalnim brojem poena
SELECT *
FROM predmet p
WHERE p.espb >= ALL(SELECT espb
                    FROM predmet);

--4. izdvojiti informacije o  najskorije diplomiranim studentima
--zelimo da njegov datum diplomiranja bude >= od svih ostalih datuma diplomiranja
SELECT *
FROM dosije d
WHERE d.datdiplomiranja >= ALL(SELECT datdiplomiranja 
                               FROM dosije 
							   WHERE datdiplomiranja IS NOT NULL);

-- BITNO: bez IS NOT NULL nece raditi zato sto x >= NULL je netacno

--5.izdvojiti indekse, imena i prezimena studenata koji nisu polagali predmet ciji je identifikator 2166

SELECT d.indeks, d.ime, d.prezime
FROM dosije d
WHERE d.indeks NOT IN (SELECT i.indeks
						FROM ispit i
						WHERE i.idpredmeta = 2166);

SELECT d.indeks, d.ime, d.prezime
FROM dosije d
WHERE NOT EXISTS (SELECT *
                  FROM ispit i
                  WHERE i.idpredmeta = 2166
                    AND i.indeks = d.indeks);

-- 6. izdvojiti indekse, imena i prezimena studenata koji su 
--    polagali neki predmet koji nosi 5 espb
SELECT DISTINCT d.indeks, d.ime, d.prezime
FROM dosije d JOIN ispit i
	ON d.indeks = i.indeks
	JOIN predmet p
		ON i.idpredmeta = p.id
WHERE p.espb = 5;

SELECT d.indeks, d.ime, d.prezime
FROM dosije d
WHERE d.indeks IN (SELECT i.indeks
                   FROM ispit i
				   WHERE i.idpredmeta IN (SELECT p.id
				                          FROM predmet p
										  WHERE p.espb = 5));

SELECT d.indeks, d.ime, d.prezime
FROM dosije d
WHERE EXISTS(SELECT *
             FROM ispit i JOIN predmet p
                ON i.idpredmeta = p.id
             WHERE i.indeks = d.indeks AND p.espb = 5);

--7. izdvojiti naziv predmeta koji su organizovani u svim godinama koje postoje u bazi podataka

SELECT p.naziv
FROM predmet p
WHERE NOT EXISTS(
	SELECT * FROM skolskagodina sg
	WHERE NOT EXISTS(SELECT * 
	                FROM kurs k
		            WHERE k.idpredmeta = p.id
		            AND sg.skgodina = k.skgodina
					));

--8. prikazi brojeve indeksa studenata koji su polozili bar one predmete 
--   koje i student sa brojem indeksa 20150168

SELECT d.indeks
FROM dosije d
WHERE NOT EXISTS(SELECT *
                 FROM ispit i1 
                 WHERE i1.indeks = 20150168 AND
		            i1.status = 'o' AND  i1.ocena > 5
		            AND NOT EXISTS (SELECT *
		                            FROM ispit i2 
		                            WHERE i2.indeks = d.indeks AND
		                                AND i2.idpredmeta = i1.idpredmeta
		                                  i2.status = 'o' AND  i2.ocena > 5));

SELECT d.indeks
FROM dosije d
WHERE NOT EXISTS(SELECT * FROM predmet p
                 WHERE EXISTS (SELECT * FROM ispit i
				               WHERE i.indeks = 20150168
							        AND i.ocena > 5 AND i.status = 'o'
									AND i.idpredmeta = p.id)
					AND NOT EXISTS (SELECT * FROM ispit i
					                WHERE i.indeks = d.indeks
									AND i.ocena > 5 AND i.status = 'o'
									AND i.idpredmeta = p.id))

--9. izdvojiti podatke o predmetima koje su polagali svi studenti iz Berana koji studiraju smer
--   sa oznakom I4

SELECT *
FROM predmet p
WHERE NOT EXISTS(SELECT *
                FROM dosije d JOIN studijskiprogram sp
				    ON d.idprograma = sp.id
			    WHERE d.mestorodjenja = 'Berane' AND sp.oznaka = 'I4'
				    AND NOT EXISTS(SELECT *
					               FROM ispit i
								   WHERE i.indeks = d.indeks
								        AND i.idpredmeta = p.id));

--10. za studente koji su polagali ispit u roku odrzanom 2018/2019 
--    izdvoji podatke o polozenim ispitima
--    izdvojiti indeks, ime, prezime, naziv ispita, oznaka rok, i skgodina

SELECT d.indeks, d.ime, d.prezime, p.naziv, i.oznakaroka, i.skgodina
FROM dosije d JOIN ispit i
	ON d.indeks = i.indeks
	JOIN predmet p
	ON i.idpredmeta = p.id
WHERE i.ocena > 5 AND i.status = 'o'
	AND EXISTS(SELECT * FROM ispit i1
	           WHERE i1.indeks = d.indeks
			        AND i1.skgodina = 2018)
ORDER BY d.indeks;

