---
geometry: margin=30mm
author: Felix Albrigtsen
...
# Øving 6
## Oppgave a
### Lag en datamodell (ER-modell der dere bruker UML-notasjon)
![ER-Modell](er_modell.png)
## Oppgave b
### Oversett til relasjonsmodellen
> kandidat(telefon\*, fornavn, etternavn, epost)
> kandidatkvalifikasjon(kandidat\_id*,kvalifikasjon*)
> bedrift(orgnummer\*, navn, epost, telefon)
> oppdrag(oppdrag\_id\*, orgnummer, kvalifikasjon, starttid, sluttid)
> jobbhistorikk(oppdrag\_id\*, kandidat tlf, starttid, sluttid, arbeidstimer)
> sluttatest(oppdrag_id\*, attest)
### Er det rimelig at noen av fremmednøklene kan være NULL? Hva betyr det i tilfelle?
Jeg bruker fire fremmednøkler i besvarelsen.
- oppdrag.orgnummer kan ikke være NULL, da alle jobber må høre til en bedrift.
- jobbhistorikk.oppdrag\_id kan ikke være NULL, da man ikke kan ha jobbet om det ikke fantes et oppdrag.
- jobbhistorikk.kandidat\_tlf kan ikke være NULL, da et oppdrag ikke kan være utført om det ikke gjøres av en kandidat.
- sluttatest.oppdrag\_id kan ikke være NULL, da man ikke kan skrive attest til en jobb som ikke er utført.
## Oppgave c
### Opprett databasetabellene med primær-og fremmednøkleri MySQL, dvs. lag CREATE TABLE og evt. ALTER TABLE-setninger. (Prøv å) bruk datatypen DATE for dato.
SQL-setningene finnes i [vikar.sql](./vikar.sql)
## Oppgave d
### Lag en liste over alle bedriftene. Navn, telefon og epost til bedriften skal skrives ut.
```sql
SELECT navn, epost, telefon
FROM bedrift;
```
```sql
MariaDB [idatt2103_ov6]> SELECT navn, epost, telefon FROM bedrift;
+----------------------+--------------+----------+
| navn | epost | telefon |
+----------------------+--------------+----------+
| Bjarnes Butikk | bb@gmail.com | 12345670 |
| Vidars Verksted | vv@gmail.com | 12345671 |
| Arnes Arkivtjenester | aa@gmail.com | 12345672 |
+----------------------+--------------+----------+
```
### Lag en liste over alle oppdragene. Om hvert oppdrag skal du skrive ut oppdragets nummer samt navn og telefonnummer til bedriften som tilbyr oppdraget.
```sql
SELECT oppdrag_id, navn, telefon, epost
FROM oppdrag
LEFT JOIN bedrift
ON oppdrag.orgnummer = bedrift.orgnummer;
```
```sql
MariaDB [idatt2103_ov6]> SELECT oppdrag_id, navn, telefon, epost FROM oppdrag LEFT JOIN bedrift ON oppdrag.orgnummer = bedrift.orgnummer;
+------------+----------------------+----------+--------------+
| oppdrag_id | navn | telefon | epost |
+------------+----------------------+----------+--------------+
| 1 | Bjarnes Butikk | 12345670 | bb@gmail.com |
| 2 | Arnes Arkivtjenester | 12345672 | aa@gmail.com |
| 3 | Arnes Arkivtjenester | 12345672 | aa@gmail.com |
| 4 | Arnes Arkivtjenester | 12345672 | aa@gmail.com |
+------------+----------------------+----------+--------------+
```
### Lag en liste over kandidater og kvalifikasjoner. Kandidatnavn og kvalifikasjonsbeskrivelse skal med i utskriften i tillegg til løpenumrene som identifiserer kandidat og kvalifikasjon.
Jeg har ikke brukt noen løpenummer, da ingen kandidater kan ha samme telefonnummer, og telefon+kvalifikasjon er tilstrekkelig primærnøkkel.
```sql
SELECT k.telefon, CONCAT (k.fornavn, ' ', k.etternavn) AS navn, kvalifikasjon
FROM kandidat k
RIGHT JOIN kandidatkvalifikasjon kk
ON k.telefon = kk.telefon;
```
```sql
MariaDB [idatt2103_ov6]> SELECT k.telefon, CONCAT (k.fornavn, ' ', k.etternavn) AS navn, kvalifikasjon FROM kandidat k RIGHT JOIN kandidatkvalifikasjon kk ON k.telefon = kk.telefon;
+----------+-----------------+---------------+
| telefon | navn | kvalifikasjon |
+----------+-----------------+---------------+
| 12345678 | Kari Aas | Kasse |
| 12345678 | Kari Aas | Kundeservice |
| 12345679 | Anne Berg | Kasse |
| 12345679 | Anne Berg | Kundeservice |
| 12345680 | Gunnar Svendsen | Excel |
| 12345680 | Gunnar Svendsen | Word |
| 12345681 | Svein Wold | Excel |
| 12345681 | Svein Wold | Word |
+----------+-----------------+---------------+
```
### Som oppgave 3d), men få med de kandidatene som ikke er registrert med kvalifikasjoner.
```sql
SELECT k.telefon, CONCAT (k.fornavn, ' ', k.etternavn) AS navn, kvalifikasjon
FROM kandidat k
LEFT JOIN kandidatkvalifikasjon kk
ON k.telefon = kk.telefon;
```
```sql
MariaDB [idatt2103_ov6]> SELECT k.telefon, CONCAT (k.fornavn, ' ', k.etternavn) AS navn, kvalifikasjon FROM kandidat k LEFT JOIN kandidatkvalifikasjon kk ON k.telefon = kk.telefon;
+----------+-----------------+---------------+
| telefon | navn | kvalifikasjon |
+----------+-----------------+---------------+
| 12345678 | Kari Aas | Kasse |
| 12345678 | Kari Aas | Kundeservice |
| 12345679 | Anne Berg | Kasse |
| 12345679 | Anne Berg | Kundeservice |
| 12345680 | Gunnar Svendsen | Excel |
| 12345680 | Gunnar Svendsen | Word |
| 12345681 | Svein Wold | Excel |
| 12345681 | Svein Wold | Word |
| 12345682 | Hans Jensen | NULL |
+----------+-----------------+---------------+
```
### Skriv ut jobbhistorikken til en bestemt vikar, gitt kandidatnr. Vikarnavn, sluttdato, oppdragsnr og bedriftsnavn skal med.
```sql
SELECT k.telefon, CONCAT(k.fornavn, ' ', k.etternavn) as kandidatnavn, j.slutttid, j.oppdrag_id, b.navn
FROM jobbhistorikk j
LEFT JOIN oppdrag o
ON j.oppdrag_id = o.oppdrag_id
LEFT JOIN bedrift b
ON o.orgnummer = b.orgnummer
LEFT JOIN kandidat k
ON j.kandidat_tlf = k.telefon
WHERE kandidat_tlf = 12345678;
```
```sql
MariaDB [idatt2103_ov6]> SELECT k.telefon, CONCAT(k.fornavn, ' ', k.etternavn) as kandidatnavn, j.slutttid, j.oppdrag_id, b.navn FROM jobbhistorikk j LEFT JOIN oppdrag o ON j.oppdrag_id = o.oppdrag_id LEFT JOIN bedrift b ON o.orgnummer = b.orgnummer LEFT JOIN kandidat k ON j.kandidat_tlf = k.telefon WHERE kandidat_tlf = 12345678;
+----------+--------------+------------+------------+----------------+
| telefon | kandidatnavn | slutttid | oppdrag_id | navn |
+----------+--------------+------------+------------+----------------+
| 12345678 | Kari Aas | 2022-01-31 | 1 | Bjarnes Butikk |
+----------+--------------+------------+------------+----------------+
```