Løsningsforlag for oblig 2, databaser 2010



Like dokumenter
Løsningsforlag for oblig 1, databaser 2010

Øvingsoppgave uke 3. Fanger i fengsel

Metaspråket for å beskrive grammatikk

SELECT DISTINCT Fornavn, Etternavn, Programtittel FROM Program P, Medvirkende M, Deltagelse D. SELECT Tilgjengelighet FROM Program

SQL 3: Opprette tabeller, datainnsetting og utsnitt

Oppgave 1 1. Spørring: Resultattabell: 2. Spørring: Resultattabell: 3. Spørring:

Institutt for datateknikk. Fag TDT4145 Datamodellering og databasesystemer Løsningsforslag til øving 3: Algebra og SQL

Repetisjon: Normalformer og SQL

Miniverden og ER- modell

Oblig 2 Databaser vår 2011

1. SQL datadefinisjon og manipulering

Høgskolen i Telemark EKSAMEN 6102 DATABASER Tid: Hjelpemidler: Vedlegg: Eksempeldata til oppgave 1

Databaser. Relasjonsmodellen 2 Læreboka: Kap. 2 Relasjonsmodellen

Sensorveiledning for IN2090 og INF desember :30 18:30 (4 timer)

Systemutvikling fra kjernen og ut, fra skallet og inn

Løsningsforslag til eksamen i IN2090 Databaser og datamodellering og INF1300 Introduksjon til databaser 6. desember :30 18:30 (4 timer)

Oppgaver Oppgave a: Sett opp mulige relasjoner

En liten rekap. Spørrespråk. I dag SELECT

1. SQL spørringer mot flere tabeller

Oppgave 1 (Opprett en database og en tabell)

Datamodellering og databaser SQL, del 2

Tabeller og enkle spørringer

Datamodellering og databaser SQL, del 2

Datamodellering og databaser SQL, del 2

Norge tekst 2. Oppgaver. Arbeid med ord læremidler A/S, Astrid Brennhagen

Tilkobling og Triggere

HØGSKOLEN I SØR-TRØNDELAG

Oblig 1 Databaser vår 2011

Fag TDT4145 Datamodellering og databasesystemer Løsningsforslag til øving 3: Algebra og SQL

*** Spm. 1 *** Hvor mange elever er det på den skolen du jobber på?

18th - 20th June 2010

Databaser. Relasjonsmodellen 1 Læreboka: Kap. 2 Relasjonsmodellen Faglærere: Tore Mallaug, Kjell Toft Hansen

HØGSKOLEN I SØR-TRØNDELAG

infotorg Enkel brukermanual

Databaser kort intro. Tom Heine Nätt

EKSAMEN 6102 / 6102N DATABASER

Avansert bruk av SQL. Avanserte spørringer Valguttrykk Spørring på spørring Unionspørringer Delspørringer, vekselvirkende delspørringer Kvantorer

Å bruke Java API-et til å sortere tabeller/arraylister der elementene er (referanser til) objekter

Delinnlevering 2. INF1050, våren Inge Svale Hauger Handagard (ishandag) Tor Hildrum (thildru)

Integritetsregler i SQL. Primærnøkler

Integritetsregler i SQL

Relasjoner terminologi. Kopi av lysark fra forelesningen 13. oktober. Legges ut inntil notatet som samler alt om SQL kommer...

Dagens program. Kunnskapsorganisasjon og gjenfinning 1. Spørring mot databaser: SQL 2 - Spørring mot flere tabeller

Oblig 3 Databaser vår 2011

24th FIG TRA WAGC - Draw of Lots

Løsningsskisse til Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

Dette er vår første obligatoriske oppgave i kurset Moderne Databaseteknologi.

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

En lett innføring i foreninger (JOINs) i SQL

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet. Løsningsforslag

IN2090 Databaser og datamodellering. 08 Typer og skranker

SQL, del 1 - select. Hva er SQL?

Objektorientering i ER-modeller EER-modeller Enhanced Entity Relationship Models

IN2090 Databaser og datamodellering. 08 Typer og skranker

Prosedyrer. Lars Vidar Magnusson. October 26, Lars Vidar Magnusson () Forelesning i DAS October 26, / 19

UNIVERSITETET I OSLO SQL. Structured Query Language. (forts.) Institutt for Informatikk. INF Ragnar Normann 1

SQL SELECT-FROM-WHERE. Skjemadefinisjon og datainnsetting i SQL. Semantikk bak ein-relasjons-spørring

SQL Structured Query Language. Definere tabeller Skranker Fylle tabeller med data

Eksamensoppgave i TDT4145 Datamodellering og databasesystemer

Fag TDT4145 Datamodellering og databasesystemer Øving 3: Relasjonsalgebra og SQL

ARBEIDS- OG VELFERDSDIREKTORATET / STATISTIKKSEKSJONEN

Integritetsregler i SQL

Rapport om lokal brukerundersøkelse høsten 2014 ved NAV Ås

Indre select-setninger Nestede select-setninger

UNIVERSITETET I OSLO SQL. Structured Query Language. (The intergalactic dataspeak) Institutt for Informatikk. INF Ragnar Normann 1

Videregående programmering 6

Databaser: Relasjonsmodellen, del I

Utvikling fra kjernen og ut

Hvor mange blir vi egentlig? Astri Syse Forskningsavdelingen

Rapport om. lokal brukerundersøkelse høsten 2015 ved NAV Malvik

INFORMASJON OM STRAFFEGJENNOMFØRING MED ELEKTRONISK KONTROLL - RUNE LEANDER HANSEN FØDT

Databasers typesystem. IN2090 Databaser og datamodellering. 08 Typer og skranker. SQL-standarden vs. RDBMSer. Hvilke datatyper har vi

MySQL-database, php. Innhold. 8 MySQL-database, php. 8.1 Databasen MySQL

