diff --git a/ov6/demodata.sql b/ov6/demodata.sql new file mode 100644 index 0000000..ce98cae --- /dev/null +++ b/ov6/demodata.sql @@ -0,0 +1,27 @@ +INSERT INTO bedrift(orgnummer, navn, epost, telefon) VALUES (100, "Bjarnes Butikk", "bb@gmail.com", "12345670"); +INSERT INTO bedrift(orgnummer, navn, epost, telefon) VALUES (200, "Vidars Verksted", "vv@gmail.com", "12345671"); +INSERT INTO bedrift(orgnummer, navn, epost, telefon) VALUES (300, "Arnes Arkivtjenester", "aa@gmail.com", "12345672"); + +INSERT INTO kandidat(telefon, epost, fornavn, etternavn) VALUES ("12345678", "k_a@gmail.com", "Kari", "Aas"); +INSERT INTO kandidat(telefon, epost, fornavn, etternavn) VALUES ("12345679", "a_b@gmail.com", "Anne", "Berg"); +INSERT INTO kandidat(telefon, epost, fornavn, etternavn) VALUES ("12345680", "g_s@gmail.com", "Gunnar", "Svendsen"); +INSERT INTO kandidat(telefon, epost, fornavn, etternavn) VALUES ("12345681", "s_w@gmail.com", "Svein", "Wold"); +INSERT INTO kandidat(telefon, epost, fornavn, etternavn) VALUES ("12345682", "h_j@gmail.com", "Hans", "Jensen"); + +INSERT INTO kandidatkvalifikasjon(telefon, kvalifikasjon) VALUES ("12345678", "Kundeservice"); +INSERT INTO kandidatkvalifikasjon(telefon, kvalifikasjon) VALUES ("12345678", "Kasse"); +INSERT INTO kandidatkvalifikasjon(telefon, kvalifikasjon) VALUES ("12345679", "Kundeservice"); +INSERT INTO kandidatkvalifikasjon(telefon, kvalifikasjon) VALUES ("12345679", "Kasse"); +INSERT INTO kandidatkvalifikasjon(telefon, kvalifikasjon) VALUES ("12345680", "Excel"); +INSERT INTO kandidatkvalifikasjon(telefon, kvalifikasjon) VALUES ("12345680", "Word"); +INSERT INTO kandidatkvalifikasjon(telefon, kvalifikasjon) VALUES ("12345681", "Excel"); +INSERT INTO kandidatkvalifikasjon(telefon, kvalifikasjon) VALUES ("12345681", "Word"); + +INSERT INTO oppdrag(orgnummer, kvalifikasjon, starttid, slutttid) VALUES (100, "Kundeservice", DATE("2023-01-01"), DATE("2023-01-31")); +INSERT INTO oppdrag(orgnummer, kvalifikasjon, starttid, slutttid) VALUES (300, "Kasse", DATE("2023-02-01"), DATE("2023-02-28")); +INSERT INTO oppdrag(orgnummer, kvalifikasjon, starttid, slutttid) VALUES (300, "Excel", DATE("2023-03-01"), DATE("2023-03-31")); +INSERT INTO oppdrag(orgnummer, kvalifikasjon, starttid, slutttid) VALUES (300, "Word", DATE("2023-04-01"), DATE("2023-04-30")); + +INSERT INTO jobbhistorikk(oppdrag_id, kandidat_tlf, starttid, slutttid, arbeidstimer) VALUES (1, "12345678", DATE("2022-01-01"), DATE("2022-01-31"), 160); +INSERT INTO jobbhistorikk(oppdrag_id, kandidat_tlf, starttid, slutttid, arbeidstimer) VALUES (2, "12345679", DATE("2022-02-01"), DATE("2022-02-24"), 140); +INSERT INTO jobbhistorikk(oppdrag_id, kandidat_tlf, starttid, slutttid, arbeidstimer) VALUES (3, "12345680", DATE("2022-03-01"), DATE("2022-03-16"), 160); diff --git a/ov6/er_modell.png b/ov6/er_modell.png index 4746aae..99164be 100644 Binary files a/ov6/er_modell.png and b/ov6/er_modell.png differ diff --git a/ov6/er_modell.puml b/ov6/er_modell.puml index 1e70d69..2fa36d6 100644 --- a/ov6/er_modell.puml +++ b/ov6/er_modell.puml @@ -13,7 +13,7 @@ entity "Kandidat" as k { entity "KandidatKvalifikasjon" as kk { kandidat_id {PK} : Integer -- - kvalifikasjon : String + kvalifikasjon {PK} : String } entity "Bedrift" as b { diff --git a/ov6/losning.md b/ov6/losning.md index f20005e..355ac13 100644 --- a/ov6/losning.md +++ b/ov6/losning.md @@ -3,5 +3,156 @@ geometry: margin=30mm author: Felix Albrigtsen ... -# Øving +# Ø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 | ++----------+--------------+------------+------------+----------------+ +``` diff --git a/ov6/losning.pdf b/ov6/losning.pdf new file mode 100644 index 0000000..d9b65e8 Binary files /dev/null and b/ov6/losning.pdf differ diff --git a/ov6/oppg_a.png b/ov6/oppg_a.png deleted file mode 120000 index 5c00560..0000000 --- a/ov6/oppg_a.png +++ /dev/null @@ -1 +0,0 @@ -er_modell.png \ No newline at end of file diff --git a/ov6/vikar.sql b/ov6/vikar.sql new file mode 100644 index 0000000..a15143c --- /dev/null +++ b/ov6/vikar.sql @@ -0,0 +1,63 @@ +DROP TABLE IF EXISTS sluttatest; +DROP TABLE IF EXISTS jobbhistorikk; +DROP TABLE IF EXISTS oppdrag; +DROP TABLE IF EXISTS kandidatkvalifikasjon; +DROP TABLE IF EXISTS kandidat; +DROP TABLE IF EXISTS bedrift; + +CREATE TABLE bedrift +( +orgnummer INT UNSIGNED NOT NULL AUTO_INCREMENT, +navn VARCHAR(30), +epost VARCHAR(100), +telefon CHAR(15), +PRIMARY KEY(orgnummer) +); + +CREATE TABLE kandidat +( +telefon CHAR(15) NOT NULL, +epost VARCHAR(100), +fornavn VARCHAR(30), +etternavn VARCHAR(30), +PRIMARY KEY(telefon) +); + +CREATE TABLE kandidatkvalifikasjon +( +telefon CHAR(15) NOT NULL, +kvalifikasjon VARCHAR(100), +PRIMARY KEY(telefon, kvalifikasjon), +FOREIGN KEY(telefon) REFERENCES kandidat(telefon) +); + +CREATE TABLE oppdrag +( +oppdrag_id INT UNSIGNED NOT NULL AUTO_INCREMENT, +orgnummer INT UNSIGNED, +kvalifikasjon VARCHAR(30), +starttid DATE, +slutttid DATE, +PRIMARY KEY(oppdrag_id), +FOREIGN KEY(orgnummer) REFERENCES bedrift(orgnummer) +); + +CREATE TABLE jobbhistorikk +( +oppdrag_id INT UNSIGNED NOT NULL, +kandidat_tlf CHAR(15) NOT NULL, +starttid DATE, +slutttid DATE, +arbeidstimer INT UNSIGNED, +PRIMARY KEY(oppdrag_id), +FOREIGN KEY(oppdrag_id) REFERENCES oppdrag(oppdrag_id), +FOREIGN KEY(kandidat_tlf) REFERENCES kandidat(telefon) +); + +CREATE TABLE sluttatest +( +oppdrag_id INT UNSIGNED NOT NULL, +attest TEXT, +PRIMARY KEY(oppdrag_id), +FOREIGN KEY(oppdrag_id) REFERENCES jobbhistorikk(oppdrag_id) +);