Databaser Relasjonsmodellen 2 Læreboka: Kap. 2 Relasjonsmodellen
Tema for dagen Hva er relasjonsalgebra? Seleksjon Projeksjon Produkt Indre forening Ytterforening Settoperasjoner: union, snitt, differanse Grupperingsoperatoren divisjon Hva er en relasjonsdatabase? 10.10.2008 Kjell Toft Hansen 2
Hva er relasjonsalgebra? Relasjonsalgebra er et matematisk system bestående av: Atomiske operander: relasjoner eller variabler som representerer relasjoner Operatorer: designet for å gjøre de mest vanlige operasjonene vi har behov for å gjøre med relasjoner i en database Et sett med operasjoner som utføres på relasjoner Resultatet er alltid en ny relasjon 10.10.2008 Kjell Toft Hansen 3
Hva er relasjonsalgebra? De egentlige algebraoperatorene: seleksjon, projeksjon, produkt og forening Settoperatorene: union, snitt, differanse Grupperingsoperatoren: divisjon 10.10.2008 Kjell Toft Hansen 4
Hva er relasjonsalgebra? Et algebraisk uttrykk kan skrives slik: OPERASJON(R1:s:r:, R2:s:r:, RES::); R1 og R2 er relasjoner, RES er resultatrelasjonen s (selektor)uttrykker horisontalt utvalg (seleksjon) og r (reduktor)uttrykker vertikalt utvalg (projeksjon) 10.10.2008 Kjell Toft Hansen 5
Hva er relasjonsalgebra? Seleksjon, projeksjon, produkt, union og differanse er primitive fordi de øvrige kan uttrykkes ved hjelp av disse Bruker SELECT setningen til å utføre operasjonene i et SQL (Structered Query Language) basert databasesystem Med unntak av divisjon, er alle operatorene enkle å utføre i SQL 10.10.2008 Kjell Toft Hansen 6
Seleksjon Seleksjon (restriksjon): vi lager en ny relasjon ut fra bestemte tupler i en eksisterende relasjon Vi begrenser antall tupler SELECT(R1:s:r:, RES::); 10.10.2008 Kjell Toft Hansen 7
Seleksjon Tabell: Ansatt Skriv ut alle ansatte som har etternavnet Olsen og jobber i avdeling 1: SELECT(ANSATT:(etternavn= Olsen) AND (avd_nr = 1):r:, RES::); SQL: SELECT * FROM ansatt WHERE etternavn = 'Olsen' AND avd_nr = 1; RES 10.10.2008 Kjell Toft Hansen 8
Projeksjon Projeksjon (reduksjon): vi lager en ny relasjon ut fra bestemte attributter i en eksisterende relasjon Vi begrenser antall kolonner PROJECT(R1:s:r:, RES::); 10.10.2008 Kjell Toft Hansen 9
Projeksjon Tabell: Ansatt Skriv ut alle ansatte med ansatt_nr, etternavn og fornavn: PROJECT(ANSATT:s:ansatt_nr etternavn fornavn:, RES::); SQL: SELECT ansatt_nr, etternavn, fornavn FROM ansatt; RES 10.10.2008 Kjell Toft Hansen 10
Produkt (Kartesisk) produkt (kryssprodukt): lager en ny relasjon ved å sette sammen hver tuppel i R1 med hvert tuppel i R2 slik at R1 x R2 = RES Antallet attributter i resultatrelasjonen er lik summen av antall attributter i R1 og antall attributter i R2 og i rekkefølge Unntaket er attributter med samme navn som blir R1.a og R2.a CROSS(R1:s:r:, R2:s:r:, RES::) 10.10.2008 Kjell Toft Hansen 11
Produkt Tabell: Ansatt Tabell: Avdeling CROSS(ANSATT:s:r:, AVDELING:s:r:, RES::); Antall tuppler: 3 x 3 = 9 Antall attributter: 7 + 2 = 9 SQL: SELECT * FROM ansatt, avdeling; Tabell: RES 10.10.2008 Kjell Toft Hansen 12
Indre forening (eng. inner join) Forening (eng. join): vi lager en ny relasjon med sammensettinger av tupler fra to relasjoner på et felles attributt, slik at hver sammensetting tilfredsstiller en gitt betingelse Ofte (ikke alltid) vil det felles attributtet være primærnøkkel i den ene relasjonen og fremmednøkkel i den andre Likhetsforening (eng. equijon): de to felles attributtene har samme verdi Naturlig forening (eng. natural join): det samme som likhetsforening, men duplikatattributtene er fjernet 10.10.2008 Kjell Toft Hansen 13
Indre forening (eng. inner join) JOIN(R1:s:r:k, R2:s:r:k, RES::); En resultattabell RES dannes når gitte attributter, spesifisert ved attributtlisten k, i R1 og R2, har samme verdi: R1.k = R2.k. En av de viktigste og nyttigste av relasjonsoperatorene Den mest brukte måte for å kombinere informasjon fra to eller flere tabeller 10.10.2008 Kjell Toft Hansen 14
Indre forening (eng. inner join) Tabell: Ansatt Tabell: Avdeling Skriv ut hvilke ansatte som jobber i hvilke avdelinger Naturlig forening: JOIN(ANSATT:s:r:avd_nr, AVDELING:s:avd_navn:avd_nr, R::); SQL: SELECT a.*, avd_navn FROM ansatt a, avdeling av WHERE a.avd_nr = av.avd_nr; SELECT a.*, avd_navn FROM ansatt a INNER JOIN avdeling av ON a.avd_nr = av.avd_nr; Tabell: RES 10.10.2008 Kjell Toft Hansen 15
Ytterforening (eng. outer join) Venstre ytterforening (eng. left outer join) Er en likhetsforening, men med det tillegg at alle tupler i venstre relasjon skal være med. Der det mangler sammenfallende verdier fra høyre relasjon, er attributtene fra høyre relasjon gitt NULL verdier Høyre ytterforening er tilsvarende LEFT OUTER JOIN(R1:s:r:k, R2:s:r:k; RES::); 10.10.2008 Kjell Toft Hansen 16
Ytterforening Tabell: Ansatt Tabell: Avdeling Skriv ut alle ansatte (også de som ikke jobbe i noen Avdeling) og hvilke avdelinger de jobber i Venstre ytterforening: LEFT-OUTER-JOIN(ANSATT:s:r:avd_nr, AVDELING:s:avd_navn:avd_nr, RES::); SQL: SELECT a.*, avd_navn FROM ansatt a LEFT JOIN avdeling av ON a.avd_nr = av.avd_nr; Tabell: RES 10.10.2008 Kjell Toft Hansen 17
Ytterforening Tabell: Ansatt Tabell: Avdeling Skriv ut alle ansatte og hvilke avdelinger (også de avdelinger som ikke har noen ansatte) de jobber i Høyre ytterforening: RIGHT-OUTER-JOIN(ANSATT:s:ansatt_nr etternavn fornavn adresse epost telefon:avd_nr, AVDELING:s:r:avd_nr avd_navn, RES::); SQL: SELECT a.ansatt_nr, etternavn, fornavn, adresse, epost, telefon, av.* FROM ansatt a RIGHT JOIN avdeling av ON a.avd_nr = av.avd_nr; Tabell: RES 10.10.2008 Kjell Toft Hansen 18
Settoperasjonen UNION Union lager en ny relasjon med tupler som finnes i den ene eller begge av to relasjoner. Relasjonene må være unionkompatible, dvs. at de har samme antallet attributter, og at attributtene er definert på samme verdidomene (har samme datatype) UNION(R1:s:r:k, R2:s:r:k, RES::); NB!! Alle duplikattupler blir fjernet 10.10.2008 Kjell Toft Hansen 19
Settoperasjonen UNION Tabell: Leverandor Tabell: Produkt Finn byer som har leverandører og/eller produkter : UNION(LEVERANDOR:s:r:lev_by, PRODUKT:s:r:prod_by, RES::lev_by); SQL: SELECT lev_by FROM leverandor UNION SELECT prod_by FROM produkt; RES 10.10.2008 Kjell Toft Hansen 20
Settoperasjonen SNITT Snitt (eng. intersect) lager en ny relasjon med tupler som finnes i begge av to relasjoner. Relasjonene må være unionkompatible. INTERSECT(R1:s:r:k, R2:s:r:k, RES::); NB!! Alle duplikattupler blir fjernet 10.10.2008 Kjell Toft Hansen 21
Settoperasjonen SNITT Tabell: Leverandor Tabell: Produkt Finn byer som har både leverandører og produkter INTERSECT(LEVERANDOR:s:r:lev_by, PRODUKT:s:r:prod_by, RES::lev_by); SQL (MySQL): SELECT DISTINCT lev_by FROM leverandor WHERE lev_by IN ( SELECT prod_by FROM produkt); RES 10.10.2008 Kjell Toft Hansen 22
Settoperasjonen DIFFERANSE Differanse (eng. difference) lager en ny relasjon med tupler som finnes i den første, men ikke i den andre av to relasjoner. Relasjonene må være unionkompatible DIFFERENCE(R1:s:r:k, R2:s:r:k, RES::); NB!! Alle duplikattupler blir fjernet 10.10.2008 Kjell Toft Hansen 23
Settoperasjonen DIFFERANSE Tabell: Leverandor Tabell: Produkt Finn byer hvor det er leverandører, men ikke produkter : DIFFERENCE(LEVERANDOR:s:r:lev_by, PRODUKT:s:r:prod_by, RES::lev_by); SQL (MySQL): SELECT DISTINCT lev_by FROM leverandor WHERE lev_by NOT IN ( SELECT prod_by FROM produkt); RES 10.10.2008 Kjell Toft Hansen 24
Grupperingsoperatoren DIVISJON Operatoren krever at vi har to relasjoner Den første må ha flere eller like mange tupler som relasjon to Den første relasjonen, R1, har to attributter eller attributtgrupper, g og c Tuplene i R1 grupperes på g Tuplene i R2 har attributter som er sammenlignbare med c Tuplenes c del i hver gruppe testes så mot alle tuplene i R2. Hvis all R2s tupler finnes for samme gruppe, vil gruppenes samlingsattributter g, inkluderes i resultatrelasjonen DIVISJON(R1:s:r:g:c, R2:s:r:c, RES:s:r); 10.10.2008 Kjell Toft Hansen 25
Grupperingsoperatoren DIVISJON Tabell: Produkt Tabell: Leveranse Finn hvilke leverandører som har leveranser av alle produktene: DIVISJON(LEVERANSE:s:lev_nr prod_nr:lev_nr:prod_nr, PRODUKT:s:prod_nr:prod_nr, RES::lev_nr); r:c g r c SQL: SELECT lev_nr FROM leverandor l WHERE NOT EXISTS ( SELECT * FROM produkt p WHERE NOT EXISTS ( SELECT * FROM leveranse le WHERE le.lev_nr = l.lev_nr AND le.prod_nr = p.prod_nr )); Velg leverandører slik at det ikke fins produkter som de ikke leverer. 10.10.2008 26 Kjell Toft Hansen
Hva er en relasjonsdatabase? Relasjonsmodellen er et teoretisk fundament for databaser En database må tilfredsstille kravene i relasjonsmodellen for å kunne kalles en relasjonsdatabase Codd sier at et databasesystem er relasjonelt hvis det tilfredsstiller følgende kriterier: Brukeren av systemet skal oppfatte dataene som en samling med relasjoner (tabeller som tilfredsstiller visse krav), og intet annet. Systemet må minst tilby følgende operasjoner: seleksjon, projeksjon, forening (eng. join) uten på forhånd å måtte definere fysiske aksessveier for å kunne bruke disse operasjonene. I tillegg finnes det 12 detaljerte regler angående: datarepresentasjon, aksessveier, datakataloger, databasespråk, virtuelle relasjoner (eng. views), fysisk og logisk datauavhengighet og integritet. Men i henhold til denne definisjonen finnes det ikke relasjonelle systemer på markedet i dag. Dette er kontroversielt, men uansett så danner relasjonsmodellen en solid teoretisk basis og dernest utgjør definisjonen et mål å strekke seg etter. 10.10.2008 Kjell Toft Hansen 27