Eksamen i IBE102 Webutvikling Våren 2017.

Alle attributter har NULL som mulig verdi. mulige verdier for integer: NULL, 0, 1, 2, 3...

EKSAMEN. Kontroller at oppgavesettet er komplett før du begynner å besvare spørsmålene.

Spør hvilken: Bygning Etasje By Fylke Land Skår 0-5

SQL, del 1 - select. Hva er SQL?

Om tabellene. Januar - februar 2019

Personer med nedsatt arbeidsevne. Fylke og alder. Tidsserie måned

Om tabellene. Januar - mars 2019

Personer med nedsatt arbeidsevne. Fylke og alder. Tidsserie måned

Personer med nedsatt arbeidsevne. Fylke og alder. Tidsserie måned

Personer med nedsatt arbeidsevne. Fylke og alder. Tidsserie måned

Om tabellene. Januar - mars 2018

1. Innføring i bruk av MySQL Query Browser

LC238D Datamodellering og databaser SQL, del 1 - SELECT

HØGSKOLEN I SØR-TRØNDELAG

Om tabellene. Januar - desember 2018

Løsningsforslag maskindatabasen på Ifi SQL og normalisering

Styringsdata for fastlegeordningen, 1. kvartal 2008 Skrevet av Jon Petter Nossen, 23. april 2008

Introduksjon til beslutningsstrukturer

Oppgave: Finn navn og tittel på alle som har arbeidet på prosjektet «Vintersalg»

ARBEIDS- OG VELFERDSDIREKTORATET STYRINGSDATA FOR FASTLEGEORDNINGEN, 4. KVARTAL 2006

while-økker while-løkker gjentar instruksjonene så lenge en betingelse er oppfylt Eksempel 1: en enkel while-løkke

Flere føder flere. Trude Lappegård

SQL: Datatyper m.m. Evgenij Thorstensen V18. Evgenij Thorstensen SQL: Datatyper m.m. V18 1 / 12

HØGSKOLEN I SØR-TRØNDELAG

EKSAMEN (Konvertert fra en gammel PHP-eksamen)

Romlig datamanipulering

Transkript:

Løsningsforlag for oblig 2, databaser 2010 Oppgave 1 a) Det kan være flere hytteeiere med samme navn, så dette vil ikke være være noen god identifikator for hytteeiere. Kombinasjon eier og hjemadresse er heller ingen god nøkkel. Brudd på 1NF: hyttefeltadresse består av flere typer informasjon. Denne kan deles opp på 2 måter: 1) (hyttefeltgatenavn, hyttefeltgatenr, hyttefeltpostnr, hyttefeltpoststed) 2) (hyttefeltadresse, hyttefeltpostnr, hyttefeltpoststed) hytteinfo består av flere typer informasjon. Denne kan deles opp slik 1) (hytteinfoantsengepl, hytteinfostrom, hytteinfovann) hjemadresse består av flere typer informasjon og kan deles opp på samme måte som hyttefeltadresse eiernavn kan evt deles opp i (eierfornavn, eieretternavn) hvis man ønsker hyttefeltnavn hyttefeltadresse hyttefelt Postnr hyttefeltpost sted hyttenr hytteinfoant Sengepl hytteinfo Strom hytteinfo Vann eierid eiernavn hjemadresse hjempostnr hjempoststed mobilnr 'Solsiden' 'Kjelleråsen' 1111 'Kjeller' 1 3 'Nei' 'Ja' 1 'Hans Hansen' 'Storgata 10' 9999 'Stokkmarknes' '99 999999' 'Solsiden' 'Kjelleråsen' 1111 'Kjeller' 2 8 'Ja' 'Ja' 2 'Heidi Olsen' 'Parkveien 10' 2222 'Oslo' '11 111111' 'Sjøvegen' 'Stavangerstranda' 3333 'Stavanger' 1 6 'Nei' 'Nei' 3 'Jon Johnsen' 'Portveien 2' 4444 'Barnetv' NULL 'Fjellbygda' 'Gammelsætra' 6666 'Alvdal' 3 4 'Nei' 'Ja' 4 'Heidi Olsen' 'Parkveien 10' 2222 Oslo '11 111111' b) Kandidatnøkler: (hyttefeltnavn, hyttenr) Hvorfor ikke (hyttefeltnavn, eierid)? Fordi en hytteeier kan eie flere hytter. 1 av 36

Hvorfor da ikke (hyttefeltnavn, hyttenr, eierid)? Fordi den ikke er minimalistisk hyttefeltnavn hyttefeltadresse hyttefeltpostnr hyttefeltpoststed hyttenr hytteinfoantsengepl hytteinfostrom hytteinfovann eierid eiernavn hjemadresse hjempostnr hjempoststed mobilnr ^ ^ ^ ^ ^ ^ hyttefelt hyttefeltnavn hyttefeltadresse hyttefeltpostnr hyttefeltpoststed 'Solsiden' 'Kjelleråsen' 1111 'Kjeller' 'Solsiden' 'Kjelleråsen' 1111 'Kjeller' 'Sjøvegen' 'Stavangerstrand a' 3333 'Stavanger' 'Fjellbygda' 'Gammelsætra' 6666 'Alvdal' hytte hyttefeltnavn hyttenr hytteinfoantsengepl hytteinfostrom hytteinfovann eierid eiernavn hjemadresse hjempostnr hjempoststed mobilnr 'Solsiden' 1 3 'Nei' 'Ja' 1 'Hans Hansen' 'Storgata 10' 9999 'Stokkmarknes' '99 999999' 'Solsiden' 2 8 'Ja' 'Ja' 2 'Heidi Olsen' 'Parkveien 10' 2222 'Oslo' '11 111111' 'Sjøvegen' 1 6 'Nei' 'Nei' 3 'Jon Johnsen' 'Portveien 2' 4444 'Barnetv' NULL 'Fjellbygda' 3 4 'Nei' 'Ja' 4 'Heidi Olsen' 'Parkveien 10' 2222 Oslo '11 111111' c) Felter som er avhengige av ikke-primærnøkkelattributter: hyttefeltpoststed er avhengige av hyttefeltpostnr hjempoststed er avhengige av hjempostnr eiernavn, hjemadresse, hjempostnr, hjempoststed og mobilnr er avhengige av eierid 2 av 36

