====== 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