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