hyttefelt hyttefeltnavn hyttefeltadresse hyttefeltpostnr 'Solsiden' 'Kjelleråsen' 1111 'Solsiden' 'Kjelleråsen' 1111 'Sjøvegen' 'Stavangerstranda' 3333 'Fjellbygda' 'Gammelsætra' 6666 hytte hyttefeltnavn hyttenr hytteinfoantsengepl hytteinfostrom hytteinfovann eierid 'Solsiden' 1 3 'Nei' 'Ja' 1 'Solsiden' 2 8 'Ja' 'Ja' 2 'Sjøvegen' 1 6 'Nei' 'Nei' 3 'Fjellbygda' 3 4 'Nei' 'Ja' 4 hytteeier eierid eiernavn hjemadresse hjempostnr mobilnr 1 'Hans Hansen' 'Storgata 10' 9999 '99 999999' 2 'Heidi Olsen' 'Parkveien 10' 2222 '11 111111' 3 'Jon Johnsen' 'Portveien 2' 4444 NULL 4 'Heidi Olsen' 'Parkveien 10' 2222 '11 111111' poststed hjempostnr hjempoststed 9999 'Stokkmarknes' 2222 'Oslo' 4444 'Barnetv' 1111 'Kjeller' 3333 'Stavanger' 3 av 36

6666 'Alvdal' Oppgave 2 a) b) 1. -1 + 2 * 4 + 7 = (-1) + (2*4) + 7 = -1 + 8 + 7 = 14 2. -1 + 2 * (4 + 7) = -1 + (2 * (4+7)) = -1 + (2 * 11) = -1 + 22 = 21 3. -1 + 2 * 4 + 7 3 * 5 = -1 + (2*4) + 7 (3*5) = -1 + 8 + 7 15 = -1 4. 5 + 20 / 5 = 5 + (20 / 5) = 5 + 4 = 9 5. (5 + 20) / 5 7 = ( (5 + 20) / 5 ) -7 = (25 / 5) 7 = 5 7 = -2 6. 5 + 20 / 5 10 / 2 = 5 + (20 / 5) (10 / 2) = 5 + 4 5 = 4 7. 5 + 6 * 12 / 4-8 = 5 + ( (6 * 12) / 4) - (-8) = 5 + ( 72 / 4 ) + 8 = 5 + 18 + 8 = 31 8. 5 + 6 * 12 / (4-8) = 5 + ( (6 * 12) / (4 - (-8)) = 5 + ( (72 / (4 + 8)) ) = 5 + (72/12) = 5 + 6 = 11 Logiske operatorer ( ) ( ) NOT V og V Tilsvarende SQL-operatorer AND OR og XOR Prioritetsrekkefølge: Den øverste i lista (parenteser) har høyest prioritet, mens de nederst(or og XOR)e har lavest prioritet. c) Med logisk notasjon: (p q) p V q (pvq) p q 4 av 36

Med SQL-syntax: NOT(P OR Q) = NOT P AND NOT Q NOT(P AND Q) = NOT P OR NOT Q d) 1 SELECT fornavn, etternavn, fodt_aar, nasjonalitet WHERE fodt_aar = 1977 OR fodt_aar = 1968 AND nasjonalitet = 'NOR'; Siden AND har høyere prioritet enn OR, leses spørringen slik: SELECT fornavn, etternavn, fodt_aar, nasjonalitet WHERE (fodt_aar = 1968 AND nasjonalitet = 'NOR') OR fodt_aar = 1977; altså henter den ut deltagere som enten er født i 1968 og kommer fra Norge, eller personer som er født i 1977 (uavhengig av nasjonalitet) Antall rader: 198 fornavn etternavn fodt_aar nasjonalitet -----------------------+------------------+----------+-------------- Jan Otto 1977 GER Daniel Cardoso Dias 1977 FRA Steven Escaler 1977 USA Jean-Claude Blum 1977 FRA Harri Anttila 1977 FIN 2 SELECT fornavn, etternavn, fodt_aar, nasjonalitet WHERE (fodt_aar = 1977 OR fodt_aar = 1968) AND nasjonalitet = 'NOR'; 5 av 36

Siden parenteser har høyere prioritet enn AND leses det inne i parentesen først. Da leses spørringen rett fram slik den står. Den henter ut deltagere som kommer fra Norge og som enten er født i 1977 eller 1968. Antall rader: 1 fornavn etternavn fodt_aar nasjonalitet ---------+-----------+----------+-------------- Stig Laursen 1968 NOR 3 SELECT fornavn, etternavn, fodt_aar, nasjonalitet WHERE NOT nasjonalitet = 'NOR' AND fodt_aar = 1968; Siden NOT har høyere prioritet enn AND leses denne først. Vi leser altså rett fram, og får da ut alle deltagere som ikke er norske og som er født i 1968. Antall rader: 446 fornavn etternavn fodt_aar nasjonalitet --------------------+--------------------+----------+-------------- Andrei Solodovnikov 1968 UKR Emmanuel Conraux 1968 FRA Hans Bern Bauer 1968 USA Josef Stöhr 1968 GER Federico Hernandez 1968 SWE 4 SELECT fornavn, etternavn, fodt_aar, nasjonalitet WHERE NOT (nasjonalitet = 'NOR' AND fodt_aar = 1968); Ser vi nærmere på denne setningen, vil vi se at den ligner på en setning fra demorgans lover. Skriver vi den om i henhold til loven får vi setningen: 6 av 36

