Relasjonsalgebra – Eksempler
For eksemplene under antar vi at vi har følgende tabeller:
Sportslag:
navn | land | gren | etablert | ireg |
---|---|---|---|---|
Manchester United | England | Fotball | 1878 | 23419 |
Manchester City | England | Fotball | 1894 | 23421 |
AC Milan | Italia | Fotball | 1899 | 11382 |
Chicago Bulls | USA | Basketball | 1966 | 4881 |
FaZe Clan | USA | Esport | 2010 | 81124 |
Vålerenga | Norge | Fotball | 1913 | 31309 |
Vålerenga | Norge | Ishockey | 1913 | 356 |
Utøvere:
navn | lag | id | født |
---|---|---|---|
Lee Grant | 23419 | 13 | 1983-01-27 |
David de Gea | 23419 | 1 | 1990-11-07 |
Håvard Nygaard | 81124 | rain | 1994-08-27 |
Steffen Søberg | 356 | 70 | 1993-08-06 |
Projeksjon (π)
Projekson er en operator som uttrykkes med π, og tar en relasjon og returnerer en relasjon med en delmengde av den originale relasjonens attributter. De attributtene man ønsker å ha med skriver man med subskript, f.eks. vil
gi:
navn |
---|
Manchester United |
Manchester City |
AC Milan |
Chicago Bulls |
FaZe Clan |
Vålerenga |
Merk at vi her har fjernet duplikatet av Vålerenga
,
siden en relasjon er en mengde med tupler og skal derfor ikke
ha noen duplikate tupler i seg.
Videre vil
gi:
navn | født |
---|---|
Lee Grant | 1983-01-27 |
David de Gea | 1990-11-07 |
Håvard Nygaard | 1994-08-27 |
Steffen Søberg | 1993-08-06 |
Seleksjon (σ)
Seleksjon er en operator som uttrykkes med σ, og tar en relasjon og returnerer en relasjon med en delmengde av tuplene fra den originale relasjonen. Seleksjons-operatoren tar et uttrykk hvor attributt-navnene behandles som variable, og som returnerer alle rader hvor uttrykket evaluerer til sant. F.eks. vil
gi:
navn | lag | id | født |
---|---|---|---|
Lee Grant | 23419 | 13 | 1983-01-27 |
Vi kan bruke ulike relasjoner, slik som <, ≤,
≠, osv. Vi kan også kombinere utsagn
med ∧ (“and”) og ∨ (“or”). F.eks., for å finne alle utøvere
født mellom 1991-01-01
og 1995-01-01
kan vi
skrive
som vil gi:
navn | lag | id | født |
---|---|---|---|
Håvard Nygaard | 81124 | rain | 1994-08-27 |
Steffen Søberg | 356 | 70 | 1993-08-06 |
Omdøping (ρ)
Omdøping er en operator som skrives ρ, og tar en relasjon og returnerer en relasjon som inneholder akkurat de samme tuplene og attributtene som argument-relasjonen, men hvor en eller flere attributter har byttet navn. F.eks. vil
bli:
navn | lag | id | fødselsdato |
---|---|---|---|
Lee Grant | 23419 | 13 | 1983-01-27 |
David de Gea | 23419 | 1 | 1990-11-07 |
Håvard Nygaard | 81124 | rain | 1994-08-27 |
Steffen Søberg | 356 | 70 | 1993-08-06 |
mens
blir:
lagnavn | nasjonalitet | gren | etablert | ireg |
---|---|---|---|---|
Manchester United | England | Fotball | 1878 | 23419 |
Manchester City | England | Fotball | 1894 | 23421 |
AC Milan | Italia | Fotball | 1899 | 11382 |
Chicago Bulls | USA | Basketball | 1966 | 4881 |
FaZe Clan | USA | Esport | 2010 | 81124 |
Vålerenga | Norge | Fotball | 1913 | 31309 |
Vålerenga | Norge | Ishockey | 1913 | 356 |
Denne operatoren er ikke så nyttig i seg selv, men den blir nyttig
når vi ønsker å kombinere data fra flere tabeller i én relasjon. Da vil
vi måtte omdøpe attributter fra forskjellige relasjoner som har like
navn (slik som de to navn
-attributtene i de to
eksempel-relasjonene våre).
Kryssprodukt (×)
Kryssprodukt, eller kartesisk produkt, skrives × og er en operator som kombinerer to relasjoner. Resultatet er en relasjon som har alle attributtene til de to argument-relasjonene, og inneholder alle kombinasjoner av tupler fra de to relasjonene.
F.eks. dersom vi har relasjonene
Person:
id | navn | jobb |
---|---|---|
1 | Ole | 2 |
2 | Kari | 3 |
3 | Hanne | 2 |
4 | Nils | 1 |
Firma:
orgnr | firmanavn |
---|---|
1 | DNB |
2 | Nordea |
3 | Finn |
så vil
bli:
orgnr | firmanavn | id | navn | jobb |
---|---|---|---|---|
1 | DNB | 1 | Ole | 2 |
1 | DNB | 2 | Kari | 3 |
1 | DNB | 3 | Hanne | 2 |
1 | DNB | 4 | Nils | 1 |
2 | Nordea | 1 | Ole | 2 |
2 | Nordea | 2 | Kari | 3 |
2 | Nordea | 3 | Hanne | 2 |
2 | Nordea | 4 | Nils | 1 |
3 | Finn | 1 | Ole | 2 |
3 | Finn | 2 | Kari | 3 |
3 | Finn | 3 | Hanne | 2 |
3 | Finn | 4 | Nils | 1 |
Som sagt over, kan vi ikke ta kryssprodukt mellom to relasjoner som har attributter med samme navn. Så f.eks. Utøvere × Sportslag. Vi kan derimot omdøpe et av disse attributtene til noe annet, f.eks. omdøpe navn i Utøver til unavn.
Vi kan da gjøre
som blir:
unavn | lag | id | født | navn | land | gren | etablert | ireg |
---|---|---|---|---|---|---|---|---|
Lee Grant | 23419 | 13 | 1983-01-27 | Manchester United | England | Fotball | 1878 | 23419 |
Lee Grant | 23419 | 13 | 1983-01-27 | Manchester City | England | Fotball | 1894 | 23421 |
Lee Grant | 23419 | 13 | 1983-01-27 | AC Milan | Italia | Fotball | 1899 | 11382 |
Lee Grant | 23419 | 13 | 1983-01-27 | Chicago Bulls | USA | Basketball | 1966 | 4881 |
Lee Grant | 23419 | 13 | 1983-01-27 | FaZe Clan | USA | Esport | 2010 | 81124 |
Lee Grant | 23419 | 13 | 1983-01-27 | Vålerenga | Norge | Fotball | 1913 | 31309 |
Lee Grant | 23419 | 13 | 1983-01-27 | Vålerenga | Norge | Ishockey | 1913 | 356 |
David de Gea | 23419 | 1 | 1990-11-07 | Manchester United | England | Fotball | 1878 | 23419 |
David de Gea | 23419 | 1 | 1990-11-07 | Manchester City | England | Fotball | 1894 | 23421 |
David de Gea | 23419 | 1 | 1990-11-07 | AC Milan | Italia | Fotball | 1899 | 11382 |
David de Gea | 23419 | 1 | 1990-11-07 | Chicago Bulls | USA | Basketball | 1966 | 4881 |
David de Gea | 23419 | 1 | 1990-11-07 | FaZe Clan | USA | Esport | 2010 | 81124 |
David de Gea | 23419 | 1 | 1990-11-07 | Vålerenga | Norge | Fotball | 1913 | 31309 |
David de Gea | 23419 | 1 | 1990-11-07 | Vålerenga | Norge | Ishockey | 1913 | 356 |
Håvard Nygaard | 81124 | rain | 1994-08-27 | Manchester United | England | Fotball | 1878 | 23419 |
Håvard Nygaard | 81124 | rain | 1994-08-27 | Manchester City | England | Fotball | 1894 | 23421 |
Håvard Nygaard | 81124 | rain | 1994-08-27 | AC Milan | Italia | Fotball | 1899 | 11382 |
Håvard Nygaard | 81124 | rain | 1994-08-27 | Chicago Bulls | USA | Basketball | 1966 | 4881 |
Håvard Nygaard | 81124 | rain | 1994-08-27 | FaZe Clan | USA | Esport | 2010 | 81124 |
Håvard Nygaard | 81124 | rain | 1994-08-27 | Vålerenga | Norge | Fotball | 1913 | 31309 |
Håvard Nygaard | 81124 | rain | 1994-08-27 | Vålerenga | Norge | Ishockey | 1913 | 356 |
Steffen Søberg | 356 | 70 | 1993-08-06 | Manchester United | England | Fotball | 1878 | 23419 |
Steffen Søberg | 356 | 70 | 1993-08-06 | Manchester City | England | Fotball | 1894 | 23421 |
Steffen Søberg | 356 | 70 | 1993-08-06 | AC Milan | Italia | Fotball | 1899 | 11382 |
Steffen Søberg | 356 | 70 | 1993-08-06 | Chicago Bulls | USA | Basketball | 1966 | 4881 |
Steffen Søberg | 356 | 70 | 1993-08-06 | FaZe Clan | USA | Esport | 2010 | 81124 |
Steffen Søberg | 356 | 70 | 1993-08-06 | Vålerenga | Norge | Fotball | 1913 | 31309 |
Steffen Søberg | 356 | 70 | 1993-08-06 | Vålerenga | Norge | Ishockey | 1913 | 356 |
Hvorfor er dette nyttig? Jo, fordi vi nå har én tabell med alle mulige kombinasjoner av tuplene i de to relasjonene kan vi nå bruke π og σ til å velge ut interessant rader og attributter. F.eks. er det jo en fremmednøkkel mellom de to tabellene, hvor lag-attributten refererer til ireg-attributten. Vi kan nå velge ut de tuplene hvor disse to verdiene er like for å få en relasjon som inneholder all informasjon om utøvere og lag, men kun hvor utøveren spiller for laget på samme rad. Altså, vi bare omslutter uttrykket over med σlag = ireg, slik:
som gir:
unavn | lag | id | født | navn | land | gren | etablert | ireg |
---|---|---|---|---|---|---|---|---|
Lee Grant | 23419 | 13 | 1983-01-27 | Manchester United | England | Fotball | 1878 | 23419 |
David de Gea | 23419 | 1 | 1990-11-07 | Manchester United | England | Fotball | 1878 | 23419 |
Håvard Nygaard | 81124 | rain | 1994-08-27 | FaZe Clan | USA | Esport | 2010 | 81124 |
Steffen Søberg | 356 | 70 | 1993-08-06 | Vålerenga | Norge | Ishockey | 1913 | 356 |
Videre kan vi så bruke projeksjon til å velge ut de attributtene vi er interessert i. F.eks. om vi er interessert i navn på utøver og laget utøveren spiller for, kan vi omslutte uttrykket over med πunavn, navn slik:
som gir:
unavn | navn |
---|---|
Lee Grant | Manchester United |
David de Gea | Manchester United |
Håvard Nygaard | FaZe Clan |
Steffen Søberg | Vålerenga |
Join (⋈)
Join er en operator som skrives ⋈ og er en slags kombinasjon av kryssprodukt og seleksjon. Den tar en formell, akkurat som seleksjon, og to relasjoner, akkurat som kryssprodukt, og returnerer alle tupler i kryssproduktet hvor formelen er sann. F.eks. vil
gi oss:
orgnr | firmanavn | id | navn | jobb |
---|---|---|---|---|
1 | DNB | 4 | Nils | 1 |
2 | Nordea | 1 | Ole | 2 |
2 | Nordea | 3 | Hanne | 2 |
3 | Finn | 2 | Kari | 3 |
Altså er det det samme som σorgnr = jobb(Firma×Person).
Tilsvarende kunne vi også forenklet uttrykket vi skrev over for å finne navn på alle spillere og laget de spiller på slik:
Joins som har en formel som kun bruker likhet kalles ofte en equi-join.
Naturlig join
Det finnes en egen type join, som heter naturlig join, som er relativt lik join-operatoren vi så over, men hvor man ikke oppgir noen formel. Resultatet er alle tupler som har like verdier i attributtene som har likt navn i de to relasjonene. Resultat-relasjonen inneholder kun én attributt for hvert attributt-navn, og fjerner dermed duplikate attributter.
F.eks. la oss si vi hadde følgende relasjoner, som er helt like de
over, men hvor vi har endret navnet på jobb
-attributten til
å heller hete orgnr
:
Person:
id | navn | orgnr |
---|---|---|
1 | Ole | 2 |
2 | Kari | 3 |
3 | Hanne | 2 |
4 | Nils | 1 |
Firma:
orgnr | firmanavn |
---|---|
1 | DNB |
2 | Nordea |
3 | Finn |
Vi kan nå bruke en naturlig-join for å kombinere de to relasjonene direkte slik:
og vi får da:
orgnr | firmanavn | id | navn |
---|---|---|---|
1 | DNB | 4 | Nils |
2 | Nordea | 1 | Ole |
2 | Nordea | 3 | Hanne |
3 | Finn | 2 | Kari |
Merk at orgnr
kun forekommer én gang, og at vi kun har
tuplene hvor orgnr
-verdiene er like i de to originale
relasjonene.
Av og til bruker man heller symbolet *
for naturlig
join.
Merk at dersom to relasjoner ikke har noen like attributt-navn vil resultatet av en naturlig join mellom dem bli det samme som kryssproduktet. Merk også at naturlig join kan joine på ting om ikke gir mening i det hele tatt! Dersom vi tar en naturlig join mellom Utøvere og Sportslag vil vi få en relasjon som inneholder alle tupler hvor utøveren har likt navn som sportslaget, som jo i vårt tilfelle ville gitt en tom relasjon som svar.