Systemutvikling fra kjernen og ut, fra skallet og inn Løsninger til oppgaver i kap A.10 i Appendiks A - SQL Legg merke til at oppgave 22 er blitt noe presisert. 1. Hvor mange innbyggere er det i Norge? SELECT SUM(Innbyggertall) AS NorgesInnbyggertall ; 2. Lag en tabell med Kommunenavn, Innbyggertall og AvfallPerInnbygger, begrenset til kommuner med over 50000 innbyggere.,innbyggertall, AvfallPerInnbygger WHERE Innbyggertall > 50000; 3. Lag en tabell med Kommunenavn, Innbyggertall og AvfallPerInnbygger, begrenset til kommuner med over 50000 innbyggere og mindre enn 300 kg avfall per innbygger.,innbyggertall, AvfallPerInnbygger WHERE Innbyggertall > 50000 AND AvfallPerInnbygger < 300; 4. Finn alle kommuner med fylkenr lik 04. WHERE Fylkenr = 04 ; 5. Finn alle kommuner hvis kommunenavn begynner på bokstavene Kr. WHERE Kommunenavn LIKE Kr% ; 6. Lag en tabell med Kommunenavn, Innbyggertall og AvfallPerInnbygger, sortert på synkende verdier av Innbyggertall. Ser det ut som om innbyggere i folkerike kommuner er flinkere til å produsere lite avfall enn innbyggerne i de øvrige kommunene?,innbyggertall, AvfallPerInnbygger ORDER BY Innbyggertall DESC; SQL-løsninger - side 1
7. Lag en tabell med Kommunenavn, Innbyggertall og BeregnetAvfallPerInnbygger, der du ikke henter data fra AvfallPerInnbygger.,Innbyggertall, Avfallsmengde*1000/Innbyggertall AS BeregnetAvfallPerInnbygger ; 8. Lag en tabell med Fylkenr, Kommunenr og Kommunenavn, der de tre attributtene er satt sammen til ett attributt, og Kommunenavn er atskilt med en -. SELECT Fylkenr Kommunenr '-' Kommunenavn AS FylkeOgKommune ; 9. Hvilken kommune produserer minst avfall, og hvor mye?, Avfallsmengde WHERE Avfallsmengde = (SELECT MIN(Avfallsmengde) ) ; 10. Hvilken kommune produserer minst avfall per innbygger, og hvor mye?, AvfallPerInnbygger WHERE AvfallPerInnbygger = (SELECT MIN(AvfallPerInnbygger) ) ; 11. Hvilke kommuner har mer avfall per innbygger enn gjennomsnittet?, AvfallPerInnbygger WHERE AvfallPerInnbygger > (SELECT AVG(AvfallPerInnbygger) ) ; 12. Hvor mange kommuner i Norge har samme kommunenavn, under forutsetning av at hvert navn ikke er brukt mer enn to ganger? SELECT (COUNT(Kommunenavn) COUNT(DISTINCT Kommunenavn))* 2 AS AntallKommunerMedNavnebrødre ; SQL-løsninger - side 2
13. Hvilke kommuner i Norge har samme kommunenavn? (vanskelig!) SELECT H1.Kommunenavn, H1.Kommunenr, H2.Kommunenr H1, Husholdningsavfall H2 WHERE H1.Kommunenavn = H2.Kommunenavn AND H1.Kommunenr < H2.Kommunenr; 14. Finn alle kommuner i fylket med fylkenavn Hedmark., Fylke WHERE Fylke.Fylkenr = Husholdningsavfall.Fylkenr AND Fylkenavn = Hedmark ; 15. Lag en tabell som inneholder fylker i Norge med fylkenavn og innbyggertall, begrenset til fylker med over 250000 innbyggere. SELECT F.Fylkenr, MAX(Fylkenavn)AS Fylkenavn, SUM(Innbyggertall) AS Innbyggertall H, Fylke F WHERE F.Fylkenr = H.Fylkenr GROUP BY F.Fylkenr HAVING SUM(Innbyggertall) > 250000 ; 16. Lag en tabell som inneholder alle fylker i Norge med fylkenavn, innbyggertall, avfallsmengde og avfallsmengde per innbygger, sortert på det siste attributtet. SELECT F.Fylkenr, MAX(Fylkenavn)AS Fylkenavn, SUM(Innbyggertall) AS Innbyggere, SUM(Avfallsmengde)AS Avfall, SUM(Avfallsmengde)*1000/SUM(Innbyggertall)AS AvfallPerInnbygger H, Fylke F WHERE F.Fylkenr = H.Fylkenr GROUP BY F.Fylkenr ORDER BY SUM(Avfallsmengde)*1000/SUM(Innbyggertall); SQL-løsninger - side 3
17. Gjør de endringer som skal til i tabellen Husholdningsavfall for å kunne legge inn kommunen Svalbard uten noe fylkenr og uten avfallsmengde. Bruk f.eks. 0000 som Kommunenr. Dette er litt tricky. Vi må fjerne NOT NULL på Fylkenr og Avfallsmengde. Siden vi ikke selv har gitt noe navn til disse skrankene, må vi finne de systemgenererte navnene. Følgende spørring mot metadatabasen gir oss dem: SELECT constraint_name, constraint_type, table_name, delete_rule, search_condition FROM user_constraints; La oss anta at skrankene heter SYS_00775 og SYS_00777. Følgende ALTER TABLE fjerner dem: ALTER TABLE Husholdningsavfall DROP CONSTRAINT SYS_C00775; ALTER TABLE Husholdningsavfall DROP CONSTRAINT SYS_C00777; Et alternativ er å lage en ny tabell og kopiere over data fra Husholdningsavfall: CREATE TABLE NyHusholdningsavfall AS SELECT * ; 18. Legg inn kommunen Svalbard med innbyggertall 1158. (I 1998 var i alt 2591 personer bosatt på Svalbard, men 1433 av disse holdt til i norske bosettinger og var derfor formelt tilhørende en kommune på fastlandet.) INSERT INTO Husholdningsavfall (Kommunenr, Kommunenavn, Innbyggertall) VALUES ( 0000, Svalbard, 1158); 19. Utfør en Outer Join med tabellen Fylke, slik at Svalbard kommer med i resultatet. SELECT * FROM Fylke F, Husholdningsavfall H WHERE F.Fylkenr (+) = H.Fylkenr ORDER BY Kommunenr; SQL-løsninger - side 4
20. Lag en ny, tom tabell Husholdningsavfall2 som i tillegg til alle attributtene i Husholdningsavfall også inneholder attributtet Fylkenavn. Fyll denne tabellen med forekomster. CREATE TABLE Husholdningsavfall2 AS SELECT Fylkenavn, H.Fylkenr, Kommunenr, Kommunenavn, Avfallsmengde, Innbyggertall, AvfallPerInnbygger FROM Fylke F, Husholdningsavfall H WHERE F.Fylkenr = H.Fylkenr; 21. Lag en alfabetisk tabell over alle fylkenavn i Norge ut fra tabellen Husholdningsavfall2. SELECT DISTINCT Fylkenavn 2 ORDER BY Fylkenavn; 22. Lag en ny tabell kalt Fylkeavfall i databasen over alle fylker i Norge med fylkenr, fylkenavn, innbyggertall og avfallsmengde, sortert på fylkenavn, ut fra tabellen Husholdningsavfall2. CREATE TABLE Fylkeavfall AS SELECT DISTINCT Fylkenr, MAX(Fylkenavn) AS Fylkenavn, SUM(Innbyggertall) AS Innbyggertall, SUM(Avfallsmengde) AS Avfallsmengde 2 GROUP BY Fylkenr ORDER BY Fylkenavn; 23. Utvid den siste tabellen med attributtet AvfallPerInnbygger og legg inn verdier. ALTER TABLE Fylkeavfall ADD AvfallPerInnbygger NUMBER(8,1); UPDATE Fylkeavfall SET AvfallPerInnbygger = Avfallsmengde * 1000/Innbyggertall; En sjekk av resultatet til slutt: SELECT * FROM Fylkeavfall; SQL-løsninger - side 5