4. Relační algebra Databáze použité v příkladech FIRMA ZAMĚSTNANEC (Číslo, Příjmení, Jméno, Pohlaví, Plat, Oddělení, Nadřízený) ODDĚLENÍ (Číslo, Název, Místo, Vedoucí) PROJEKT (Číslo, Název, Oddělení) PRÁCE (Číslo, Zaměstnanec, Projekt, Hodiny) DÍTĚ (Číslo, Rodič, Jméno) KNIHOVNA KNIHA (CisloKnihy, Název, Autor, Ţánr, Rok) ŢÁNR (Id, Název) VÝTISK (EvidCislo, CisloKnihy, Nakladatel, Pořízeno, Cena, Jazyk) AUTOR (Id, Příjmení, Jméno, Stát) ČTENÁŘ (Id, Příjmení, Jméno, Město, Ulice, PSČ, DatumOd, DatumDo) VÝPŮJČKA (Id, Výtisk, Čtenář, Půjčeno, Vráceno ) REZERVACE (Id, CisloKnihy, Čtenář, Datum) NAKLADATELSTVÍ (Id, Název, Město, Stát) FILMY nenormalizovaná DB filmů!!! KINO (NázevK, Adresa) PROGRAM (NázevK, JménoF, Datum) FILM (JménoF, Herec, Rok) BANKA nenormalizovaná DB!!! KLIENT (Číslo, Jméno, Osoba, Adresa) POHYB (Druh, Konto, Identifikace, Datum, Měna, Částka) KONTO (Číslo, Majitel, Datum, Zůstatek, Měna) Operace kartézský součin ( součin ) sjednocení průnik rozdíl projekce selekce ( restrikce ) spojení x x předpokládá kompatibilní operandy tj. stejný řád relací a rovnost domén, které si odpovídají specificky databázové operace Selekce selekční podmínka(jméno relace) jméno relace(selekční podmínka)
Příklad 4.1 : Relace ZAMĚSTNANEC (Osobní_číslo, Jméno, Příjmení, Adresa, Oddělení, Plat, Nadřízený) Vybereme podmnoţinu n-tic z relace ZAMĚSTNANEC, kteří pracují v oddělení 4 Oddělení = 4(ZAMĚSTNANEC) Příklad 4.2 : Relace ZAMĚSTNANEC (Osobní_číslo, Jméno, Příjmení, Oddělení, Plat, Nadřízený) Vybereme podmnoţinu n-tic z relace ZAMĚSTNANEC, kteří mají plat menší neţ 15 000 Plat 15000(ZAMĚSTNANEC) Relace, která je výsledkem selekce, má tytéţ atributy jako relace původní. Podmínka pouţitá v selekci můţe být tvaru Jméno atributu operátor porovnání Jméno atributu Jméno atributu operátor porovnání Konstanta Operátor porovnání je z mnoţiny,,,,,, konstanta je z domény daného atributu. Podmínky mohou být libovolně spojovány pomocí AND, OR, NOT Příklad 4.3 : (Plat 10000 AND Oddělení =1) OR ( Plat 20000 AND Oddělení=3) (ZAMĚSTNANEC) Selekce je komutativní tj. podm1( podm2 (Relace)) = podm2( podm1 (Relace)) podm1( podm2... ( podmn (Relace)..))= podm1 AND podm2 AND podmn(relace) Poznámka: Pořadí podmínek v konjunkci by mělo být stanoveno smysluplně závisí na tom rychlost vyhodnocení dotazu Příklad 4.4: Výběr záznamů praţských zaměstnanců z oddělení 5 Předpoklad: firma má cca 1000 zaměstnanců, 10 oddělení pouze desetina není z Prahy předpokládáme rovnoměrné rozloţení zaměstnanců na odd. Adresa obsahuje 'Praha' ( Oddělení = 5 (ZAMĚSTNANEC)) Oddělení = 5 ( Adresa obsahuje 'Praha' (ZAMĚSTNANEC)) cca 1000+100 porovnání cca 1000+900 porovnání
Projekce Π Seznam atributů (Jméno relace) Jméno relace[seznam atributů] Příklad 4.5 : Zajímají nás jména, příjmení a plat zaměstnanců Π Jméno, Příjmení, Plat (ZAMĚSTNANEC) Příklad 4.6 : Názvy a sídla nakladatelství Relace NAKLADATELSTVÍ (Id_nakladatelství, Název, Město, Ulice, Stát, Majitel) Π Název, Město, Stát (NAKLADATELSTVÍ) NAKLADATELSTVÍ [Název, Město, Stát ] Π Seznam atr1 (Π Seznam atr2 (Jméno relace))= Π Seznam atr1 (Jméno relace) platí jen tehdy, je-li seznam atr1 podmnoţinou seznam atr2. Příklad 4.7 : Π Jméno, Příjmení, Plat ( Oddělení = 4 (ZAMĚSTNANEC)) ZAMĚSTNANEC (Oddělení = 4)[Jméno, Příjmení, Plat] Můţeme pojmenovat jednotlivé výsledné relace a rozepsat ODD4 ( Oddělení = 4 (ZAMĚSTNANEC) VYSLEDEK Π Jméno, Příjmení, Plat (ODD4) Příklad 4.8 :Vypsat čísla všech zaměstnanců, kteří buďto pracují na odd 5, nebo jsou přímými nadřízenými zaměstnance pracujícího na odd 5. ZAMĚSTNANEC (Číslo, Příjmení, Jméno, Město, Ulice, PSČ, Oddělení, Nadřízený) ODD5_ZAM ( Oddělení = 5 (ZAMĚSTNANEC) VYSL1 Π Číslo (ODD5_ZAM) VYSL2 Π Nadřízený (VYSL1) VYSLEDEK VYSL1 VYSL2 Množinové operace sjednocení, průnik, rozdíl relací dá se pouţít na kompatibilní relace.
Konvence atributy výsledné relace označujeme jmény podle první relace, duplicitní záznamy se odstraňují ( při sjednocení ) Komutativita, asociativita R S = S R, ( R S ) T = S ( R T ) R S = S R, R ( S T ) = ( R S) T Kartézský součin ( kříţový součin, kříţové spojení ) nevyţaduje kompatibilní operandy. Výsledek R( A 1, A 2,..., A a ) x S( B 1, B 2,..., B m ) je relace Q (A 1, A 2,..., A a, B 1, B 2,..., B m ), která má n+m atributů a obsahuje záznam pro kaţdou kombinaci záznamů vţdy jeden z R a druhý z S. Příklad 4.9 : Potřebujeme vypsat seznam dětí všech zaměstnaných ţen ŢENY_ZAM Pohlaví = Z (ZAMĚSTNANEC) ŢENY Π Číslo, Jméno, Příjmení (ŢENY_ZAM) DĚTI_ŢEN ŢENY x DĚTI AKT_DĚTI Číslo = Číslo_ rodiče (DĚTI_ŢEN) VYSLEDEK Π Jméno, Příjmení, Akt_děti.Jméno (AKT_DĚTI) SPOJENÍ se pouţívá, pokud potřebujeme zkombinovat související (navzájem si odpovídající) záznamy ze dvou relací do jediného záznamu. Příklad 4.10: Vypsat jména, příjmení manaţerů včetně oddělení, které vedou Relace ZAMĚSTNANEC (Osobní_číslo, Jméno, Příjmení, Oddělení, Plat, Nadřízený) ODDĚLENÍ (Číslo, Název, Vedoucí) MANAŢER ODDĚLENÍ Vedoucí = Číslo ZAMĚSTNANEC VYSLEDEK Π Jméno, Příjmení, Název (MANAŢER) Příklad 4.10 : pomocí jiného způsobu zápisu (ZAMĚSTNANEC [Číslo = Vedoucí]ODDĚLENÍ)[Jméno, Příjmení, Název]
Příklad 4.11: Vypsat názvy knih, které má vypůjčeny čtenář Petr Svoboda databáze KNIHOVNA z příkladu 3.16 PŮJČENO VÝPŮJČKY_S Vráceno = null VÝPŮJČKA ( Příjmení='Svoboda' AND Jméno='Petr' ČTENÁŘ) Číslo průkazky=čtenář PŮJČENO VÝTISKY _S Π Evidenční_číslo (VÝPŮJČKY _S * VÝTISK) VYDÁNÍ_S Π Kniha (VÝTISKY _S Vydání = Číslo_vydání VYDÁNÍ) NÁZVY_S Π Název (VYDÁNÍ _S * KNIHY) Obecně R Spojovací podmínka S R [Spojovací podmínka] S Výsledek spojení R( A 1, A 2,..., A a ) a S( B 1, B 2,..., B m ) je relace Q (A 1, A 2,..., A a, B 1, B 2,..., B m ), Q obsahuje jeden záznam pro kaţdou kombinaci záznamů vţdy jeden z R a jeden z S -tak, ţe tato kombinace vyhovuje spojovací podmínce. Ještě obecněji spojovací podmínka můţe mít formu Podmínka 1 AND podmínka 2 AND.... podmínka n, kde kaţdá podmínka je tvaru A i θ B j, A i je atribut z R, B j je atribut z S, A i a B j mají tutéţ doménu a θ je jeden z operátorů,,,,, tzv. THETA SPOJENÍ EQUIJOIN spojení přes rovnost PŘIROZENÉ SPOJENÍ (*) Příklad 4.12: Relace ODDĚLENÍ (Číslo_odd, Název, Vedoucí) PROJEKT (Číslo, Název, Číslo_odd, Datum_zahájení) ODD ODDĚLENÍ (Číslo_odd, Název) PROJ_ODD PROJEKT * ODD Atribut Číslo_odd se nazývá spojující atribut
Příklad 4.13: Najít adresu kina, kde je na programu Forest Gump Relace KINO (NázevK, AdresaK) PROGRAM (NázevF, NázevK, Datum, Hodina) NázevK, AdresaK ( NázevK ( NázevF = Forest Gump (PROGRAM)) * KINO) Obecná definice přirozeného spojení Q R* ( seznam1 ), ( seznam2 ) S V tomto případě seznam1 specifikuje seznam i atributů z R a seznam2 určuje seznam i atributů z S. Seznamy jsou pouţity k sestavení podmínek testujících shodnost mezi dvojicemi odpovídajících atributů, podmínek jsou pak spolu spojeny pomocí spojky and.ve výsledné relaci jsou ponechány pouze atributy ze seznamu1. Můţe se stát, ţe výsledkem bude prázdná relace. Obecně, pokud R se skládá z n R n-tic a S z n s n-tic, můţe mít výsledek spojující operace mezi R a S celkem 0 aţ n R * n S n-tic. Poměr mezi výsledkem spojení a maximální hodnotou n R * n S udává tzv. spojovací selektivitu, coţ je vlastnost kaţdé spojovací podmínky. Není-li uvedena ţádná spojovací podmínka, dostáváme vlastně kartézský součin kříţové spojení. Operace relační algebry,,,, tvoří úplnou množinu, neboť kaţdá další operace relační algebry se dá vyjádřit jako kombinace těchto operací. R S ( R S ) (( R S ) ( S R )) R Spojovací podmínka S selekční podmínka(rxs) Polospojení Levé polospojení relací se schématy R(A) a R(B) se dá definovat pomocí spojení a projekce jako A ( R t 1 t 2 S ) dle jiného způsobu zápisu R < t 1 t 2 ] S = (R [ t 1 t 2 ] S ) [A] Pravé polospojení Polospojení přes rovnost polospojení přes rovnost vybraných společných atributů Přirozené polospojení polospojení přes rovnost všech společných atributů
Příklad 4.14 : R A B C S B C D E 8 2 3 2 4 2 3 1 2 3 2 3 2 3 1 1 4 1 4 5 6 3 6 7 2 3 4 7 3 8 9 7 2 5 T je levé polospojení R < A<B ] S T A B C U A B C 1 2 3 8 2 3 1 1 4 1 2 3 1 1 4 U je levé přirozené polospojení přes atributy B, C Příklad 4.15 : Najdi kina, kde nedávají ţádný film s Michel Pffeifer KINO[NázevK] ((FILM(Herec= Pffeifer Michel )[NázevF])*(PROGRAM[NázevK, NázevF]))[NázevK] Strom dotazu příkladu 4.15 [NázevK] [NázevK] KINO * [NázevF] [NázevK, NázevF] (Herec = Pffeifer Michel ) PROGRAM FILM Vnější spojení levé ( event. pravé ) Přirozené vnější spojení
N-ticový relační kalkul pouţívá přirozený pohled na relaci jako na mnoţinu n-tic (řádků, záznamů ) Termy - n-ticové proměnné - komponenty n-ticových proměnných ( tečková notace ) - atomické konstanty ( hodnoty přímo z nějaké domény ) Predikátové symboly,,,,, NRK je zaloţen na pojmu formule ( podobný smysl jako v predikátové logice ) Atomická formule R(x) R relace, x n-ticová proměnná x.a y.b A, B atributy, x, y n-ticové proměnné x.a k k konstanta Logické spojky and, or, not, implies Příklad 4.16 : dotaz najdi adresy všech kin x.adresa where KINO(x) jiná syntaxe ( vlastně projekce Adresa ( KINO) ) Příklad 4.17 : dotaz najdi všechny herce hrající ve filmu Top Gun film.herec where FILM(film) and film.názevf = Top Gun ( vlastně selekce a projekce Herec ( NázevF = Top Gun (FILM)) ) Příklad 4.18 : Najdi všechna kina, kde hrají film Matrix x.názevk where PROGRAM(x) and x.názevf= Matrix Příklad 4.19 : Najdi všechny praţské firmy mající konto v bance x.jméno where KLIENT(x) and x.adresa like Praha and x.osoba= P Obecně dotazy mají tvar : seznam komponent-proměnných where formule Kvantifikátory existenční exists univerzální forall
Příklad 4.20: p.název_k where PROGRAM(p) and exists f ( FILM(f) and p. NázevF = f. NázevF and f.herec = Hanks Tom ) Příklad 4.21: p.názevf where PROGRAM(p) and forall x (PROGRAM(x) implies exists y (PROGRAM(y) and y.názevk = x.názevk and p.názevf = y. NázevF) ) Zobecnění exists x (F(x)) (1) přepíšeme, pokud omezíme x na relaci R jako exists x ( R(x) and F (x) ) (2) podobně forall x ( F(x) ) (3) zobecníme jako forall x ( R(x) and F (x) ) (4) kde výrazy (2) a (4) definují tzv. omezené kvantifikátory, které můţeme psát jako exists x R ( G(x) ) forall x R ( G(x) ) kde formule G neobsahuje výskyty proměnné x s kvantifikátory exists nebo forall Příklad 4.22: p.názevk where PROGRAM(p) and forall f FILM (f.herec= Gibson Mel implies exists q PROGRAM (q.názevk=p.názevk and q.názevf=f.názevf)) Příklad 4.23: p.názevk where PROGRAM(p) and forall f FILM (f.herec= Gibson Mel implies not exists q PROGRAM (q.názevk=p.názevk and q.názevf=f.názevf))
Doménový relační kalkul Souvisí těsněji s predikátovou logikou, pouţívá jednoduché proměnné. Je-li R( A, B, C ) schéma relace, pak R(x, y, z) znamená totéţ jako R(u) v n-ticovém kalkulu. Atomické formule se zapisují i s atributy (konvence zajišťující nezávislost atributů na pořadí) tj. místo R(x, y, z) píšeme R(A:x, B:y, C:z) Termy - proměnné a konstanty Atomické formule R(A 1 :t 1, A 2 :t 2,..., A n :t n ) t 1 t 2 Formule se tvoří stejně jako v NRK, princip vyuţití formulí v dotazech je podobný jako v NRK. Příklad 4.24: projekce adr where exists k ( KINO ( NázevK :k, Adresa:adr )) Příklad 4.25: selekce h where exists r ( FILM (NázevF: Titanic, Herec : h, Rok : R ) ) Příklad 4.26: spojení nazk, adr, nazf, dat where ( PROGRAM ( NázevK : nazk, NázevF: nazf, Datum:dat) and KINO ( NázevK:nazK, Adresa: adr ) ) Konvence vynechávat exists ve formulích tvaru exists x ( R(..., A:x,... ), kde x není vícekrát ve formuli - Příklad 4.27 : adr where ( KINO ( Adresa : adr ) ) h where ( FILM (NázevF: Titanic, Herec : h ) )
Příloha 1 : část relačního schématu BANKA uvaţujme následující relace KLIENT Číslo Jméno Osoba Adresa 00001 Suchánek Jakub F Praha, Dukelská 10 00002 GAMA s. r. o. P Brno, Blahoslavova 113 00003 ALEA s. r. o. P Písek, Praţská 1425 00004 Vrána Jiří F Praha, Vladislavova 1512 00005 EKOSTAV a. s. P Č. Budějovice, Lidická 12 00006 Janoušek Pavel P Písek, Táborská 177 00007 Dvorský Petr F Č. Budějovice, Česká 501 POHYB Druh Účet Identifikace Datum Měna Částka 1 AX 00112233 001 12.09.97 CZK 17 500 2 AX 00221111 003 13.09.97 DEM 24 860 2 BX 01010202 001 14.09.97 GBP 13 500 1 BX 03132333 133-66-89/0100 13.09.97 DEM 28 600 1 CX 01010100 199-58-699/0800 14.09.97 ATS 65 000 1 CX 22112244 2951-856/4200 15.09.97 ATS 19 800 2 BX 03132333 002 16.09.97 CND 7 200 2 CX 01010100 001 17.09.97 DEM 29 500 2 AX 45674567 17-44-694/7100 18.09.97 DEM 36 400 2 BX 00025678 19-25-169/7100 19.09.97 DEM 145 000 2 BX 00032345 135-1587/4200 11.09.97 ITL 25 150 000 1 BX 00121444 17-258-23/7100 13.09.97 DEM 24 300 1 AX 00221111 148-568/0600 14.09.97 USD 49 100 1 CX 01010100 126-235/0800 15.09.97 CZK 2 564 000 ÚČET Číslo Majitel Datum Zůstatek Měna AX 00112233 00001 25.01.1996 25 000 CZK AX 00221111 00004 17.04.1994 175 000 DEM AX 12345678 00006 29.07.1995 80 000 USD AX 32132132 00001 24.05.1997 12 000 DEM AX 45674567 00006 28.10.1996 235 000 CZK BX 00025678 00002 17.04.1998 758 000 CZK BX 00032345 00005 19.07.1996 4 250 600 ATS BX 00121444 00005 27.12.1997 78 000 GBP BX 00123123 00002 08.11.1993 115 000 ATS BX 01010202 00003 14.03.1987 175 000 NLG BX 03132333 00005 25.02.1987 265 000 DEM CX 01010100 00003 30.05.1970 1 250 000 CZK CX 22112244 00005 18.06.1970 758 000 CZK
Příloha 2 : část relačního schématu FILMOVÁ DISTRIBUCE uvaţujme následující relace KINO NázevK Adresa Vesmír ČB, Lannova 110 Orion Písek, Blahoslavova 113 Blaník ČB, Lidická 12 Ponrepo Tábor, Česká 501 PROGRAM NázevK NázevF Datum Vesmír Kolja 12.09.2007 Vesmír Forest Gump 13.09.2007 Vesmír Forest Gump 14.09.2007 Orion Titanic 13.09.2007 Orion Smrtonosná zbraň 14.09.2007 Orion Matrix 15.09.2007 Orion Top Gun 16.09.2007 Orion Forest Gump 17.09.2007 Orion Síť 18.09.2007 Orion Apollo 13 19.09.2007 Blaník Nebezpečné myšlenky 11.09.2007 Blaník Matrix 13.09.2007 Blaník Matrix 14.09.2007 Ponrepo Kleopatra 15.09.2007 FILM NázevF Herec Rok Kolja Svěrák Zdeněk 1996 Forest Gump Hanks Tom 1994 Nebezpečné myšlenky Pfeiffer Michel 1995 Apollo 13 Hanks Tom 1993 Smrtonosná zbraň Gibson Mel 1987 Smrtonosná zbraň Glover Dan 1987 Kleopatra Burton Richard 1970 Kleopatra Taylor Elisabeth 1970 Top Gun Cruise Tom 1986 Top Gun Kilmer Val 1986 Titanic DiCaprio Leonardo 1997 Titanic Winslet Kate 1997 Síť Bullock Sandra 1995 Nebezpečná rychlost Bullock Sandra 1994 Nebezpečná rychlost Reeves Keanu 1994 Matrix Reeves Keanu 1999
Ještě několik příkladů na závěr NRK 1. Vypsat, které filmy z roku 1998 se hrají v kině Blaník p.jménof where (PROGRAM(p) and p.názevk= Blaník and exists f (FILM(f) and f. NázevF =p. NázevF and f.rok=1998) 2. Vypsat firmy, které mají pouze devizová konta k.jméno where KLIENT(k) and k.osoba= P and not exists t ( t.majitel=k.číslo and t.kod= CZK ) ÚČET 2. Vypsat firmy, které mají pouze devizová konta k.jméno where KLIENT(k) and k.osoba= P and forall t ( t.majitel=k.číslo implies t.kod <> CZK ) ÚČET 3. Zjistit jména lidí (fyzických osob), kteří měli v uplynulém měsíci jednotlivý příjem více než 1000000 Kč k.jméno where KLIENT(k) and k.osoba= F and exists t (ÚČET (t) and t.majitel=k.cislo and exists p (POHYB(p) and p.účet=t.cislo and p.druh=1 and p.mena= CZK and p.castka>1000000)) Relační algebra 3. ((POHYB(Druh=1 and Měna = CZK and Částka>1000000)) [Účet= Číslo] ÚČET [Majitel=Číslo] (KLIENT(osoba= F ) [Číslo,Jméno])) [Jméno] 3. jiná notace Jméno ( osoba= F KLIENT)* Majitel=Číslo ÚČET * Číslo=Účet ( Druh=1 and Měna = CZK and Částka>1000000 POHYB) 3. Jméno ( Jméno,Číslo ( osoba= F KLIENT)) * Majitel=Číslo ( Číslo, Majitel ÚČET) * Číslo=Účet ( Účet ( Druh=1 and Měna = CZK and Částka>1000000 POHYB))
DRK 4. Film, který dávají ve všech kinech, kde něco hrají f where forall k (PROGRAM (NázevK:k) implies PROGRAM (NázevF:f, NázevK:k)) f where not exists k (PROGRAM (NázevK:k) and not PROGRAM (NázevF:f, NázevK:k)) 5. Kino, v němž nedávají žádný film k where not exists f (FILM (NázevF:f) and PROGRAM (NázevF:f, NázevK:k)) 6. Kino, kde dávají všechny filmy s Keanu Reevesem k where forall f (FILM (JménoF:f, Herec: Reeves Keanu ) implies PROGRAM (NázevK:k, NázevF:f)) Literatura: [1] ELMASRI, R., NAVATHE, S., B. Fundamentals of Database Systems, 5th edition. Addison- Wesley, 2007. ISBN 978-03-213-6957-4. [2] SILBERSCHATZ, A., KORTH H. F., SUDARSHAN S. Database System Concepts, 5 th edition, New York: McGraw-Hill, 2006. ISBN 978-0-07-295886-7 [3] CONOLLY, T., BEGG, C., HOLOWZAK R. Profesionální průvodce tvorbou databází. Praha: Computer Press, a. s., 2009. ISBN 978-80-251-2328-7. [4] HERNANDEZ, M., J. Návrh databází. Praha: Grada, 2006. ISBN 80-247-0900-7. [5] POKORNÝ, J. Databázová abeceda. Veletiny: Science, 1998, ISBN 80-86083-02-2. [6] POKORNÝ, J., HALAŠKA, I. Databázové systémy, 2. vydání. Praha Vydavatelství ČVUT, 2003, ISBN 80-01-02789-9.