--- 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 | +----------+--------------+------------+------------+----------------+ ```