254 lines
11 KiB
Markdown
254 lines
11 KiB
Markdown
|
---
|
||
|
geometry: margin=10mm
|
||
|
author: Felix Albrigtsen
|
||
|
...
|
||
|
|
||
|
## Oppgave 1
|
||
|
### a) Lag en SQL-spørring som utfører operasjonene seleksjon og projeksjon på tabellen Bok.
|
||
|
Seleksjon:
|
||
|
`SELECT * FROM bok WHERE bok.tittel = 'Victorie'`
|
||
|
|
||
|
|
||
|
|
||
|
Begge:
|
||
|
`SELECT tittel,utgitt_aar FROM bok;`
|
||
|
|
||
|
Eksempel-resultat:
|
||
|
```
|
||
|
MariaDB [oving2]> SELECT tittel,utgitt_aar FROM bok;
|
||
|
+--------------------+------------+
|
||
|
| tittel | utgitt_aar |
|
||
|
+--------------------+------------+
|
||
|
| Tåpenes | 1995 |
|
||
|
| Rebecca | 1981 |
|
||
|
| Gutter er gutter | 1995 |
|
||
|
| Microserfs | 1991 |
|
||
|
| Generation X | 1995 |
|
||
|
...
|
||
|
```
|
||
|
|
||
|
### b) Lag en SQL-spørring som utfører operasjonen produkt på tabellene Forlag og Bok. Beskriv resultatet med egne ord.
|
||
|
|
||
|
`SELECT * FROM forlag,bok;`
|
||
|
|
||
|
Eksempel-resultat:
|
||
|
```
|
||
|
MariaDB [oving2]> SELECT * FROM forlag,bok;
|
||
|
+-----------+----------------+-----------+----------+--------+---------+------------+-----------+
|
||
|
| forlag_id | forlag_navn | adresse | telefon | bok_id | tittel | utgitt_aar | forlag_id |
|
||
|
+-----------+----------------+-----------+----------+--------+---------+------------+-----------+
|
||
|
| 1 | Tapir | Trondheim | 73590000 | 1 | Tåpenes | 1995 | 7 |
|
||
|
| 2 | Gyldendal | Oslo | 22220000 | 1 | Tåpenes | 1995 | 7 |
|
||
|
| 3 | Cappelen | Oslo | 22200000 | 1 | Tåpenes | 1995 | 7 |
|
||
|
|
||
|
...
|
||
|
```
|
||
|
|
||
|
Her ser vi et produkt av forlag og bok, som et kryssprodukt. Resultatet er alle kombinasjoner/permutasjoner som er mulig. Som vi ser i tabellutdraget over gir ikke dette eksempelet så mye mening siden det viser alle bøker med alle forlag. Denne tabellen blir både lengre og bredere enn tabellene var til å begynne med, siden det må vise mange kombinasjoner med mange felter.
|
||
|
|
||
|
Om vi derimot bruker WHERE-selektorer, kan vi hente ut nyttig data med produktet.
|
||
|
|
||
|
### c) Lag SQL-spørringer som utfører operasjonene likhetsforening (equijoin) og naturlig forening(natural join) på tabellene Forlag og Bok. Hva forteller resultatet?
|
||
|
|
||
|
Spesifisert equijoin:
|
||
|
`SELECT * FROM forlag JOIN bok ON forlag.forlag_id = bok.forlag_id;`
|
||
|
```
|
||
|
MariaDB [oving2]> SELECT * FROM forlag JOIN bok ON forlag.forlag_id = bok.forlag_id;
|
||
|
+-----------+---------------+---------+----------+--------+------------------+------------+----------+
|
||
|
| forlag_id | forlag_navn | adresse | telefon | bok_id | tittel | utgitt_aar |forlag_id |
|
||
|
+-----------+---------------+---------+----------+--------+------------------+------------+----------+
|
||
|
| 7 | Tiden | Oslo | 22232223 | 1 | Tåpenes | 1995 | 7 |
|
||
|
| 3 | Cappelen | Oslo | 22200000 | 2 | Rebecca | 1981 | 3 |
|
||
|
| 5 | Aschehaug | Oslo | 22000000 | 3 | Gutter er gutter | 1995 | 5 |
|
||
|
| 8 | Harper Collins| USA | NULL | 4 | Microserfs | 1991 | 8 |
|
||
|
| 8 | Harper Collins| USA | NULL | 5 | Generation X | 1995 | 8 |
|
||
|
...
|
||
|
```
|
||
|
|
||
|
Naturlig forening:
|
||
|
`SELECT * FROM forlag NATURAL JOIN bok;`
|
||
|
```
|
||
|
+-----------+----------------+---------+----------+--------+--------------------+------------+
|
||
|
| forlag_id | forlag_navn | adresse | telefon | bok_id | tittel | utgitt_aar |
|
||
|
+-----------+----------------+---------+----------+--------+--------------------+------------+
|
||
|
| 7 | Tiden | Oslo | 22232223 | 1 | Tåpenes | 1995 |
|
||
|
| 3 | Cappelen | Oslo | 22200000 | 2 | Rebecca | 1981 |
|
||
|
| 5 | Aschehaug | Oslo | 22000000 | 3 | Gutter er gutter | 1995 |
|
||
|
| 8 | Harper Collins | USA | NULL | 4 | Microserfs | 1991 |
|
||
|
| 8 | Harper Collins | USA | NULL | 5 | Generation X | 1995 |
|
||
|
|
||
|
```
|
||
|
|
||
|
De to tabellene er like, med unntak av at NATURAL JOIN ikke tar med begge tilfeller av `forlag_id`, da disse to er like. NATURAL JOIN bruker navnet på feltene for å avgjøre likheten.
|
||
|
|
||
|
Alle våre bøker har en forlag_id(ingen er NULL), altså kommer alle med. Dersom vi hadde tomme felter i dette feltet ville de ikke blitt med i disse foreningene.
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
## d) Finn eksempler på attributter eller kombinasjoner av attributter som er unionkompatible. Hvilke relasjonsoperasjoner krever at operandene er unionkompatible? Sett opp SQL-spørringer som utfører disse operasjonene, et eksempel på hver. Beskriv med egne ord hva spørringene gir deg svaret på.
|
||
|
|
||
|
|
||
|
Skjemaene i de to tabellene må være tilsvarende i lengde og datatyper. For å kombinere de to må kolonenne ordnes i samme rekkefølge.
|
||
|
|
||
|
|
||
|
Her slår vi sammen to varchar-attributter med union.
|
||
|
```sql
|
||
|
MariaDB [oving2]> SELECT nasjonalitet FROM forfatter UNION SELECT adresse FROM forlag;
|
||
|
+--------------+
|
||
|
| nasjonalitet |
|
||
|
+--------------+
|
||
|
| USA |
|
||
|
| Britisk |
|
||
|
| Portugisisk |
|
||
|
| Canadisk |
|
||
|
| Norsk |
|
||
|
| Svensk |
|
||
|
| Trondheim |
|
||
|
| Oslo |
|
||
|
+--------------+
|
||
|
8 rows in set (0.001 sec)
|
||
|
```
|
||
|
Resultatet viser oss alle nasjonaliteter og alle adresser som hører til henholdsvis en forfatter eller forlag.
|
||
|
|
||
|
|
||
|
Her slår vi sammen det samme atributtet(forlag_navn) fra forlag med adresse Trondheim og fra forlag uten telefonnummer.
|
||
|
|
||
|
```sql
|
||
|
MariaDB [oving2]> SELECT forlag_navn FROM forlag WHERE telefon IS NULL UNION SELECT forlag_navn FROM forlag WHERE adresse = 'Trondheim';
|
||
|
+----------------+
|
||
|
| forlag_navn |
|
||
|
+----------------+
|
||
|
| Harper Collins |
|
||
|
| Tapir |
|
||
|
+----------------+
|
||
|
2 rows in set (0.001 sec)
|
||
|
```
|
||
|
|
||
|
|
||
|
|
||
|
# Oppgave 2
|
||
|
## a) Bruk SQL til å finne navnene til alle forlagene. Hvilken eller hvilke operasjoner fra relasjonsalgebraen brukte du?
|
||
|
```sql
|
||
|
MariaDB [oving2]> SELECT forlag_navn FROM forlag;
|
||
|
+----------------------+
|
||
|
| forlag_navn |
|
||
|
+----------------------+
|
||
|
| Tapir |
|
||
|
| Gyldendal |
|
||
|
| Cappelen |
|
||
|
| Universitetsforlaget |
|
||
|
| Aschehaug |
|
||
|
| Oktober |
|
||
|
| Tiden |
|
||
|
| Harper Collins |
|
||
|
+----------------------+
|
||
|
8 rows in set (0.001 sec)
|
||
|
```
|
||
|
Brukt seleksjon.
|
||
|
|
||
|
## b) Bruk SQL til å finne eventuelle forlag (forlag_id er nok) som ikke har gitt ut bøker. Hvilken eller hvilke operasjoner fra relasjonsalgebraen brukte du?
|
||
|
|
||
|
```sql
|
||
|
MariaDB [oving2]> SELECT forlag_id FROM forlag WHERE forlag_id NOT IN (SELECT forlag_id FROM bok);
|
||
|
+-----------+
|
||
|
| forlag_id |
|
||
|
+-----------+
|
||
|
| 1 |
|
||
|
| 4 |
|
||
|
| 6 |
|
||
|
+-----------+
|
||
|
3 rows in set (0.014 sec)
|
||
|
```
|
||
|
|
||
|
Brukt seleksjon og projeksjon.
|
||
|
|
||
|
## c) Bruk SQL til å finne forfattere som er født i 1948. Hvilken eller hvilke operasjoner fra relasjonsalgebraen brukte du?
|
||
|
```sql
|
||
|
MariaDB [oving2]> SELECT * FROM forfatter WHERE fode_aar = 1948;
|
||
|
+--------------+---------+-----------+----------+---------+--------------+
|
||
|
| forfatter_id | fornavn | etternavn | fode_aar | dod_aar | nasjonalitet |
|
||
|
+--------------+---------+-----------+----------+---------+--------------+
|
||
|
| 8 | Henning | Mankell | 1948 | NULL | Svensk |
|
||
|
+--------------+---------+-----------+----------+---------+--------------+
|
||
|
1 row in set (0.001 sec)
|
||
|
|
||
|
```
|
||
|
Brukt seleksjon
|
||
|
|
||
|
## d) Bruk SQL til å finne navn og adresse til forlaget som har gitt ut boka 'Generation X'. Hvilken eller hvilke operasjoner fra relasjonsalgebraen brukte du?
|
||
|
|
||
|
```sql
|
||
|
MariaDB [oving2]> SELECT forlag_navn,adresse FROM forlag NATURAL JOIN bok WHERE tittel = "Generation X";
|
||
|
+----------------+---------+
|
||
|
| forlag_navn | adresse |
|
||
|
+----------------+---------+
|
||
|
| Harper Collins | USA |
|
||
|
+----------------+---------+
|
||
|
1 row in set (0.001 sec)
|
||
|
```
|
||
|
|
||
|
Brukt seleksjon og naturlig forening.
|
||
|
|
||
|
## e) Bruk SQL til å finne titlene på bøkene som Hamsun har skrevet. Hvilken eller hvilke operasjoner fra relasjonsalgebraen brukte du?
|
||
|
|
||
|
```sql
|
||
|
MariaDB [oving2]> SELECT b.tittel FROM bok b,bok_forfatter bf,forfatter f WHERE bf.forfatter_id = f.forfatter_id AND f.etternavn = 'Hamsund' AND bf.bok_id = b.bok_id;
|
||
|
+----------------+
|
||
|
| tittel |
|
||
|
+----------------+
|
||
|
| Markens grøde |
|
||
|
| Victoria |
|
||
|
| Sult |
|
||
|
+----------------+
|
||
|
3 rows in set (0.001 sec)
|
||
|
```
|
||
|
|
||
|
Brukt seleksjon og projeksjon
|
||
|
|
||
|
## f) Bruk SQL til å finne informasjon om bøker og forlagene som har utgitt dem. Én linje i oversikten skal inneholde bokas tittel og utgivelsesår, samt forlagets navn, adresse og telefonnummer. Forlag som ikke har gitt ut noen bøker skal også med i listen. Hvilken eller hvilke operasjoner fra relasjonsalgebraen brukte du?
|
||
|
|
||
|
Formatting:
|
||
|
SELECT b.tittel,b.utgitt_aar,f.forlag_navn,f.adresse FROM bok b,forlag f;
|
||
|
|
||
|
Selection:
|
||
|
SELECT * FROM forlag f LEFT JOIN bok b ON b.forlag_id = f.forlag_id;
|
||
|
|
||
|
|
||
|
```sql
|
||
|
MariaDB [oving2]> SELECT b.tittel,b.utgitt_aar,f.forlag_navn,f.adresse,f.telefon FROM forlag f LEFT JOIN bok b ON b.forlag_id = f.forlag_id;
|
||
|
+--------------------+------------+----------------------+-----------+----------+
|
||
|
| tittel | utgitt_aar | forlag_navn | adresse | telefon |
|
||
|
+--------------------+------------+----------------------+-----------+----------+
|
||
|
| Tåpenes | 1995 | Tiden | Oslo | 22232223 |
|
||
|
| Rebecca | 1981 | Cappelen | Oslo | 22200000 |
|
||
|
| Gutter er gutter | 1995 | Aschehaug | Oslo | 22000000 |
|
||
|
| Microserfs | 1991 | Harper Collins | USA | NULL |
|
||
|
| Generation X | 1995 | Harper Collins | USA | NULL |
|
||
|
| Klosterkrønike | 1982 | Cappelen | Oslo | 22200000 |
|
||
|
| Universet | 1988 | Cappelen | Oslo | 22200000 |
|
||
|
| Nålen | 1978 | Cappelen | Oslo | 22200000 |
|
||
|
| Markens grøde | 1917 | Gyldendal | Oslo | 22220000 |
|
||
|
| Victoria | 1898 | Gyldendal | Oslo | 22220000 |
|
||
|
| Sult | 1890 | Gyldendal | Oslo | 22220000 |
|
||
|
| Benoni | 1908 | Gyldendal | Oslo | 22220000 |
|
||
|
| Rosa | 1908 | Gyldendal | Oslo | 22220000 |
|
||
|
| Et skritt | 1997 | Gyldendal | Oslo | 22220000 |
|
||
|
| Den femte | 1996 | Gyldendal | Oslo | 22220000 |
|
||
|
| Villspor | 1995 | Gyldendal | Oslo | 22220000 |
|
||
|
| Silkeridderen | 1994 | Gyldendal | Oslo | 22220000 |
|
||
|
| Den hvite hingsten | 1992 | Gyldendal | Oslo | 22220000 |
|
||
|
| Hunder | 1992 | Gyldendal | Oslo | 22220000 |
|
||
|
| Bridget Jones | 1995 | Aschehaug | Oslo | 22000000 |
|
||
|
| Se terapeuten | 1998 | Cappelen | Oslo | 22200000 |
|
||
|
| Sa mor | 1996 | Cappelen | Oslo | 22200000 |
|
||
|
| Jubel | 1995 | Cappelen | Oslo | 22200000 |
|
||
|
| Tatt av kvinnen | 1993 | Cappelen | Oslo | 22200000 |
|
||
|
| Supernaiv | 1996 | Cappelen | Oslo | 22200000 |
|
||
|
| NULL | NULL | Tapir | Trondheim | 73590000 |
|
||
|
| NULL | NULL | Universitetsforlaget | Oslo | 23230000 |
|
||
|
| NULL | NULL | Oktober | Oslo | 22002200 |
|
||
|
+--------------------+------------+----------------------+-----------+----------+
|
||
|
```
|
||
|
|
||
|
Brukt: seleksjon, produkt, outer join
|