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:
- 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'
- 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)
- 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)
- 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
- 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
- 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