====== DBS - 3. individuální úkol - sudý týden ====== ~~NOTOC~~ {{ :dbs:ukol1_sudy_reseni.png?400|}} Datový model z [[09_ukol1_sudy|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