-- Vrnite tabelo imen in priimkov vseh oseb, ki jim je ime Matija
SELECT ime,
       priimek
  FROM osebe
 WHERE ime = 'Matija';

-- Vrnite tabelo imen in priimkov vseh oseb, urejeno po priimku
SELECT ime,
       priimek
  FROM osebe
 ORDER BY priimek;

-- Vrnite imena vseh predmetov na praktični matematiki (smer: 1PrMa)
SELECT ime
  FROM predmeti
 WHERE smer = '1PrMa';

-- Vrnite vse podatke o skupinah z manj kot eno uro
SELECT *
  FROM skupine
 WHERE ure < 1;

-- Vrnite število vseh predmetov na posamezni smeri
SELECT smer,
       count( * ) 
  FROM predmeti
 GROUP BY smer;

-- Vrnite imena tistih predmetov, ki se pojavljajo na več smereh
SELECT ime
  FROM predmeti
 GROUP BY ime
HAVING count( * ) > 1;

-- Vrnite imena in vse pripadajoče smeri tistih predmetov, ki se pojavljajo na več smereh
SELECT ime, smer
  FROM predmeti
 WHERE ime IN (
           SELECT ime
             FROM predmeti
            GROUP BY ime
           HAVING count( * ) > 1
       );

-- Vrnite skupno število ur vsake osebe
SELECT ime,
       priimek,
       sum(ure) AS obremenitev
  FROM osebe
       INNER JOIN
       skupine ON osebe.id = skupine.učitelj
 GROUP BY osebe.id;

-- Vrnite imena in priimke vseh predavateljev,
-- torej tistih, ki imajo kakšno skupino tipa P
SELECT DISTINCT ime,
                priimek
  FROM osebe
       INNER JOIN
       skupine ON osebe.id = skupine.učitelj
 WHERE skupine.tip = 'P';

-- Vrnite imena in priimke vseh predavateljev,
-- ki izvajajo tako predavanja (tip P) kot vaje (tipa V ali L)
SELECT DISTINCT ime,
                priimek
  FROM osebe
       INNER JOIN
       skupine AS s1 ON osebe.id = s1.učitelj
       INNER JOIN
       skupine AS s2 ON osebe.id = s2.učitelj
 WHERE s1.tip = 'P'
   AND (s2.tip = 'V' OR s2.tip = 'L');

-- Vrnite imena in smeri vseh predmetov, ki imajo kakšen seminar
SELECT predmeti.ime,
       predmeti.smer
  FROM predmeti
       INNER JOIN
       dodelitve ON predmeti.id = dodelitve.predmet
       INNER JOIN
       skupine ON dodelitve.skupina = skupine.id
 WHERE skupine.tip = 'S';

-- Vsem predmetom na smeri 2PeMa spremenite smer na PeMa
UPDATE predmeti
   SET smer = 'PeMa'
 WHERE smer = '2PeMa';

-- Izbrišite vse predmete, ki niso dodeljeni nobeni skupini
DELETE FROM predmeti
 WHERE id NOT IN (
           SELECT predmet FROM dodelitve
       );

-- Za vsak predmet, ki se pojavi tako na prvi kot drugi stopnji
-- (smer se začne z 1 oz. 2), dodajte nov predmet z istim imenom
-- in smerjo 0Mate (stolpca id ne nastavljajte, ker se bo samodejno
-- določil)
INSERT INTO predmeti (ime, smer)
SELECT p1.ime, '0Mate'
  FROM predmeti AS p1
       INNER JOIN
       predmeti AS p2 ON p1.ime = p2.ime
 WHERE p1.smer LIKE '1%' AND p2.smer LIKE '2%';

-- Za vsako smer izpišite število različnih oseb, ki na njej poučujejo
SELECT smer, COUNT( DISTINCT učitelj )
  FROM predmeti
       JOIN
       dodelitve ON predmet = predmeti.id
       JOIN
       skupine ON skupina = skupine.id
 GROUP BY smer;

-- Vrnite pare ID-jev tistih oseb, ki sodelujejo pri vsaj dveh
-- predmetih (ne glede na tip skupine), pri čemer naj bo prvi ID
-- v paru manjši od drugega, pari pa naj se ne ponavljajo
SELECT s1.učitelj, s2.učitelj
  FROM skupine AS s1
       JOIN
       dodelitve AS d1 ON s1.id = d1.skupina
       JOIN
       dodelitve AS d2 USING (predmet)
       JOIN
       skupine AS s2 ON s2.id = d2.skupina
 WHERE s1.učitelj < s2.učitelj
 GROUP BY s1.učitelj, s2.učitelj
HAVING count( DISTINCT predmet ) >= 2;

-- Za vsako osebo (izpišite jo z ID-jem, imenom in priimkom) vrnite
-- skupno število ur vaj (tako avditornih kot laboratorijskih),
-- pri čemer naj bo to enako 0, če oseba ne izvaja nobenih vaj
SELECT osebe.id, ime, priimek,
       coalesce(sum(ure), 0) AS ure
  FROM osebe
       LEFT JOIN
       skupine ON osebe.id = učitelj AND tip IN ('V', 'L')
GROUP BY osebe.id, ime, priimek;

-- Vrnite ID-je, imena in smeri predmetov, za katere se izvaja
-- seminar, ne pa tudi avditorne ali laboratorijske vaje
SELECT id, ime, smer
  FROM predmeti
 WHERE id IN (
          SELECT predmet
            FROM dodelitve
                 JOIN
                 skupine ON skupina = skupine.id
           WHERE tip = 'S'
       )
       AND
       id NOT IN (
          SELECT DISTINCT predmet
            FROM dodelitve
                 JOIN
                 skupine ON skupina = skupine.id
           WHERE tip IN ('V', 'L')
       );
