Tennisdatenbank
Die Aufgaben der Übungsblätter 1 und 3 behandeln eine Datenbank, die ein Tennis-Match erfassen kann. Hierzu wurde dann in Übungblatt 3 die folgende Struktur vorgegeben:
- Spieler (ID, Name), Key(ID)
- Schlag (Satznr, Spielnr, Punktnr, Schlagnr, Schlagart, Typ, Fehler), Key(Satznr, Spielnr, Punktnr, Schlagnr)
- Aufschlag (Satznr, Spielnr, SpielerID), Key(Satznr, Spielnr)
Aufgabe 2
Aus dieser Struktur ergibt sich der SQL-Dump (bzw. MySQL-Dump) folgender Tabellen. Achtung: Ich habe die Anforderungen beider Übungsblätter zusammengeworfen.
CREATE DATABASE IF NOT EXISTS tennis; USE tennis; CREATE TABLE spieler ( id INT NOT NULL, name VARCHAR(50) NOT NULL, PRIMARY KEY(id) ); CREATE TABLE aufschlag ( satznr INT NOT NULL, spielnr INT NOT NULL, spielerid INT NOT NULL, PRIMARY KEY(satznr, spielnr), FOREIGN KEY(spielerid) REFERENCES spieler(id) ); CREATE TABLE schlag ( satznr INT NOT NULL, spielnr INT NOT NULL, punktnr INT NOT NULL, schlagnr INT NOT NULL, x INT NOT NULL, y INT NOT NULL, zeitpunkt DATETIME NOT NULL, typ VARCHAR(20) NOT NULL, schlagart VARCHAR(20) NOT NULL, fehler TINYINT(1) NOT NULL, PRIMARY KEY(satznr, spielnr, punktnr, schlagnr), FOREIGN KEY(satznr, spielnr) REFERENCES aufschlag(satznr, spielnr) );
Aufgabe 3
Spiele, in denen Volleys gespielt wurden
SELECT DISTINCT aufschlag.satznr, aufschlag.spielnr FROM aufschlag, schlag WHERE schlag.typ = 'Volley' AND schlag.spielnr = aufschlag.spielnr AND schlag.satznr = aufschlag.satznr ;
Spieler mit dem ersten Aufschlag des Matches
SELECT spieler.name FROM aufschlag, spieler WHERE aufschlag.satznr = 1 AND aufschlag.spielnr = 1 AND aufschlag.spielerid = spieler.id ;
Anzahl der gespielten Schläge pro Satz
SELECT
aufschlag.satznr, count(*) AS schlaganzahl
FROM
aufschlag, schlag
WHERE
aufschlag.spielnr = schlag.spielnr
AND aufschlag.satznr = schlag.satznr
GROUP BY
aufschlag.satznr
;
Punkte, in denen der Spieler Sampras einen Volley gespielt hat
SELECT aufschlag.satznr, aufschlag.spielnr AS spielnr, schlag.punkt FROM schlag, aufschlag WHERE aufschlag.spielnr = schlag.spielnr AND aufschlag.satznr = schlag.satznr AND schlag.typ = 'Volley' AND (schlag.schlagnr MOD 2) = (aufschlag.spielerid = (SELECT id FROM spieler WHERE name = 'Sampras')) ;
Aufgabe 5
Spiele ohne Volleys
SELECT satznr, spielnr FROM schlag WHERE schlag.Typ <> 'Volley' GROUP BY schlag.Satznr, schlag.Spielnr HAVING count(*) > 0
Punkte mit mind. 10 Rückhandschlägen
SELECT satznr, spielnr, punktnr FROM schlag WHERE schlag.Schlagart = 'Rückhand' GROUP BY satznr, spielnr, punktnr HAVING count(*) >= 10
Punkte, die Sampras trotz gegnerischem Aufschlag gewonnen hat. Teilweise fehlerhaft (2,5 von 3 Punkten)
SELECT
schlag.satznr, schlag.spielnr, schlag.punktnr
FROM
aufschlag,
(
SELECT
satznr, spielnr, punktnr, max(schlagnr) AS schlagnr, fehler
FROM
schlag
GROUP BY
satznr, schlagnr, punktnr
) AS schlag,
spieler as asspieler
WHERE
aufschlag.Satznr = schlag.satznr
AND aufschlag.Spielnr = schlag.Spielnr
AND aufschlag.SpielerID = asspieler.ID
AND asspieler.name <> 'Sampras'
AND ((schlag.Schlagnr MOD 2) = schlag.Fehler)
GROUP BY
schlag.Satznr,
schlag.Spielnr,
schlag.Punktnr
Gewinner des Matches ermitteln. Teilweise fehlerhaft (2,5 von 3 Punkten). Korrekt wäre es, den letzten fehlerfreien Schlag zu berechnen, da dies laut Übungsleiter immer der Gewinner des Tennis-Matches ist.
SELECT
gewinner.name
FROM
(
SELECT
satznr, spielnr, punktnr, MAX(schlagnr) as lschlagnr
FROM
schlag
GROUP BY
satznr, spielnr, punktnr
) AS lschlag,
schlag,
aufschlag,
spieler AS gewinner
WHERE
aufschlag.Satznr = lschlag.satznr
AND aufschlag.Spielnr = lschlag.spielnr
AND schlag.satznr = lschlag.satznr
AND schlag.spielnr = lschlag.spielnr
AND schlag.punktnr = lschlag.punktnr
AND schlag.schlagnr = lschlag.lschlagnr
AND (
((schlag.fehler + schlag.schlagnr) MOD 2) = 1 AND aufschlag.SpielerID = gewinner.ID
OR
((schlag.fehler + schlag.schlagnr) MOD 2) = 0 AND aufschlag.SpielerID <> gewinner.ID
)
GROUP BY gewinner.name
ORDER BY count(*) DESC
LIMIT 1
Aufgabe 6
Einfügen des Spielern namens Sampras.
INSERT INTO spieler VALUES (3, "Sampras")
Den Spieler namens Becker in Müller umbenennen.
UPDATE spieler SET name = "Müller" WHERE name = "Becker"
Schlagart des zweiten Schlags des Matches auf Rückhand ändern. Annahme: Aufschlag wird immer angenommen.
UPDATE schlag SET schlagart = "Rückhand" WHERE satznr = 1 AND spielnr = 1 AND punktnr = 1 AND schlagnr = 2
Letzten Satz des Matches löschen.
DELETE FROM aufschlag WHERE satznr = (SELECT satznr FROM schlag ORDER BY satznr DESC LIMIT 1); DELETE FROM schlag WHERE satznr = ((SELECT satznr FROM aufschlag ORDER BY satznr DESC LIMIT 1) + 1)