SELECT fornavn, etternavn, fodt_aar, nasjonalitet WHERE NOT nasjonalitet = 'NOR' OR NOT fodt_aar = 1968; Spørringen blir nå mye lettere å lese. Siden NOT har høyere prioritet enn OR leses denne først. Spørringen returnerer alle deltagere som enten ikke er norske eller som ikke er født i 1968. Antall rader: 16212 fornavn etternavn fodt_aar nasjonalitet ------------------------+----------------------------+----------+-------------- Angel Marcos de la Mata Garcia 1957 ESP Maurice Chenais 1950 FRA Olivier Lhuillery 1958 FRA Vasilij Emanov 1950 RUS Christian Fournier 1957 FRA e) 1. Setningen henter ut fornavn etternavn og nasjonalitet for alle deltagere som kommer fra land med nasjonalitetskoder som ikke begynner med N eller P. 2. Logisk notasjon: nasjonalitet LIKE 'N%' nasjonalitet LIKE 'P%' SQL: SELECT fornavn, etternavn, nasjonalitet WHERE NOT nasjonalitet LIKE 'N%' AND NOT nasjonalitet LIKE 'P%'; Antall rader "grunnspørring": 15591 fornavn etternavn nasjonalitet ------------------------+----------------------------+-------------- Angel Marcos de la Mata Garcia ESP 7 av 36

Maurice Chenais FRA Olivier Lhuillery FRA Vasilij Emanov RUS Christian Fournier FRA Antall rader min spørring (omskrevet): 15591 fornavn etternavn nasjonalitet ------------------------+----------------------------+-------------- Angel Marcos de la Mata Garcia ESP Maurice Chenais FRA Olivier Lhuillery FRA Vasilij Emanov RUS Christian Fournier FRA f) 1. Setningen henter ut fornavn, etternavn og nasjonalitet for alle deltagere som kommer fra Norge og som enten stiller i klassen M45 eller klassen W45 2. Logisk notasjon: nasjonalitet = 'NOR' klasse = 'M45' nasjonalitet = 'NOR' klasse = 'W45' SQL: SELECT DISTINCT fornavn, etternavn, nasjonalitet WHERE nasjonalitet = 'NOR' AND klasse = 'M45' OR nasjonalitet = 'NOR' AND klasse = 'W45'; Antall rader "grunnspørring": 11 fornavn etternavn nasjonalitet ------------+---------------+-------------- Anders Tøsse NOR Atle Berntsen NOR Einar Iversen NOR Frants Mohr NOR Frode Anderson NOR 8 av 36

Antall rader min spørring (omskrevet): fornavn etternavn nasjonalitet ------------+---------------+-------------- Anders Tøsse NOR Atle Berntsen NOR Einar Iversen NOR Frants Mohr NOR Frode Anderson NOR Oppgave 3 a) 9 av 36

b) 10 av 36

c) Hvis en bussrute kjøres av flere busser vil vi få et mange-til-mange-forhold mellom buss og bussruter. Dette forholdet må løses opp med en mellom-entitet. Denne mellom-entiteten må inneholde primærnøkkel fra både buss og bussrute, og disse vil sammen danne primærnøkkelen for mellom-entiteten. I en reell situasjon vil vi måtte operere med hvilke deler av ruta den enkelte buss tar, men dette er en oppgave for et større system. Let's keep it simple. For modell, se neste side! 11 av 36

d) 12 av 36

For modell, se neste side! 13 av 36

14 av 36

15 av 36

