Databasteknik: Lösningar till övning 5, deluppgift 3

Det här är förslag på lösningar. Det kan finnas andra lösningar som också är korrekta,

3a) Vad heter tätorterna som finns i Pajala kommun?

Några alternativa lösningar:

SELECT "Tätorter".namn
FROM "Tätorter", Kommuner
WHERE "Tätorter".kommun = Kommuner.kod
and Kommuner.namn = 'Pajala kommun';

SELECT namn
FROM "Tätorter"
WHERE kommun IN (SELECT kod FROM Kommuner WHERE namn = 'Pajala kommun');

SELECT "Tätorter".namn
FROM "Tätorter" JOIN Kommuner ON "Tätorter".kommun = Kommuner.kod
WHERE Kommuner.namn = 'Pajala kommun';

3b) Det finns en tätort som heter Flurkmark. Vad heter kommunen som den ligger i?

Några alternativa lösningar:

SELECT Kommuner.namn
FROM "Tätorter", Kommuner
WHERE "Tätorter".namn = 'Flurkmark'
AND "Tätorter".kommun = Kommuner.kod;

SELECT namn
FROM Kommuner
WHERE kod IN (SELECT kommun FROM "Tätorter" WHERE namn = 'Flurkmark');

SELECT Kommuner.namn
FROM "Tätorter" JOIN Kommuner ON "Tätorter".kommun = Kommuner.kod
WHERE "Tätorter".namn = 'Flurkmark';

3c) Vad heter länet som Flurkmark ligger i?

Några alternativa lösningar:

SELECT "Län".namn
FROM "Tätorter", Kommuner, "Län"
WHERE "Tätorter".namn = 'Flurkmark'
AND "Tätorter".kommun = Kommuner.kod
AND Kommuner."län" = "Län".kod;

SELECT namn
FROM "Län"
WHERE kod IN (SELECT "län"
              FROM Kommuner
              WHERE kod IN (SELECT kommun
                            FROM "Tätorter"
                            WHERE namn = 'Flurkmark'));

SELECT "Län".namn
FROM "Tätorter" JOIN Kommuner ON "Tätorter".kommun = Kommuner.kod JOIN "Län" ON Kommuner."län" = "Län".kod
WHERE "Tätorter".namn = 'Flurkmark';

3d) Vilka tätorter ligger i kommuner som har mindre än 3000 invånare?

SELECT "Tätorter".namn
FROM "Tätorter", Kommuner
WHERE "Tätorter".kommun = Kommuner.kod
AND Kommuner."folkmängd" < 3000;

(Ja, det finns fortfarande flera alternativa sätt att skriva SQL-frågan, men nu orkar jag bara skriva ett.)

3e) Vilka län innehåller minst en tätort som har mer än 100000 invånare?

SELECT "Län".namn
FROM "Län", Kommuner, "Tätorter"
WHERE "Län".kod = Kommuner."län"
AND Kommuner.kod = "Tätorter".kommun
AND "Tätorter"."folkmängd" > 100000;

3f) Vilka tätorter med mer än 1000 invånare ligger i kommuner som har mindre än 3000 invånare?

SELECT "Tätorter".namn
FROM "Tätorter", Kommuner
WHERE "Tätorter".kommun = Kommuner.kod
AND "Tätorter"."folkmängd" > 1000
AND Kommuner."folkmängd" < 3000;

3g) Vilka tätorter i Västerbottens län har mer än 1000 invånare och ligger i kommuner som har mindre än 4000 invånare?

SELECT "Tätorter".namn
FROM "Tätorter", Kommuner, "Län"
WHERE "Tätorter".kommun = Kommuner.kod
AND Kommuner."län" = "Län".kod
AND "Tätorter"."folkmängd" > 1000
AND Kommuner."folkmängd" < 4000
AND "Län".namn = 'Västerbottens län';

3h) Vad heter residensstaden i Kalmar län, och hur många personer bor det i den?

SELECT "Tätorter".namn, "Tätorter"."folkmängd"
FROM "Tätorter", "Län"
WHERE "Tätorter".kod = "Län".residensstad
AND "Län".namn = 'Kalmar län';

3i) I vilket län är Karlstad residensstad?

SELECT "Län".namn
FROM "Tätorter", "Län"
WHERE "Tätorter".kod = "Län".residensstad
AND "Tätorter".namn = 'Karlstad';

3j) Det finns en tätort som heter Löwenströmska lasarettet. Vad heter kommunen och länet som den ligger i?

SELECT Kommuner.namn, "Län".namn
FROM "Tätorter", Kommuner, "Län"
WHERE "Tätorter".namn = 'Löwenströmska lasarettet'
AND "Tätorter".kommun = Kommuner.kod
AND Kommuner."län" = "Län".kod;

3k) Finns det några kommuner som inte innehåller några tätorter? Vad heter de? (Kan det verkligen finnas kommuner utan tätorter? Vad skulle det kunna bero på?)

SELECT namn
FROM Kommuner
WHERE kod NOT IN (SELECT KOMMUN FROM "Tätorter");
En alternativ lösning:
SELECT Kommuner.namn
FROM Kommuner LEFT OUTER JOIN "Tätorter" ON "Tätorter".Kommun = Kommuner.kod
WHERE "Tätorter".kod IS NULL;

Ja, det finns kommuner utan tätorter i Sverige. Man skulle kanske gissa att det handlar om någon sorts ödemark i Norrland, men det visar sig att det bland annat gäller Sundbybergs kommun. Den som varit i Sundbyberg vet att den inte alls består av ödemark. Men tätorten Sundbyberg har växt ihop med tätorten Stockholm, som täcker hela Stockholms, Solna och Sundbybergs kommuner, samt delar av ytterligare åtta kommuner. I databasen står varje tätort bara med en gång, med hela sin befolkning, och då i den kommun där den huvudsakligen ligger, i det här fallet Stockholms kommun.

En viktig lärdom: Världen är ibland mer komplicerad än vad den ser ut att vara i ett databasschema!


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 17 oktober 2013