Databasteknik: Lösningar till teoriövning 7

Uppgift 1

a)
SELECT COUNT(*) FROM Robotar;
b)
SELECT COUNT(*) FROM Robotar WHERE Färg = 'Blå';
Följdfråga: I vilken ordning görs COUNT och WHERE-villkoret?

c)

SELECT MAX(Nummer) FROM Robotar;
d)
SELECT Färg FROM Robotar WHERE Nummer = 3;
e)
SELECT Färg FROM Robotar WHERE Nummer = (SELECT MAX(Nummer) FROM Robotar);
Följdfråga: Hade det inte varit enklare att få fram numret så här:
SELECT Färg
From Robotar
ORDER BY Nummer DESC
LIMIT 1;

Uppgift 2

a)
SELECT Färg, COUNT(*) AS Antal
From Robotar
GROUP BY Färg;
b)
CREATE VIEW "Antal Robotar Per Färg" AS
SELECT Färg, COUNT(*) AS Antal
FROM Robotar
GROUP BY Färg;
c)
SELECT Färg
FROM "Antal Robotar Per Färg"
WHERE Antal = (SELECT MAX(Antal) FROM "Antal Robotar Per Färg");
Följdfrågor: Vad är en vy? Vilka skillnader är det mellan en vy och en tabell? Vilka likheter? Har en vy några nackdelar? Vad är en CTE (Common Table Expression)? Kunde man använt en CTE i stället för en vy?

Med en CTE (fungerar inte i den gamla Mimer-versionen som finns på basen.oru.se):

WITH "Antal Robotar Per Färg" AS
(SELECT Färg, COUNT(*) AS Antal
FROM Robotar
GROUP BY Färg)
SELECT Färg
FROM "Antal Robotar Per Färg"
WHERE Antal = (SELECT MAX(Antal) FROM "Antal Robotar Per Färg");

Uppgift 3

...

Uppgift 4

Implicit join:
SELECT Robotar.Nummer AS Robot, Strider.Datum, Deltagare.Resultat
FROM Robotar, Deltagare, Strider
WHERE Robotar.Nummer = Deltagare.Robot
AND Deltagare.Strid = Strider.Nummer;
Explicit join:
SELECT Robotar.Nummer AS Robot, Strider.Datum, Deltagare.Resultat
FROM Robotar JOIN Deltagare ON Robotar.Nummer = Deltagare.Robot
JOIN Strider ON Deltagare.Strid = Strider.Nummer;

Uppgift 5

...

Uppgift 6

Med en implicit join:
SELECT Robotar.Nummer AS Robot, COUNT(*) AS Antal
FROM Robotar, Deltagare
WHERE Robotar.Nummer = Deltagare.Robot
GROUP BY Robotar.Nummer;
Med en explicit join:
SELECT Robotar.Nummer AS Robot, COUNT(*) AS Antal
FROM Robotar JOIN Deltagare ON Robotar.Nummer = Deltagare.Robot
GROUP BY Robotar.Nummer;
Om man inser att det räcker med tabellen Deltagare, och då behövs ingen join alls:
SELECT Robot, COUNT(*) AS Antal
FROM Deltagare
GROUP BY Robot;

Uppgift 7

...

Uppgift 8

SELECT Robotar.Nummer AS Robot, COUNT(Deltagare.Robot) AS Antal
FROM Robotar LEFT JOIN Deltagare ON Robotar.Nummer = Deltagare.Robot
GROUP BY Robotar.Nummer;


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 24 november 2022