Løsningsforslag 1 CREATE TABLE innholdtype( typeid INT NOT NULL, typebeskrivelse VARCHAR(50), PRIMARY KEY (typeid) ); CREATE TABLE Paaskeegg( eggid INT NOT NULL, navnbarn VARCHAR(100), alderbarn INT, gateadresse VARCHAR(75), husnummer INT, bynavn VARCHAR(75), PRIMARY KEY (eggid) ); CREATE TABLE barnallergiinfo( eggid INT NOT NULL, innholdtype INT NOT NULL, PRIMARY KEY (eggid, innholdtype), FOREIGN KEY (eggid) REFERENCES Paaskeegg, FOREIGN KEY (innholdtype) REFERENCES innholdtype ); CREATE TABLE innhold( innholdid INT NOT NULL, navn VARCHAR(50), PRIMARY KEY (innholdid) ); CREATE TABLE innholdallergiinfo( innholdid INT NOT NULL, 16 av 36

innholdtype INT NOT NULL, PRIMARY KEY (innholdid, innholdtype), FOREIGN KEY (innholdid) REFERENCES innhold, FOREIGN KEY (innholdtype) REFERENCES innholdtype ); CREATE TABLE innholdegg( eggid INT NOT NULL, innholdid INT NOT NULL, mengde INT, PRIMARY KEY (eggid, innholdid), FOREIGN KEY (eggid) REFERENCES Paaskeegg, FOREIGN KEY (innholdid) REFERENCES innhold ); Løsningsforslag 2 CREATE TABLE innholdtype( typeid INT NOT NULL, typebeskrivelse VARCHAR(50), PRIMARY KEY (typeid) ); CREATE TABLE Paaskeegg( eggid INT NOT NULL, beskrivelse VARCHAR(50), PRIMARY KEY (eggid) ); CREATE TABLE eggallergiinfo( eggid INT NOT NULL, innholdtype INT NOT NULL, PRIMARY KEY (eggid, innholdtype), FOREIGN KEY (eggid) REFERENCES Paaskeegg, FOREIGN KEY (innholdtype) REFERENCES innholdtype 17 av 36

); CREATE TABLE innhold( innholdid INT NOT NULL, navn VARCHAR(50), PRIMARY KEY (innholdid) ); CREATE TABLE innholdallergiinfo( innholdid INT NOT NULL, innholdtype INT NOT NULL, PRIMARY KEY (innholdid, innholdtype), FOREIGN KEY (innholdid) REFERENCES innhold, FOREIGN KEY (innholdtype) REFERENCES innholdtype ); CREATE TABLE barn( barnid INT NOT NULL, navn VARCHAR(100), alder INT, gateadresse VARCHAR(75), husnummer INT, bynavn VARCHAR(75), eggid INT, PRIMARY KEY (barnid), FOREIGN KEY (eggid) REFERENCES Paaskeegg ); CREATE TABLE barnallergiinfo( barnid INT NOT NULL, innholdtype INT NOT NULL, PRIMARY KEY (barnid, innholdtype), FOREIGN KEY (barnid) REFERENCES barn, FOREIGN KEY (innholdtype) REFERENCES innholdtype 18 av 36

); CREATE TABLE innholdegg( eggid INT NOT NULL, innholdid INT NOT NULL, mengde INT, PRIMARY KEY (eggid, innholdid), FOREIGN KEY (eggid) REFERENCES Paaskeegg, FOREIGN KEY (innholdid) REFERENCES innhold ); Oppgave 4 a) INSERT INTO plante VALUES(1, 'Dracocephalum ruyschiana','dragehode', 'VU'); INSERT INTO plante VALUES(2, 'Botrychium boreale','fjellmarinøkkel', 'NT'); INSERT INTO plante VALUES(3, 'Salix daphnoides','påskepil', 'VU'); INSERT INTO plante VALUES(4, 'Lithospermum officinale','legesteinfrø', 'VU'); INSERT INTO plante VALUES(5, 'Ophioglossum vulgatum','ormetunge ', 'VU'); INSERT INTO plante VALUES(6, 'Botrychium lanceolatum','handmarinøkkel', 'EN'); INSERT INTO plante VALUES(7, 'Grifola frondosa','korallkjuke', 'VU'); INSERT INTO plante VALUES(8, 'Fistulina hepatica','oksetundesopp', 'NT'); INSERT INTO plante VALUES(9, 'Herminium monorchis','honningblom', 'CR'); INSERT INTO forsker VALUES(1, 'Per', 'Olsen', 'Universitetet i Stavanger'); INSERT INTO forsker VALUES(2, 'Anne', 'Jensen', 'Høgskolen i Lillehammer'); INSERT INTO forsker VALUES(3, 'Kari', 'Knutsen', 'Statens Naturoppsyn'); INSERT INTO forsker VALUES(4, 'Jens', 'Jensen', 'Universitetet i Tromsø'); INSERT INTO forsker VALUES(5, 'Hanne Merethe', 'Hansen', 'Statens Naturoppsyn'); INSERT INTO forsker VALUES(6, 'Ove Petter Andreas Jalmar', 'Ovesen', 'Høgskolen i Østfold'); INSERT INTO forsker VALUES(7, 'Line Karoline', 'Hansen Jensen', 'Norsk Botanisk Forening'); INSERT INTO forsker VALUES(8, 'Ottar', 'Zendium', 'Statens strålevern'); 19 av 36

INSERT INTO fylke VALUES('05', 'Oppland'); INSERT INTO fylke VALUES('01', 'Østfold'); INSERT INTO fylke VALUES('08', 'Telemark'); INSERT INTO fylke VALUES('06', 'Buskerud'); INSERT INTO fylke VALUES('15', 'Møre og Romsdal'); INSERT INTO fylke VALUES('19', 'Troms'); INSERT INTO fylke VALUES('18', 'Nordland'); INSERT INTO fylke VALUES('12', 'Hordaland'); INSERT INTO fylke VALUES('04', 'Hedmark'); INSERT INTO kommune VALUES('04', '01', 'Moss'); INSERT INTO kommune VALUES('24', '06', 'Øvre Eiker'); INSERT INTO kommune VALUES('63', '15', 'Sunndal'); INSERT INTO kommune VALUES('02', '19', 'Tromsø'); INSERT INTO kommune VALUES('01', '05', 'Lillehammer'); INSERT INTO kommune VALUES('25', '06', 'Nedre Eiker'); INSERT INTO kommune VALUES('11', '01', 'Hvaler'); INSERT INTO kommune VALUES('20', '18', 'Alstahaug'); INSERT INTO kommune VALUES('36', '04', 'Tolga'); INSERT INTO kommune VALUES('15', '05', 'Våga'); INSERT INTO kommune VALUES('01', '01', 'Halden'); INSERT INTO plantefelt VALUES('O4455V', 'Mo', '15', '05',6874350, 184400, 6874250, 184500); INSERT INTO plantefelt VALUES('Ø3243M', 'Bile', '04', '01',6604925, 252700, 6604825, 252600); INSERT INTO plantefelt VALUES('B6534E', 'Dramdal', '24', '06', 6643820, 214825, 6643770, 214875); INSERT INTO plantefelt VALUES('M4374S', 'Grøvudalshytta', '63', '15',6938525, 185450, 6938425, 185550); INSERT INTO plantefelt VALUES('O4456V', 'Vakkersletta', '15', '05',6852400, 188100, 6852300, 188200); INSERT INTO plantefelt VALUES('T7645T', 'Fløya', '02', '19',7728500, 655875, 7728400, 655975); INSERT INTO plantefelt VALUES('O5364L', 'Gausa', '01', '05',6789900, 249650, 6789850, 249700); INSERT INTO plantefelt VALUES('B7539E', 'Strykåsen', '25', '06',6632450, 222340, 6632400, 222390); INSERT INTO plantefelt VALUES('Ø2154H', 'Vadholmen, Asmaløy', '11', '01',6552300, 267100, 6552200, 267200); INSERT INTO plantefelt VALUES('Ø2178H', 'Vikerkilen øst', '11', '01',6552200, 267250, 6552100, 267350); INSERT INTO plantefelt VALUES('N6489A', 'Bumarka, Blomsøya', '20', '18',7308600, 376350, 7308400, 37550); 20 av 36

