Oblig 1 Databaser vår 2011 Dette arbeidskravet tester primærkunnskaper i faget, og det er her grunnlaget for videre framgang i kurset legges. Oppgaven leveres individuelt på Fronter. Får du problemer med innleveringen er det viktig at søker hjelp med en gang, enten ved å gå til HelpDesk eller ved å snakke med Elin eller Per-Olav (veileder/gruppelærer). For hjelp med Fronter, se: http://www.hiof.no/fronterhjelp Frist for innlevering: Tirsdag 8/2-2011 kl. 14:00 Krav til oppgave: Man skal ha gjort helhjertede forsøk på å løse alle oppgaver. Jobb jevnt og trutt med oppgavene, og spør om hjelp dersom det er noe du lurer på. Det anbefales at man jobber individuelt med denne oppgaven slik at alle studenter får den basiskunnskap man trenger videre. Det er selvfølgelig ikke noe i veien for at man spør andre studenter om hjelp, men da er det viktig at begge parter har utbytte av slik hjelp. Hver student må rette oppgaven til en annen student og levere et anonymt evalueringsskjema for å få sitt arbeidskrav godkjent. Fordeling av "rettepar" gjøres av Elin 9/2-2010, og hvert par får tilsendt den andres oppgave på epost. Fasit og rettemal som skal brukes under rettingen legges ut på Fronter. På døra til Elin (rom DU1-023) vil det henge en plastmappe med et evalueringsskjema for arbeidskravet. Evalueringen er anonym, og skal ikke merkes med navn eller dato. Retteark leveres på epost til elinkaan@hiof.no, mens evalueringsskjema for arbeidskravet leveres i resepsjonen ved hovedinngangen. Resultat av evalueringen bli sendt ut til dere alle straks det foreligger. 1
Oppgave 1 Denne oppgaven handler om nøkler. Gitt følgende tabeller med data: Klasse klasseid klassebetegnelse 1 'K20-25' 2 'K25-30' 3 'M20-25' 4 'M25-30' Renndeltager Startnr Fornavn Etternavn Personnr Klasseid 1 'Anne' 'Jensen' '01017011111' 1 2 'Anders' 'Olsen' '01017022222' 3 3 'Per' 'Hansen' '01017033333' 3 4 'Kurt' 'Iversen' '01017044444 4 5 'Eva' 'Adamsen' '01017055555' 1 6 'Inger' 'Jensen' '01017066666' 2 7 'Per' 'Olsen' '01017077777' 4 a) Hvilke supernøkler finnes i de to tabellene? b) Hvilke kandidatnøkler finnes i de to tabellene? c) Hvilke primærnøkler finnes i de to tabellene? d) Hvilke fremmednøkler finnes i de to tabellene? e) Hvilke entitetstyper finnes i de to tabellene? f) Hvilke entiteter finnes i de to tabellene? g) Hvilke attributter har de to tabellene? 2
Oppgave 2 Les hele oppgaven før du begynner! Det skal lages et datasystem for lagring av informasjon om skoler, skoleansatte og elever i Halden kommune. Data som skal inn i systemet ligger usortert i en sekk som dette: a) Hvordan vil du gruppere dataene slik at de hører mest mulig naturlig sammen? Tegn/List opp gruppene, og forklar hvorfor du har gruppert som du har b) Hvordan kan de ulike gruppene av data kobles sammen? 3
Oppgave 3 Denne oppgaven handler om mengdelære. Mengdelære er læren om mengder i matematikken. En mengde består av elementer, og disse elementene kan være for eksempel tall, symboler for tall, ord, tekststrenger, andre mengder, punkter eller linjer. En mengde kan bestå av flere typer elementer. Det er vanlig at en mengde representeres ved en stor bokstav. Eksempel: Hvis vi har en mengde vi kaller for F som inneholder elementene 2, 5, 7, 11 og 99 skrives dette slik: F = {2,5,7,11,99}, har vi en mengde vi kaller for Q som inneholder elementene 'Hund', 'Katt' og 'Gris' skrives dette slik: G = {'Hund', 'Katt', 'Gris'}, og har vi en mengde Z som inneholder elementene 3, 5, 7, 'Sel', 'Katt' og 'Hest' skrives dette slik: Z = {3,5,7,'Sel','Katt','Hest'} En mengde som ikke inneholder noen ting kalles for den tomme mengde (altså {} ) og skrives Ø. Man kan utføre operasjoner på mengder. Vi skal se på operasjonene union (UNION), snitt (INTERSECT) og differanse (DIFFERENCE). Union representeres ved tegnet U og skrives på formen A U B = C, der A, B og C er mengder. Union henter ut alle elementer som finnes enten i A eller B. Finnes et element både i A og B, legges det bare en gang i C. A U B er det samme som B U A. En figur som viser union: 4
Eksempel: F U G = {2,5,7,11,99,'Hund', 'Katt', 'Gris'} G U Z = {'Hund', 'Katt', 'Gris',3,5,7,'Sel','Hest'} F U G U Z = {2,5,7,11,99,'Hund', 'Katt', 'Gris',3,'Sel','Hest'} For å lette lesbarheten, kan man vise mellomregningen, for eksempel: F U G = {2,5,7,11,99} U {'Hund','Katt','Gris'} = {2,5,7,11,99,'Hund', 'Katt','Gris'} G U Z = {'Hund', 'Katt', 'Gris'} U {3,5,7,'Sel','Katt','Hest'} = {'Hund', 'Katt','Gris',3,5,7,'Sel','Hest'} F U G U Z = {2,5,7,11,99} U {'Hund', 'Katt', 'Gris'} U {3,5,7,'Sel','Katt','Hest'} = {2,5,7,11,99,'Hund', 'Katt','Gris'} U {3,5,7,'Sel','Katt','Hest'} = {2,5,7,11,99,'Hund', 'Katt', 'Gris',3,'Sel','Hest'} Snitt representeres ved tegnet og skrives på forme A B = C, der A, B og C er mengder. Snitt henter ut alle elementer som finnes både i A og B. A B er det samme som B A. En figur som viser snitt: Eksempel: F G = Ø G Z = {'Katt'} F Z = {5,7} Differanse representeres ved tegnet \ og skrives på formen A \ B = C, der A, B og C er mengder. Differanse henter ut alle elementer som finnes i A, men ikke i B. A \ B er IKKE det samme som B \ A 5
En figur som viser differanse: Eksempel: F \ Z = {2,11,99} Z \ F = {3,'Sel','Katt','Hest} F \ F = Ø Noen oppgaver om mengder Gitt følgende mengder: S = {1,2,3,4,5,6,7,8,9,10,'a','b','c','d','e','f','g','h','i'} O = {2,4,6,8,10,12,14,16,18,20,'c','g','i'} L = {1,3,5,7,9,11,13,15,17,19,'a','e','i','o','u','y','æ','ø','å'} A = {10,11,12,13,14,15,16,17,18,19,20} Finn svaret på følgende (vis gjerne mellomregningene) : a) S U O b) S U L c) S O d) L A e) A L f) L \ S g) S \ L h) (S L) \ O 6
Oppgave 4 En terminalklient kan brukes for å koble seg til servere som man har brukerkonto på. Eksempler på slike terminalklienter er Putty (http://www.putty.org) på Windows og Terminal på Mac. I denne og den neste oppgaven skal du lære enkel bruk av terminalklient. For hjelp med å sette opp og koble til på riktig måte, se: http://www.it.hiof.no/~elinkaan/databaser/main/docs/terminal.html a) Logg deg på serveren frigg.hiof.no med tilkoblingstype (Connection Type) SSH. Bruk ditt vanlige brukernavn og passord. Ta skjermbilde (Print Screen/Screen Shot) etter innlogging og legg inn dette som svar på oppgaven. b) Start MySQL med ditt eget brukernavn, men med _v11 etter (har du vanligvis brukernavn perols, vil du i databasen ha brukernavn perols_v11). Databasenavn og passord er ditt brukernavn, men med _v11 etter. Ta skjermbilde (Print Screen/Screen Shot) etter innlogging og legg inn dette som svar på oppgaven. Du starter MySQL med kommandoen mysql -u brukernavn -p -D databasenavn c) Start PostgreSQL (psql) med ditt eget brukernavn. Databasenavn og passord er ditt brukernavn, men med _v11 etter (har du vanligvis brukernavn perols, vil du i databasen ha databasenavn og passord perols_v11). Ta skjermbilde (Print Screen/Screen Shot) etter innlogging og legg inn dette som svar på oppgaven. Du starter PostgreSQL med kommandoen psql -d databasenavn -U brukernavn Oppgave 5 Dette er en fortsettelse av oppgave 4, men denne gangen skal noen enkle SQL-oppgaver løses i terminalen. Dere kan velge om dere ønsker å bruke MySQL eller PostgreSQL i oppgaven, men det skal oppgis hva som er brukt. Alle oppgaver der spørringer returnerer et svar, skal følgende ligge inne i besvarelsen: de 5 første radene av de returnerte svarene antall rader som returneres antall kolonner som returneres a) Opprette tabell. Lim inn følgende kode i MySQL eller PostgreSQL for å opprette en tabell: CREATE TABLE sykehus( forkortelse VARCHAR(5) NOT NULL, navn VARCHAR(50), region VARCHAR(30), 7
adresse VARCHAR(75), postnr VARCHAR(4), telefon_sentralbord VARCHAR(9), ant_ansatte INT, PRIMARY KEY(forkortelse) ); b) Legge inn data (NB! Data er delvis fiktive). Lim inn følgende kode i MySQL eller PostgreSQL for å legge inn data: INSERT INTO sykehus VALUES('AHUS', 'Akershus universitetssykehus HF', 'Helse Sør-Øst', 'Sykehusgata 1', '0052', '22 445533',12358); INSERT INTO sykehus VALUES('OSLO', 'Oslo universitetssykehus HF', 'Helse Sør-Øst', 'Sykehusgata 2', '0043', '22 785465',7623); INSERT INTO sykehus VALUES('SIV', 'Sykehuset i Vestfold HF', 'Helse Sør-Øst', 'Sykehusgata 3', '2054', '31 487854',4657); INSERT INTO sykehus VALUES('SIHF', 'Sykehuset Innlandet HF', 'Helse Sør-Øst', 'Sykehusgata 4', '3187', '25 005478',2578); INSERT INTO sykehus VALUES('STHF', 'Sykehuset Telemark HF', 'Helse Sør-Øst', 'Sykehusveien 5', '3289', '26 478952',687); INSERT INTO sykehus VALUES('SØF', 'Sykehuset Østfold HF', 'Helse Sør-Øst', 'Sykehusveien 6', '1603', '69 304578',3987); INSERT INTO sykehus VALUES('SSHF', 'Sørlandet sykehus', 'Helse Sør-Øst', 'Sykehusveien 7', '4512', '30 458765',2643); INSERT INTO sykehus VALUES('FØRDE', 'Førde Sentralsjukehus', 'Helse Vest', 'Sjukehusvegen 28', '6807', '57 839000', 1052); INSERT INTO sykehus VALUES('LÆRDA', 'Lærdal Sjukehus', 'Helse Vest', 'Sjukehusvegen', '6887', '57 640000',426); INSERT INTO sykehus VALUES('HAUKU', 'Haukeland universitetssjukehus', 'Helse Vest', 'Sjukehusvegen 65', '5021', '05300',10052); INSERT INTO sykehus VALUES('ODDA', 'Odda sjukehus', 'Helse Vest', 'Sjukehusvegen 1', '5750', '05253 ',554); INSERT INTO sykehus VALUES('STAVU', 'Stavanger universitetssjukehus', 'Helse Vest', 'Sykehusveien 20 ', '4011', '05151',5497); INSERT INTO sykehus VALUES('NAMSO', 'Sykehuset Namsos', 'Helse Midt-Norge', 'Sykehusveien 8', '7809', '74098000',574); INSERT INTO sykehus VALUES('STOLV', 'St. Olavs Hospital', 'Helse Midt-Norge', 'Sykehuskrysset', '7006', '06800',7542); INSERT INTO sykehus VALUES('TROMS', 'Tromsø universitetssykehus', 'Helse Nord', 'Sykehusveien 782', '8564', '97 452654',2845); INSERT INTO sykehus VALUES('HARST', 'Harstad sykehus', 'Helse Nord', 'Sykehusgata 1', '9406', '07776',987); c) Hent all informasjon om alle sykehus. d) Hent navn og region på alle sykehus. e) Hent navn på alle regioner. Hver region skal kun listes opp en gang. f) Hent navn på alle sykehus i regionen 'Helse Vest'. g) Hent all informasjon om alle sykehus som ikke har 2845 ansatte h) Hent navn, region og adresse for alle sykehus som ligger i Sykehusveien i) Hent navn, region og adresse for alle sykehus som ikke ligger i Sykehusveien 8
Oppgave 6 Denne oppgaven handler om atomære verdier og repeterende attributter eller attributtgrupper. Atomære verdier er verdier som er udelelige, dvs. ikke sammensatte. Ett repeterende attributt eller en repeterende attributtgruppe er et attributt eller en attributtgruppe som har flere verdier knyttet til en entitetsforkomst (for eksempel at en person kan ha flere epostadresser, eller at en sang kan ha flere låtskrivere). Eksempel: Hvis vi har et felt i en tabell som vi kaller 'Adresse', og denne inneholder verdier av typen: 'Storgata 10, 1750 Halden', sier vi at verdien i dette feltet er ikke-atomær. Hvorfor gjør vi det? Det gjør vi fordi feltet inneholder både gatenavn, husnummer, postnummer og poststed. Så er spørsmålet hvor mye det er hensiktsmessig å dele opp, og det skal dere få lov til å gruble på. Hvis vi har en tabell med data om filmer og deres eiere og denne ser slik ut: Videoeierskap eierid eiernavn videoid videonavn sjanger 1 "Per" 1 "Dirty Dancing" "Familie" 1 "Per" 2 "Rambo" "Action" 2 "Anne" 3 "Politiskolen 1" "Komedie" 3 "Ola" 2 "Rambo" "Action" 4 "Kjersti" 1 "Dirty Dancing" "Familie"... ser vi at det er mye informasjon som lagres flere ganger. Endringer i verdier i en rad fører naturlig nok ikke til oppdatering av informasjon i de andre radene, noe som kan få uante konsekvenser. Man kan da risikere at 'Rambo' kan lagres både som 'Action' og 'Familie' for to forskjellige eiere, eller at et videonavn kan være stavet feil i en eller flere av radene slik at det ser ut som det er flere forskjellige filmer istedenfor den samme. Vi kunne til og med få en situasjon hvor person med eierid 1 kan hete både "Per" og "Petra". Måten å løse dette på er å splitte opp tabellen i tre tabeller: En for informasjon om eiere, en for informasjon om videoer og en for informasjon om hvem som eier hva, slik: 9
Eier Video Videoeierskap eierid navn Videoid navn sjanger eierid videoid 1 "Per" 1 "Dirty Dancing" "Familie" 1 1 2 "Anne" 2 "Rambo" "Action" 1 2 3 "Ola" 3 "Politiskolen 1" "Komedie" 2 3 4 "Kjersti" 3 2 4 1 a) Gitt feltet navn med følgende dataverdi: 'Per Even Oskarsson Olsen' Hvilke muligheter ser du for oppsplitting av dette feltet? b) Gitt følgende tabell med både ikke-atomære verdier og repeterende grupper: taxisjåfø r-id navn mobilnummer taxiid regnr taxi turdatoogtid turstartsted turstoppsted 1 "Per Ole Olsen" "11111111" 3 "AA11111" "Ford Mondeo 2.0D 1999-modell" 2 "Hanne Jensen" "22222222" 1 "BB22222" "Opel Ascona 1.8 1977-modell" 1 "Per Ole Olsen" "11111111" 3 "AA11111" "Ford Mondeo 2.0D 1999-modell" 1 "Per Ole Olsen" "11111111" 3 "AA11111" "Ford Mondeo 2.0D 1999-modell" 5 "Even Evensen" "33333333" 2 "CC33333" "VW Passat 2.0TDi 2005-modell" "01.01.2010 kl 23:05 02.01.2010 kl 00:10" "05.03.2010 kl 14:01 05.03.2010 kl 16:07" "02.01.2010 kl 02:00 02.01.2010 kl 02:30" "01.03.2010 kl 12:05 01.03.2010 kl 12:15" "01.01.2010 kl 21:22 01.01.2010 kl 21:28" "Storgata 10" "Storgata 100" "Storgata 5" "Nedregate 5" "Storgata 1" "Storberget" "Utvikhytta" "Togstasjon" "Øvregate 7" "Nedregate 3" Hvilke muligheter ser du for oppsplitting av denne tabellen? Skriv litt om hvilke forutsetninger du tar. c) Skriv CREATE TABLE-setninger for å opprette tabellene i eksempelet med videoeiere (eier, video og videoeier - se innledning til oppgaven). Husk 10
primær- og fremmednøkler. d) Skriv INSERT-setninger for å legge inn data i tabellene (kun de data som er med i eksempelet se innledning til oppgaven). e) Videoen "Dirty Dancing" bytter sjanger til "Romantisk komedie". Skriv UPDATE-setninger for å foreta endringen. f) Anne og Ola bytter videoer med hverandre. Hvilke problemer kan oppstå når man skal oppdatere informasjonen? Skriv et forslag til UPDATE-setning(er) for å foreta byttet. Oppgave 7 I denne oppgaven skal dere lære å opprette tabeller og fylle dem med data fra kommandolinja i terminalen. Dere kan velge om dere ønsker å bruke MySQL eller PostgreSQL i oppgaven, men det skal oppgis hva som er brukt. Alle oppgaver der spørringer returnerer et svar, skal følgende ligge inne i besvarelsen: de 5 første radene av de returnerte svarene antall rader som returneres antall kolonner som returneres Databasen dere nå skal jobbe med data fra en database laget av Deutche Ultramaraton Vereinigung ( http://statistik.d-u-v.org/getintbestlist.php? year=2010&dist=24h&gender=m&nat=all&cat=all&label=&hili=none&page=1 ). Jeg har lastet ned data for dere for årende 2007-2010 og gjort disse om til INSERT-setninger som er lagret på fil. Jeg har også laget filer for opprettelse av tabellene. Alle filer ligger på Fronter. Siden det er noe forskjell når det gjelder navngiving på funksjoner og enkelte datatyper mellom MySQL og PostgreSQL, har disse hver sine filer. Filer for MySQL: mysql-24timerlop07-10-create.sql, landskoder-create.sql, mysql-24timerlop07-10-utf8.sql, mysql-landskoder-utf8.sql Filer for PostgreSQL: psql-24timerlop07-10-create-utf8.sql, landskoder-create.sql, psql-24timerlop07-10-utf8.sql, psql-landskoder-utf8.sql a) Opprett tabellene i riktig rekkefølge i terminalen. For mysql: mysql -u brukernavn -p -D databasenavn \. filnavn.sql For psql: psql -f filnavn.sql -d databasenavn -U brukernavn b) Legg inn data i tabellene i riktig rekkefølge i terminalen. For mysql: mysql -u brukernavn -p -D databasenavn \. filnavn.sql For psql: psql -f filnavn.sql -d databasenavn -U brukernavn c) Finn ut hvor mange rader som finnes i tabellen med 24timerløpsresultater. d) Finn distanse, fornavn, etternavn, dato, arrangementssted og -land for alle løpere som har løpt mellom 200 og 210 km. Bruk BETWEEN. e) Finn distanse, fornavn, etternavn, dato, arrangementssted og -land for alle løpere som har løpt mellom 200 og 210 km. Ikke bruk BETWEEN. 11
f) Finn fornavn og etternavn på alle løpere fra Norge. Sorter resultatet stigende på etternavn. Hver løper skal kun listes opp en gang. g) Finn fornavn, etternavn og fødselsår for alle løpere fra USA. Sorter resultatet synkende på fornavn. Hver løper skal kun listes opp en gang. h) Finn fornavn, etternavn, nasjonalitet og antall løpte meter for den løperen som har løpt lengst i 2010. NB! Du må regne om fra km til meter! i) Finn navnet på alle land som ikke begynner på bokstaven 'S'. j) Finn fornavn og etternavn på alle deltagere som enten har nasjonalitetskode MLI, RSA eller MEX (dvs at de er fra Mali, Sør-Afrika eller Mexico). Ikke bruk IN-operatoren. k) Finn fornavn og etternavn på alle deltagere som enten har nasjonalitetskode MLI, RSA eller MEX (dvs at de er fra Mali, Sør-Afrika eller Mexico). Bruk IN-operatoren. l) Hva er forskjellen på = og LIKE (og dermed også forskjellen på <> og NOT LIKE)? m) Hva må du skrive for å få opp hjelp om kommandoer som finnes i henholdsvis MySQL og PostgreSQL? Tips: Søk på Google n) Hva må du skrive for å liste ut hvilke tabeller som finnes i databasen din i henholdsvis MySQL og PostgreSQL? Tips: Søk på Google o) Finn nasjonatiteten til alle løpere som har løpt mer enn 200 km i 2007. Hver nasjonalitetskode skal bare listes opp en gang, og lista skal være sortert i stigende rekkefølge. p) Finn fornavn, etternavn og nasjonalitet for alle løpere som det ikke har blitt registrert fødselsår for. Hvert navn skal kun listes opp en gang. q) Finn antallet løpere som det har blitt registrert fødselsår for. Oppgave 8 Finn feilene i sql-spørringene nedenfor. Forklar med egne ord hva som er feil, og skriv den korrekte sql-spørringen. a) SELECT fornavn WHERE nasjonalitet = 'NOR'; b) SELECT etternavn FROM res24timerlop WHERE fornavn = 'Per' c) SELECT fornavn, etternavn FROM res24timerlop WHERE nasjonalitet NOT (SELECT landsnavn='k*' FROM landskode); d) SELECT arrsted AND arrnavn FROM res24timerlop; e) SELECT AVG(nasjonalitet) FROM res24timerlop; Lykke til! 12