DBS - 3. individuální úkol - sudý týden

Datový model z 1. úkolu lze převést do relačního modelu následovně.

Hrac (IDH, Jmeno, Narozen)
Zapas (IDZ, Datum_konani, Vyzyvajici, Vyzvany, IDP)
Ligovy (IDZ, Skore1, Skore2)
Exhibice (IDZ, Penize)
Placek (IDP, Nazev, IDH)
Oprava (IDP, Datum, Popis)

IO:
Zapas[Vyzyvajici] ⊆ Hrac[IDH]
Zapas[Vyzvany] ⊆ Hrac[IDH]
Zapas[IDP] ⊆ Placek[IDP]
Ligovy[IDZ] ⊆ Zapas[IDZ]
Exhibice[IDZ] ⊆ Zapas[IDZ]
Placek[IDH] ⊆ Hrac[IDH]
Oprava[IDP] ⊆ Placek[IDP]

Pozor na názvy atributů při přirozeném spojení :!:.

Zadání

Navrhněte dotazy v SQL. Rozdhodně nechci, abyste všechny dotazy odladili na nějakých datech, překlepy mě nezajímají, jde o myšlenky:

  1. Vypište seznam zápasů (datum a jméno plácku), kde hrál Novák na pozici vyzývajícího
    select z.datum_konani, p.nazev
                 from zapas z 
                 join hrac h on (h.idh = z.vyzyvajici)
                 join placek p using (idp)
               where hrac.jmeno = 'Novak' 
  2. Vypiště seznam všech zápasů. V každém řádku bude Datum, jméno vyzývajícího a jméno vyzývaného.
    select z.datum_konani, h1.jmeno, h2.jmeno
        from zapas z
        join hrac h1 on (h1.idh = z.vyzyvajici)
        join hrac h2 on (h2.idh = z.vyzyvany)
  3. Vypište plácky, na kterých se ještě nehrála exhibice.
    select p.idp, p.nazev from placek p
      where p.idp not in (select idp from zapas natural join exhibice)
  4. Vypište plácky na kterých se hrály pouze ligové zápasy (pozor, od přechozího příkladu se to liší).
    select p.idp, p.nazev from placek p natural join zapas natural join ligovy
      minus  -- nebo except
    select p.idp, p.nazev from placek p natural join zapas natural join exhibice
  5. Vypište seznam plácků a u každého počet zápasů, které se na něm odehrály (pozor, chceme i plácky, na kterých se ještě nic nehrálo). V každém řádku tedy bude jméno plácku a počet zápasů.
    select p.idp, p.nazev, count(z.idz) as pocet_zapasu 
    from placek p left join zapas z on (p.idp = z.idp) group by p.idp, p.nazev
  6. Vypište hráče (ID, jméno), kteří se zúčastnili více jak 10 zápasů v pozici vyzývajícího.
    select h.idh, h.jmeno
       from hrac h
       left join zapas z on (h.idh = z.vyzyvajici)
     group by h.idh, h.jmeno
     having count(z.idz) > 10