INSERT INTO plantefelt VALUES('H6502T', 'Storøyvollan', '36', '04',6940850, 281300, 6940700, 281450); INSERT INTO plantefelt VALUES('O1234V', 'Nordre Strondsætri', '15', '05',6869580, 186100, 6869570, 186110); INSERT INTO plantefelt VALUES('Ø1122H', 'Boberg', '01', '01',6561450, 289400, 6561400, 289450); INSERT INTO plantefelt VALUES('Ø1143H', 'Os kirkegård', '01', '01',6559900, 293500, 6559800, 293600); INSERT INTO plantefunn VALUES(1, to_date('14.07.2010', 'dd.mm.yyyy'), 'O4455V', 6874290, 184402, 2); INSERT INTO plantefunn VALUES(1, to_date('29.05.2010', 'dd.mm.yyyy'), 'Ø3243M', 6604900, 252696, 6); INSERT INTO plantefunn VALUES(1, to_date('09.06.2010', 'dd.mm.yyyy'), 'B6534E', 6643775, 214841, 7); INSERT INTO plantefunn VALUES(2, to_date('08.08.2010', 'dd.mm.yyyy'), 'M4374S', 6938443, 185478, 1); INSERT INTO plantefunn VALUES(2, to_date('06.08.2010', 'dd.mm.yyyy'), 'O4456V', 6852342, 188150, 5); INSERT INTO plantefunn VALUES(2, to_date('26.07.2010', 'dd.mm.yyyy'), 'T7645T', 7728415, 655900, 4); INSERT INTO plantefunn VALUES(3, to_date('07.06.2010', 'dd.mm.yyyy'), 'O5364L', 6789870, 249679, 2); INSERT INTO plantefunn VALUES(4, to_date('07.08.2010', 'dd.mm.yyyy'), 'B7539E', 6632410, 222342, 6); INSERT INTO plantefunn VALUES(5, to_date('27.08.2010', 'dd.mm.yyyy'), 'Ø2154H', 6552247, 267162, 6); INSERT INTO plantefunn VALUES(5, to_date('20.07.2010', 'dd.mm.yyyy'), 'Ø2178H', 6552134, 267292, 7); INSERT INTO plantefunn VALUES(5, to_date('15.06.2010', 'dd.mm.yyyy'), 'N6489A', 7308460, 376440, 4); INSERT INTO plantefunn VALUES(6, to_date('22.08.2010', 'dd.mm.yyyy'), 'H6502T', 6940726, 281365, 5); INSERT INTO plantefunn VALUES(6, to_date('07.07.2010', 'dd.mm.yyyy'), 'O1234V', 6869576, 186101, 6); INSERT INTO plantefunn VALUES(7, to_date('07.11.2010', 'dd.mm.yyyy'), 'Ø1122H', 6561430, 289435, 6); INSERT INTO plantefunn VALUES(8, to_date('11.10.2010', 'dd.mm.yyyy'), 'Ø1143H', 6559844, 293541, 7); NB! Statements er skrevet med PostgreSQL-funksjoner. For MySQL heter dato-funksjonen str_to_date og skrives på formen: str_to_date('11.10.2010', '%d.%m.%y') b) SELECT navn_norsk FROM plante WHERE rodlistestatus = 'VU'; Antall rader: 5 Antall kolonner: 1 navn_norsk -------------- 21 av 36

Dragehode Påskepil Legesteinfrø Ormetunge Korallkjuke c) SELECT count(*) FROM plantefelt; Antall rader: 1 Antall kolonner: 1 count ------- 15 d) SELECT DISTINCT tilknyttet_institusjon FROM forsker; Antall rader: 7 Antall kolonner: 1 tilknyttet_institusjon --------------------------- Høgskolen i Lillehammer Høgskolen i Østfold Norsk Botanisk Forening Statens Naturoppsyn Statens strålevern e) SELECT tilknyttet_institusjon, count(forskerid) AS "Antall forskere" FROM forsker GROUP BY tilknyttet_institusjon; 22 av 36

Antall rader: 7 Antall kolonner: 2 tilknyttet_institusjon Antall forskere ---------------------------+----------------- Høgskolen i Østfold 1 Høgskolen i Lillehammer 1 Norsk Botanisk Forening 1 Universitetet i Stavanger 1 Statens strålevern 1 f) SELECT f.*, k.* FROM fylke f, kommune k; Antall rader: 99 Antall kolonner: 5 fylkesnr fylkesnavn kommunenr fylkesnr kommunenavn ----------+-----------------+-----------+----------+------------- 05 Oppland 04 01 Moss 05 Oppland 24 06 Øvre Eiker 05 Oppland 63 15 Sunndal 05 Oppland 02 19 Tromsø 05 Oppland 01 05 Lillehammer g) SELECT f.fylkesnr, fylkesnavn, kommunenavn FROM fylke f, kommune k WHERE f.fylkesnr = k.fylkesnr; SELECT f.fylkesnr, fylkesnavn, kommunenavn FROM fylke f JOIN kommune k ON f.fylkesnr = k.fylkesnr; Antall rader: 11 Antall kolonner: 3 fylkesnr fylkesnavn kommunenavn 23 av 36

