====== DBS - 2. 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[IDP]\\
Oprava[IDP] ⊆ Placek[IDP]\\
Pozor na názvy atributů při přirozeném spojení :!:.
===== Zadání + řešení =====
Vyjádřete pomocí relační algebry následující dotazy.
- Vypište seznam plácků (Název), které spravuje Jan Novák.
* { Hrac(jmeno='Jan Novak') * Placek }[Nazev]
- Vypište seznam všech hráčů (Jména), kteří spravují plácek, který byl někdy opravován.
* { Oprava * Placek * Hrac } [Jmeno]
- Vypište seznam exhibic (Datum a peníze), kterých se zúčastnil Jan Novák (na pozicích vyzvaného i vyzývajícího :!:).
* { Hrac(jmeno='Jan Novak') [Hrac.IDH = Zapas.Vyzyvajici OR Hrac.IDH = Zapas.Vyzvany] Zapas * Exhibice } [Datum, penize]
* Pokud připustíme, že lze do join podmínky napsat libovolný boolovský výraz. Alternativně lze použít sjednocení (union) dvou dotazů (jeden na vyzývajícího, druhý na vyzvaného).
- Vypište seznam plácků (Název), které byly opravovány v roce 2008 (tj. mezi 1.1. a 31.12., datum zapište například ve formátu YYYY-MM-DD, datum lze porovnávat pomocí operátorů >, < apod.)
* { Oprava(Datum ≤ 2008-12-31 AND Datum ≥ 2008-01-01) * Placek } [Nazev]
- Seznam hráčů (Jména, datum narození), kteří ještě nehráli exhibici.
* { Hrac \ { Exhibice *> Zapas [Hrac.IDH = Zapas.Vyzyvajici OR Hrac.IDH = Zapas.Vyzvany> Hrac } } [Jmeno,Narozen]
- Vypište detailní seznam zápasů, který bude obsahovat Datum, Jména obou hráčů a název plácku.\\ **Příklad výstupu:**\\ (2009-10-10, Jan Novák, Franta Skočdopole, U řeky),\\ (2009-10-09, Franta Skočdopole, Radim Skuhra, Nad náměstím)
*
H1:= Hrac
H2:= Hrac
Vysledek := { Placek * Zapas [Zapas.Vyzvany = H1.IDH] H1 [Zapas.Vyzyvajici = H2.IDH] H2 } [Datum, H1.Jmeno, H2.Jmeno, Placek.Nazev]
- Vypište seznam hráčů, kteří hráli na pozici **vyzývajícího** na všech hřištích, která existují (tj. neexistuje hřiště, na kterém by daný hráč nehrál).
* { Zapas [Vyzyvajici->IDH, IDP] ÷ Placek[IDP] } *> Hrac
* Přesný opis operace dělení pomocí dvojí negace
Universum := Zapas[Vyzyvajici->IDH] X Placek [IDP]
Neuskutecnene := Universum \ Zapas [Vyzyvajici->IDH, IDP]
Splnili := Zapas[Vyzyvajici->IDP] \ Neuskutecnene [IDH]
Vysledek := Splnili *> Hrac
* Alternativně opis (ne úplně podle definice operace děleno, ale srozumitelnější) pomocí dvojí negace.
Universum := Hrac[IDH] X Placek[IDP]
Neuskutecnene := Universum \ Zapas [Vyzyvajici->IDH, IDP]
Splnili:= Hrac[IDH] \ Neuskutecnene [IDH]
Vysledek:= Splnili *> Hrac
* Všimněte si, že se oba opisy liší tím, že v prvním případě neuvažujeme všechny hráče, ale jen ty, kteří opravdu něco sehráli.