SQL: SELECT

Die SELECT-Anweisung startet eine Abfrage und liefert als Ergebnis Datensätze zurück. Die SELECT-Syntax sieht wie folgt aus (unvollständig, optionale Angaben in eckiger Klammer, mögliche mehrfache Angaben durch ‚+’ gekennzeichnet):

SELECT [DISTINCT] Auswahlliste
 FROM Quelle
 [WHERE Where-Klausel]
 [GROUP BY (Group-by-Attribut)+
  [HAVING Having-Klausel]]
 [ORDER BY (Sortierungsattribut [ASC|DESC])+];
  • DISTINCT gibt an, dass aus der Ergebnisrelation gleiche Ergebnistupel entfernt werden sollen. Es wird also jeder Datensatz nur einmal ausgegeben, auch wenn er mehrfach in der Tabelle vorkommt.
  • «Auswahlliste» bestimmt, welche Spalten der Quelle auszugeben sind (* für alle) und ob Aggregatsfunktionen anzuwenden sind. Wie bei allen anderen Aufzählungen werden die einzelnen Elemente mit Komma voneinander getrennt.
  • «Quelle» gibt an, wo die Daten herkommen. Es können Relationen und Sichten (VIEW) angegeben werden und miteinander als kartesisches Produkt oder als Verbund (JOIN) verknüpft werden. Mit der zusätzlichen Angabe eines Namens können Tupelvariablen besetzt werden, d. h. Relationen für die Abfrage umbenannt werden.
  • «Where»-Klausel bestimmt Bedingungen, unter denen die Daten ausgegeben werden sollen. In SQL ist hier auch die Angabe von Unterabfragen möglich, so dass SQL streng relational vollständig wird.
  • «Group-by-Attribut» legt fest, ob unterschiedliche Werte als einzelne Zeilen ausgegeben werden sollen (GROUP BY = Gruppierung) oder aber die Feldwerte der Zeilen durch Addition (SUM), Durchschnitt (AVG), Minimum (MIN), Maximum (MAX) o.ä. zu einem Ergebniswert zusammengefasst werden, der sich dann auf die Gruppierung bezieht.
  • «Having-Klausel» ist wie die Where-Klausel, nur dass sich die angegebene Bedingung auf das Ergebnis einer Aggregationsfunktion bezieht (z. B. HAVING SUM (Betrag) > 0).
  • «Sortierungsattribut»: nach ORDER BY werden Attribute angegeben, nach denen sortiert werden soll. ASC gibt dabei aufsteigende (Standard), DESC absteigende Sortierung an.

Führe die folgenden SQL-Select-Abfragen auf unsere bereits bekannte Film-DB aus und überlege dir wie die Resultate zustande kommen.

Die SQL-Abfragen kannst du hier ausführen.

SELECT * FROM movies;
SELECT * FROM actors;
SELECT * FROM movies ORDER BY title;
SELECT * FROM movies ORDER BY title DESC;
SELECT name FROM actors WHERE sex = "w";
SELECT title FROM movies WHERE year > 2014;
SELECT name FROM actors WHERE name = "%el%";
SELECT name FROM actors WHERE name LIKE "%el%";
SELECT title FROM movies WHERE title = "Spotlight";
SELECT title FROM movies WHERE title LIKE "Spotlight";
SELECT movies.id, title, rank
    FROM movies JOIN ratings
    ON movies.id = ratings.movie_id;
SELECT *
    FROM movies
        JOIN movies2actors ON movies.id = movies2actors.movie_id
        JOIN actors ON actors.id = movies2actors.actor_id;
SELECT SUM(votes) FROM ratings;
SELECT SUM(votes) as total FROM ratings;
SELECT sex, COUNT(*) FROM actors
   GROUP BY actors.sex;
SELECT title, COUNT(movies2actors.actor_id) as count_actors
    FROM movies
        JOIN movies2actors ON movies.id = movies2actors.movie_id
    GROUP BY movies.id;
SELECT name, COUNT(movies.id) as count_movies
    FROM actors
        JOIN movies2actors ON actors.id = movies2actors.actor_id
        JOIN movies ON movies.id = movies2actors.movie_id
    GROUP BY actors.id
    HAVING COUNT(movies.id) > 1;
SELECT actors.name, AVG(rank)
    FROM movies
        JOIN movies2actors ON movies.id = movies2actors.movie_id
        JOIN actors ON actors.id = movies2actors.actor_id
        JOIN ratings ON movies.id = ratings.movie_id
    GROUP BY actors.id
    ORDER BY AVG(rank);

Schreibe SQL-Select-Abfragen für die folgenden Fragen (siehe Aufgabe Kapitel «Relationale Datenbanksysteme»):

  1. In welchen Filmen hat Michael Keaton mitgespielt?
  2. Findest du ein Zitat aus dem Film mit der höchsten Bewertung (ranking so tief wie möglich)?
  3. Welche Schauspieler haben im Film «Spotlight» mitgespielt?
  1. SELECT title, name FROM actors
    JOIN movies2actors ON actors.id = movies2actors.actor_id
    JOIN movies ON movies.id = movies2actors.movie_id
    WHERE name LIKE "Michael Keaton"
  2. SELECT title, quotetext FROM movies
    JOIN ratings ON movies.id = ratings.movie_id
    LEFT JOIN quotes ON movies.id = quotes.movie_id
    ORDER BY rank ASC
  3. SELECT title, name FROM actors
    JOIN movies2actors ON actors.id = movies2actors.actor_id
    JOIN movies ON movies.id = movies2actors.movie_id
    WHERE title = "Spotlight"