----------+-----------------+------------- 01 Østfold Moss 06 Buskerud Øvre Eiker 15 Møre og Romsdal Sunndal 19 Troms Tromsø 05 Oppland Lillehammer h) SELECT pf1.stedsnavn, pf2.stedsnavn, pf1.kommunenr FROM plantefelt pf1, plantefelt pf2 WHERE pf1.kommunenr = pf2.kommunenr AND pf1.kodenavn <> pf2.kodenavn AND pf1.fylkesnr = pf2.fylkesnr; og SELECT pf1.stedsnavn, pf2.stedsnavn, pf1.kommunenr FROM plantefelt pf1 JOIN plantefelt pf2 ON (pf1.kommunenr = pf2.kommunenr AND pf1.fylkesnr = pf2.fylkesnr) WHERE pf1.kodenavn <> pf2.kodenavn; Antall rader: 10 Antall kolonner: 3 stedsnavn stedsnavn kommunenr --------------------+--------------------+----------- Mo Nordre Strondsætri 15 Mo Vakkersletta 15 Vakkersletta Nordre Strondsætri 15 Vakkersletta Mo 15 Vadholmen, Asmaløy Vikerkilen øst 11 eventuellt: SELECT DISTINCT pf1.stedsnavn, pf1.kommunenr FROM plantefelt pf1, plantefelt pf2 WHERE pf1.kommunenr = pf2.kommunenr AND pf1.fylkesnr = pf2.fylkesnr 24 av 36

AND pf1.kodenavn <> pf2.kodenavn; Antall rader: 7 Antall kolonner: 2 stedsnavn kommunenr --------------------+----------- Boberg 01 Mo 15 Nordre Strondsætri 15 Os kirkegård 01 Vadholmen, Asmaløy 11 i) SELECT pf1.stedsnavn, pf2.stedsnavn, kommunenavn FROM plantefelt pf1, plantefelt pf2, kommune k WHERE pf1.kodenavn <> pf2.kodenavn AND pf1.kommunenr = pf2.kommunenr AND pf1.fylkesnr = pf2.fylkesnr AND pf1.kommunenr = k.kommunenr AND pf2.kommunenr = k.kommunenr AND pf1.fylkesnr = k.fylkesnr AND pf2.fylkesnr = k.fylkesnr; Antall rader: 10 Antall kolonner: 3 stedsnavn stedsnavn kommunenavn --------------------+--------------------+------------- Mo Nordre Strondsætri Våga Mo Vakkersletta Våga 25 av 36

Vakkersletta Nordre Strondsætri Våga Vakkersletta Mo Våga Vadholmen, Asmaløy Vikerkilen øst Hvaler eventuelt: SELECT DISTINCT pf1.stedsnavn, kommunenavn FROM plantefelt pf1, plantefelt pf2, kommune k WHERE pf1.kodenavn <> pf2.kodenavn AND pf1.kommunenr = pf2.kommunenr AND pf1.fylkesnr = pf2.fylkesnr AND pf1.kommunenr = k.kommunenr AND pf2.kommunenr = k.kommunenr AND pf1.fylkesnr = k.fylkesnr AND pf2.fylkesnr = k.fylkesnr; Antall rader: 7 Antall kolonner: 2 stedsnavn kommunenavn --------------------+------------- Boberg Halden Mo Våga Nordre Strondsætri Våga Os kirkegård Halden Vadholmen, Asmaløy Hvaler j) SELECT DISTINCT p1.navn_norsk FROM plante p1, plante p2 WHERE p1.planteid <> p2.planteid AND p1.rodlistestatus = p2.rodlistestatus; SELECT DISTINCT p1.navn_norsk FROM plante p1 JOIN plante p2 ON p1.rodlistestatus = p2.rodlistestatus WHERE p1.planteid <> p2.planteid; 26 av 36

Antall rader: 7 Antall kolonner: 1 navn_norsk ----------------- Dragehode Fjellmarinøkkel Korallkjuke Legesteinfrø Oksetundesopp k) SELECT navn_norsk, COUNT(forsker) AS "Antall forskere" FROM plantefunn pf, plante p WHERE pf.planteid = p.planteid GROUP by navn_norsk ORDER BY "Antall forskere" DESC; SELECT navn_norsk, COUNT(forsker) AS "Antall forskere" FROM plantefunn pf JOIN plante p ON pf.planteid = p.planteid GROUP by navn_norsk ORDER BY "Antall forskere" DESC; Antall rader: 8 Antall kolonner: 2 navn_norsk Antall forskere -----------------+----------------- Ormetunge 3 Dragehode 3 Fjellmarinøkkel 3 Handmarinøkkel 2 Oksetundesopp 1 Oppgave 5 a) 27 av 36

Tar meg selv som eksempel. Siden jeg er kvinne og har forbokstavene E i fornavn og A i etternavn blir min spørring slik: SELECT DISTINCT fornavn, etternavn, klasse WHERE fornavn LIKE 'E%' AND etternavn LIKE 'A%' AND klasse LIKE 'W%'; Hadde jeg vært mann så hadde den blitt slik: SELECT DISTINCT fornavn, etternavn, klasse WHERE fornavn LIKE 'E%' AND etternavn LIKE 'A%' AND klasse LIKE 'M%'; b) SELECT COUNT (*) WHERE klasse LIKE '%JUN' AND EXTRACT (YEAR FROM dato) = '2010'; Antall rader: 1 Antall kolonner: 1 count ------- 51 c) SELECT DISTINCT fornavn, etternavn, nasjonalitet r, landskode l 28 av 36

WHERE r.nasjonalitet = l.landskode AND (landsnavn = 'Norge' OR landsnavn = 'Sverige' OR landsnavn = 'Finland' OR landsnavn = 'Danmark' OR landsnavn = 'Island'); Antall rader: 560 Antall kolonner: 3 fornavn etternavn nasjonalitet ---------------------+----------------------+-------------- Aimo Kostiainen FIN Aku Kopakkala FIN Alan Sneum DEN Alex Carl Verner Henriksen DEN Anders Hempel SWE d) SELECT DISTINCT fornavn, etternavn, nasjonalitet WHERE nasjonalitet IN( SELECT landskode FROM landskode WHERE landsnavn = 'Norge' OR landsnavn = 'Sverige' OR landsnavn = 'Finland' OR landsnavn = 'Danmark' OR landsnavn = 'Island'); Antall rader: 560 Antall kolonner: 3 29 av 36

