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