fornavn etternavn nasjonalitet ---------------------+----------------------+-------------- Aimo Kostiainen FIN Aku Kopakkala FIN Alan Sneum DEN Alex Carl Verner Henriksen DEN Anders Hempel SWE e) SELECT fornavn, etternavn r WHERE klasse = 'W35' AND EXTRACT (YEAR FROM dato) = '2008' UNION SELECT fornavn, etternavn r WHERE klasse = 'W45' AND EXTRACT (YEAR FROM dato) = '2008'; Antall rader: 194 Antall kolonner: 2 fornavn etternavn -------------------+-------------------- Agnes Soulignac Aileen Scott Alison Combs Amelia Garcia Portillo Analia Razzetto f) SELECT AVG(distanse_km) WHERE klasse LIKE 'W%' AND EXTRACT (YEAR FROM dato) = '2010'; 30 av 36

Antall rader: 1 Antall kolonner: 1 avg ------------------ 136.444291436464 g) SELECT SUBSTRING(klasse, 1, 1) AS klasse_wm, AVG(distanse_km) AS "Gjennomsnittlig antall km" WHERE EXTRACT (YEAR FROM dato) = '2010' AND klasse IS NOT NULL GROUP BY klasse_wm; Antall rader: 2 Antall kolonner: 2 klasse_wm Gjennomsnittlig antall km -----------+--------------------------- W 136.444291436464 M 139.241436836324 h) SELECT fornavn, etternavn, nasjonalitet WHERE EXTRACT (YEAR FROM dato) = '2007' 31 av 36

INTERSECT SELECT fornavn, etternavn, nasjonalitet WHERE EXTRACT (YEAR FROM dato) = '2010'; Antall rader: 814 Antall kolonner: 3 fornavn etternavn nasjonalitet -------------------+--------------------------+-------------- Achilleas Katsaros GRE Adao Miranda da Silva BRA Adrian Sergio Pettenon ARG Akos Konya HUN Aku Kopakkala FIN i) SELECT DISTINCT fornavn, etternavn, nasjonalitet r1 WHERE EXTRACT (YEAR FROM r1.dato) = '2007' AND EXISTS( SELECT * r2 WHERE EXTRACT (YEAR FROM r2.dato) = '2010' AND r1.fornavn = r2.fornavn AND r1.etternavn = r2.etternavn AND r1.nasjonalitet = r2.nasjonalitet); Antall rader: 814 Antall kolonner: 3 fornavn etternavn nasjonalitet -------------------+--------------------------+-------------- Achilleas Katsaros GRE 32 av 36

j) Adao Miranda da Silva BRA Adrian Sergio Pettenon ARG Akos Konya HUN Aku Kopakkala FIN SELECT landsnavn, COUNT(id) AS AntallDeltagere, AVG(distanse_km) AS DistKm r, landskode l WHERE r.nasjonalitet = l.landskode AND EXTRACT(YEAR FROM dato) = '2010' GROUP BY landsnavn HAVING COUNT(id) > 10 ORDER BY DistKm DESC; Antall rader: 27 Antall kolonner: 3 landsnavn antalldeltagere distkm ---------------+-----------------+------------------ Norge 15 192.654733333333 Japan 61 169.010819672131 Ungarn 51 160.812588235294 Russland 109 159.219348623853 Tjekkia 40 156.4299 33 av 36

k) SELECT * WHERE distanse_km = (SELECT MAX(distanse_km) WHERE klasse LIKE 'M%' ); Antall rader: 1 Antall kolonner: 10 id distanse_km etternavn fornavn nasjonalitet fodt_aar klasse dato arrsted arrland -------+-------------+-----------+---------+--------------+----------+--------+------------+---------+--------- 86242 275.684 Sekiya Ryoichi JPN 1967 M40 2007-11-25 Taipei TPE l) SELECT fornavn ' ' etternavn ' fra ' landsnavn AS "Beste deltager gjennom tidene" r, landskode l WHERE r.nasjonalitet = l.landskode AND distanse_km = (SELECT MAX(distanse_km) ); Antall rader: 1 Antall kolonner: 1 Beste deltager gjennom tidene ------------------------------- Ryoichi Sekiya fra Japan m) SELECT fornavn, etternavn, nasjonalitet WHERE klasse IS NULL; 34 av 36

Antall rader: 1 Antall kolonner: 1207 fornavn etternavn nasjonalitet ---------------------+----------------------------+-------------- Petr Mikulasek CZE Milan Mikulasek CZE Coran Lang AUS Ildefonso Emerson de Mira BRA Coran Lang AUS Oppgave 6 a) Henter arrangementsted, dato, fornavn og antall løp for alle deltagere som heter Peter til fornavn og som har løpt mer enn 3 løp totalt på et gitt sted. b) Henter fornavn, etternavn, fødselsår og distanse i kilometer for alle deltagere som er født mellom 1950 og 1960 (der 1950 og 1960 ikke er inkludert) eller som har løpt 200km. c) Henter fornavn, etternavn, fødselsår og distanse i kilometer for alle deltagere som er født mellom 1950 og 1960 (der 1950 og 1960 ikke er inkludert) i tillegg til alle deltagere som er født etter 1950 og har løpt 200km. d) Henter fornavn, etternavn og distanse_km i mil for alle deltagere som stiller i 35-årsklassen (både kvinner og menn). Lista sorteres synkende etter antall mil. e) Henter ut en liste over fornavn på alle deltagere med fornavn som begynner med stor P etterfulgt av ett eller flere tegn (bokstaver) og som deretter slutter 35 av 36

med en i, ett enkelt tegn og helt til slutt en e (det vil si at tredje siste tegn er i, siste tegn er e og det i mellom er en hvilken som helst bokstav). f) Henter ut en liste over fornavn og det beste resultat(distanse i kilometer) for deltagere med dette fornavnet. 36 av 36