Willkommen

SQL Lernen mit der Filmdatenbank

In diesem Kurs lernst du Schritt fuer Schritt, wie du mit SQL Daten aus einer Datenbank abfragen kannst. Unsere Datenbank enthaelt Informationen ueber Filme, Serien, Schauspieler und Regisseure.

Was ist SQL?

SQL (Structured Query Language) ist die Sprache, mit der man Datenbanken abfragt. Mit SQL kannst du:

  • Daten aus Tabellen abrufen (SELECT)
  • Daten filtern und sortieren
  • Daten aus mehreren Tabellen kombinieren
  • Berechnungen ueber Daten durchfuehren

So funktioniert dieser Kurs

Arbeite die Kapitel der Reihe nach durch. Jedes Kapitel enthaelt:

  • Theorie — Erklaerungen der SQL-Konzepte
  • Beispiele — Klicke auf ein Beispiel, um es im Editor auszuprobieren
  • Uebungen — Schreibe eigene Abfragen. Tipps und Loesungen helfen dir weiter.
Tipp: Der SQL-Editor ist immer am unteren Rand sichtbar. Klicke auf ein Beispiel oder schreibe deine eigene Abfrage und druecke Strg+Enter zum Ausfuehren.

Unsere Datenbank

Die Datenbank besteht aus 9 Tabellen. In der Seitenleiste links findest du das komplette Schema. Hier eine Uebersicht der wichtigsten Beziehungen:

Film Regisseur (ueber RegieID)
Film Reihe (gehoert zu einer Filmreihe)
Reihe / Serie Land (gedreht in einem Land)
Schauspieler Film / Folge (ueber spieltInFilm / spieltInFolge)
Folge Serie (gehoert zu einer Serie)

Probiere gleich deine erste Abfrage aus:

SELECT * FROM Film
Kapitel 1

SELECT — Daten abfragen

Mit dem SELECT-Befehl holst du Daten aus der Datenbank. Es ist der wichtigste und am haeufigsten verwendete SQL-Befehl.

Grundaufbau einer Abfrage

Jede SQL-Abfrage hat mindestens zwei Teile:

SELECT spalte1, spalte2, ...
FROM tabellenname
  • SELECT bestimmt, welche Spalten angezeigt werden
  • FROM bestimmt, aus welcher Tabelle die Daten kommen

Alle Spalten abfragen mit *

Das Sternchen * bedeutet „alle Spalten“. So bekommst du die komplette Tabelle:

SELECT * FROM Film
SELECT * FROM Schauspieler
SELECT * FROM Land

Bestimmte Spalten auswaehlen

Meistens brauchst du nicht alle Spalten. Gib einfach die gewuenschten Spaltennamen an, getrennt durch Kommas:

SELECT Titel, Jahr, Bewertung FROM Film
SELECT Vorname, Nachname FROM Schauspieler
SELECT Name, Staffeln FROM Serie

Uebungen

1 Zeige alle Regisseure an. Leicht
Verwende SELECT * und die Tabelle Regisseur.
SELECT * FROM Regisseur
2 Zeige nur die Namen und Einwohnerzahlen aller Laender. Leicht
Waehle nur die Spalten Name und Einwohner aus der Tabelle Land.
SELECT Name, Einwohner FROM Land
3 Zeige Titel und Bewertung aller Filme. Leicht
Verwende SELECT Titel, Bewertung FROM ...
SELECT Titel, Bewertung FROM Film
4 Zeige Titel, Staffel und Nummer aller Folgen. Leicht
Verwende die Tabelle Folge mit drei Spalten.
SELECT Titel, Staffel, Nummer FROM Folge
Kapitel 2

WHERE — Daten filtern

Mit WHERE kannst du bestimmen, welche Zeilen angezeigt werden sollen. Nur Zeilen, die die Bedingung erfuellen, erscheinen im Ergebnis.

Grundaufbau mit WHERE

SELECT spalten
FROM tabelle
WHERE bedingung

Vergleichsoperatoren

Du kannst Werte vergleichen mit:

  • = — gleich
  • != oder <> — ungleich
  • <, >, <=, >= — kleiner, groesser, ...
SELECT * FROM Film WHERE Jahr = 2020
SELECT * FROM Film WHERE Bewertung > 8
SELECT * FROM Schauspieler WHERE GebJahr < 1970

Textsuche mit LIKE

Mit LIKE kannst du nach Textmustern suchen. Das Prozentzeichen % steht fuer „beliebig viele Zeichen“:

  • LIKE 'A%' — beginnt mit A
  • LIKE '%man' — endet mit „man“
  • LIKE '%Star%' — enthaelt „Star“
SELECT * FROM Film WHERE Titel LIKE '%Star%'
SELECT * FROM Schauspieler WHERE Nachname LIKE 'S%'

Bedingungen kombinieren: AND, OR, NOT

Mehrere Bedingungen lassen sich verknuepfen:

SELECT * FROM Film WHERE Bewertung > 7 AND Jahr > 2015
SELECT * FROM Film WHERE Jahr = 2019 OR Jahr = 2020
SELECT * FROM Film WHERE NOT Online = 'Netflix'

BETWEEN und IN

BETWEEN prueft, ob ein Wert in einem Bereich liegt. IN prueft, ob ein Wert in einer Liste enthalten ist:

SELECT * FROM Film WHERE Jahr BETWEEN 2010 AND 2020
SELECT * FROM Land WHERE Sprache IN ('Deutsch', 'Englisch')

Uebungen

1 Zeige alle Filme, die nach 2015 erschienen sind. Leicht
Verwende WHERE Jahr > 2015.
SELECT * FROM Film WHERE Jahr > 2015
2 Finde alle Schauspieler, deren Nachname mit „B“ beginnt. Leicht
Verwende LIKE 'B%' auf die Spalte Nachname.
SELECT * FROM Schauspieler WHERE Nachname LIKE 'B%'
3 Zeige alle Filme mit einer Bewertung ueber 8, die auf Netflix verfuegbar sind. Mittel
Kombiniere zwei Bedingungen mit AND.
SELECT * FROM Film WHERE Bewertung > 8 AND Online = 'Netflix'
4 Finde alle Serien mit mehr als 3 Staffeln. Leicht
Verwende WHERE Staffeln > 3 auf die Tabelle Serie.
SELECT * FROM Serie WHERE Staffeln > 3
5 Zeige alle Filme aus den Jahren 2018 bis 2022, die laenger als 120 Minuten sind. Mittel
Kombiniere BETWEEN fuer das Jahr mit AND und Laenge > 120.
SELECT * FROM Film WHERE Jahr BETWEEN 2018 AND 2022 AND Laenge > 120
Kapitel 3

ORDER BY & LIMIT — Sortieren und Begrenzen

Bringe deine Ergebnisse in die richtige Reihenfolge und begrenze die Anzahl der angezeigten Zeilen.

Sortieren mit ORDER BY

Mit ORDER BY sortierst du die Ergebnisse nach einer oder mehreren Spalten:

  • ASC — aufsteigend (Standard, kann weggelassen werden)
  • DESC — absteigend
SELECT spalten FROM tabelle
ORDER BY spalte ASC|DESC
SELECT Titel, Bewertung FROM Film ORDER BY Bewertung DESC
SELECT * FROM Schauspieler ORDER BY Nachname ASC
SELECT * FROM Film ORDER BY Jahr DESC, Bewertung DESC

Ergebnisse begrenzen mit LIMIT

LIMIT begrenzt die Anzahl der zurueckgegebenen Zeilen. Besonders nuetzlich in Kombination mit ORDER BY:

SELECT Titel, Bewertung FROM Film ORDER BY Bewertung DESC LIMIT 5
SELECT * FROM Film ORDER BY Laenge DESC LIMIT 3
Hinweis: LIMIT steht immer ganz am Ende der Abfrage!

Uebungen

1 Zeige die 10 am besten bewerteten Filme (Titel und Bewertung). Leicht
Sortiere nach Bewertung DESC und begrenze mit LIMIT 10.
SELECT Titel, Bewertung FROM Film ORDER BY Bewertung DESC LIMIT 10
2 Zeige die 5 laengsten Filme. Leicht
Sortiere nach Laenge DESC.
SELECT Titel, Laenge FROM Film ORDER BY Laenge DESC LIMIT 5
3 Zeige alle Schauspieler alphabetisch nach Nachname sortiert. Leicht
Verwende ORDER BY Nachname (ASC ist Standard).
SELECT Vorname, Nachname FROM Schauspieler ORDER BY Nachname
4 Zeige die 3 aeltesten Regisseure (nach Geburtsjahr). Mittel
Die aeltesten haben das kleinste Geburtsjahr → ORDER BY GebJahr ASC.
SELECT Vorname, Nachname, GebJahr FROM Regisseur ORDER BY GebJahr ASC LIMIT 3
Kapitel 4

Aggregatfunktionen & GROUP BY

Berechne Zusammenfassungen ueber deine Daten: zaehle, summiere und bilde Durchschnitte.

Aggregatfunktionen

Diese Funktionen fassen mehrere Zeilen zu einem einzigen Ergebnis zusammen:

  • COUNT(*) — zaehlt die Anzahl der Zeilen
  • AVG(spalte) — berechnet den Durchschnitt
  • SUM(spalte) — berechnet die Summe
  • MIN(spalte) — findet den kleinsten Wert
  • MAX(spalte) — findet den groessten Wert
SELECT COUNT(*) FROM Film
SELECT AVG(Bewertung) FROM Film
SELECT MIN(GebJahr), MAX(GebJahr) FROM Schauspieler

Gruppieren mit GROUP BY

Mit GROUP BY fasst du Zeilen zusammen, die in einer Spalte den gleichen Wert haben. Damit kannst du z.B. zaehlen, wie viele Filme pro Jahr erschienen sind:

SELECT spalte, COUNT(*)
FROM tabelle
GROUP BY spalte
SELECT Jahr, COUNT(*) FROM Film GROUP BY Jahr
SELECT Online, COUNT(*) FROM Film GROUP BY Online
SELECT Sprache, COUNT(*) FROM Land GROUP BY Sprache

Gruppen filtern mit HAVING

HAVING ist wie WHERE, aber fuer gruppierte Ergebnisse. Es filtert nach der Gruppierung:

Regel: WHERE filtert einzelne Zeilen vor der Gruppierung. HAVING filtert Gruppen nach der Gruppierung.
SELECT Jahr, COUNT(*) FROM Film GROUP BY Jahr HAVING COUNT(*) > 2
SELECT Reihe, COUNT(*) FROM Film GROUP BY Reihe HAVING COUNT(*) > 1

Uebungen

1 Wie viele Schauspieler gibt es insgesamt? Leicht
Verwende COUNT(*) auf die Tabelle Schauspieler.
SELECT COUNT(*) FROM Schauspieler
2 Was ist die durchschnittliche Bewertung aller Filme? Leicht
Verwende AVG(Bewertung).
SELECT AVG(Bewertung) FROM Film
3 Wie viele Filme gibt es pro Streaming-Plattform (Online)? Mittel
Gruppiere nach Online und zaehle mit COUNT(*).
SELECT Online, COUNT(*) FROM Film GROUP BY Online
4 Welche Streaming-Plattformen haben mehr als 5 Filme? Mittel
Erweitere die vorherige Abfrage mit HAVING COUNT(*) > 5.
SELECT Online, COUNT(*) FROM Film GROUP BY Online HAVING COUNT(*) > 5
5 Welches Jahr hat die hoechste durchschnittliche Filmbewertung? Schwer
Gruppiere nach Jahr, berechne AVG(Bewertung), sortiere absteigend und nimm nur das erste Ergebnis.
SELECT Jahr, AVG(Bewertung) FROM Film GROUP BY Jahr ORDER BY AVG(Bewertung) DESC LIMIT 1
Kapitel 5

JOINs — Tabellen verknuepfen

Die wahre Staerke von SQL: Kombiniere Daten aus mehreren Tabellen zu einem Ergebnis.

Warum JOINs?

In unserer Datenbank sind die Informationen auf mehrere Tabellen verteilt. Ein Film hat z.B. eine RegieID, aber der Name des Regisseurs steht in der Tabelle Regisseur. Um beides zusammen anzuzeigen, brauchen wir einen JOIN.

INNER JOIN

Der INNER JOIN verbindet zwei Tabellen ueber eine gemeinsame Spalte. Nur Zeilen, die in beiden Tabellen einen passenden Wert haben, erscheinen im Ergebnis:

SELECT spalten
FROM tabelle1
JOIN tabelle2 ON tabelle1.spalte = tabelle2.spalte
SELECT Film.Titel, Regisseur.Vorname, Regisseur.Nachname FROM Film JOIN Regisseur ON Film.RegieID = Regisseur.RegieID
SELECT Serie.Name, Land.Name FROM Serie JOIN Land ON Serie.LandID = Land.LandID
Hinweis: Wenn Spaltennamen in beiden Tabellen gleich sind (z.B. Name), musst du den Tabellennamen voranstellen: Serie.Name, Land.Name.

Mehrere JOINs

Du kannst auch mehr als zwei Tabellen verknuepfen, indem du mehrere JOINs hintereinander schreibst:

SELECT Schauspieler.Vorname, Schauspieler.Nachname, spieltInFilm.Filmtitel FROM Schauspieler JOIN spieltInFilm ON Schauspieler.ActorID = spieltInFilm.ActorID
SELECT Film.Titel, Regisseur.Nachname, Reihe.Reihenname FROM Film JOIN Regisseur ON Film.RegieID = Regisseur.RegieID JOIN Reihe ON Film.Reihe = Reihe.Reihenname

LEFT JOIN

Ein LEFT JOIN zeigt alle Zeilen der linken Tabelle, auch wenn es keinen passenden Eintrag in der rechten Tabelle gibt. Fehlende Werte werden mit NULL gefuellt:

SELECT Film.Titel, Reihe.Reihenname FROM Film LEFT JOIN Reihe ON Film.Reihe = Reihe.Reihenname
Unterschied: Bei einem INNER JOIN wuerden Filme ohne Reihe fehlen. Beim LEFT JOIN sind sie dabei — mit NULL bei Reihenname.

Uebungen

1 Zeige alle Filme mit dem Vor- und Nachnamen ihres Regisseurs. Mittel
Verknuepfe Film mit Regisseur ueber RegieID.
SELECT Film.Titel, Regisseur.Vorname, Regisseur.Nachname FROM Film JOIN Regisseur ON Film.RegieID = Regisseur.RegieID
2 Zeige alle Schauspieler und die Filmtitel, in denen sie mitspielen. Mittel
Verwende die Verbindungstabelle spieltInFilm und verknuepfe ueber ActorID.
SELECT Schauspieler.Vorname, Schauspieler.Nachname, spieltInFilm.Filmtitel FROM Schauspieler JOIN spieltInFilm ON Schauspieler.ActorID = spieltInFilm.ActorID
3 Zeige alle Serien mit dem Namen des Landes, in dem sie produziert wurden. Mittel
Verknuepfe Serie mit Land ueber LandID.
SELECT Serie.Name, Land.Name FROM Serie JOIN Land ON Serie.LandID = Land.LandID
4 Welcher Regisseur hat die meisten Filme gedreht? Zeige Name und Anzahl. Schwer
Kombiniere JOIN mit GROUP BY und ORDER BY. Verknuepfe Film mit Regisseur, gruppiere nach Regisseur und zaehle.
SELECT Regisseur.Vorname, Regisseur.Nachname, COUNT(*) AS Anzahl FROM Film JOIN Regisseur ON Film.RegieID = Regisseur.RegieID GROUP BY Regisseur.RegieID ORDER BY Anzahl DESC LIMIT 1
5 Zeige alle Schauspieler, die in Filmen mitspielen, zusammen mit dem Filmtitel und der Bewertung des Films. Schwer
Du brauchst zwei JOINs: Schauspieler → spieltInFilm → Film.
SELECT Schauspieler.Vorname, Schauspieler.Nachname, Film.Titel, Film.Bewertung FROM Schauspieler JOIN spieltInFilm ON Schauspieler.ActorID = spieltInFilm.ActorID JOIN Film ON spieltInFilm.Filmtitel = Film.Titel
Kapitel 6

Fortgeschrittene Abfragen

Lerne weitere nuetzliche SQL-Techniken: Unterabfragen, DISTINCT und Aliase.

DISTINCT — Doppelte entfernen

DISTINCT entfernt doppelte Zeilen aus dem Ergebnis:

SELECT DISTINCT GebOrt FROM Schauspieler
SELECT DISTINCT Online FROM Film
SELECT DISTINCT Sprache FROM Land

Aliase mit AS

Mit AS gibst du Spalten oder Tabellen einen Kurznamen (Alias). Das macht Ergebnisse lesbarer und Abfragen kuerzer:

SELECT Titel, Bewertung AS Note, Laenge AS Dauer FROM Film
SELECT COUNT(*) AS Anzahl_Filme FROM Film
SELECT f.Titel, r.Nachname FROM Film f JOIN Regisseur r ON f.RegieID = r.RegieID
Tipp: Tabellen-Aliase (wie f fuer Film) machen lange JOINs viel uebersichtlicher!

Unterabfragen (Subqueries)

Eine Unterabfrage ist eine SELECT-Abfrage innerhalb einer anderen Abfrage. Sie wird in Klammern geschrieben und kann ueberall stehen, wo ein Wert erwartet wird:

SELECT spalten FROM tabelle
WHERE spalte > (SELECT AVG(spalte) FROM tabelle)
SELECT Titel, Bewertung FROM Film WHERE Bewertung > (SELECT AVG(Bewertung) FROM Film)
SELECT * FROM Film WHERE Laenge = (SELECT MAX(Laenge) FROM Film)
SELECT Vorname, Nachname FROM Schauspieler WHERE ActorID IN (SELECT ActorID FROM spieltInFilm)

Uebungen

1 Zeige alle verschiedenen Geburtsorte der Schauspieler (ohne Doppelte). Leicht
Verwende SELECT DISTINCT auf GebOrt.
SELECT DISTINCT GebOrt FROM Schauspieler
2 Finde alle Filme, deren Bewertung ueber dem Durchschnitt liegt. Mittel
Berechne den Durchschnitt in einer Unterabfrage: (SELECT AVG(Bewertung) FROM Film).
SELECT Titel, Bewertung FROM Film WHERE Bewertung > (SELECT AVG(Bewertung) FROM Film) ORDER BY Bewertung DESC
3 Zeige alle Schauspieler, die in mindestens einem Film mitspielen. Mittel
Verwende WHERE ActorID IN (SELECT ...) mit der Tabelle spieltInFilm.
SELECT Vorname, Nachname FROM Schauspieler WHERE ActorID IN (SELECT ActorID FROM spieltInFilm)
4 Finde den laengsten Film jeder Filmreihe. Zeige Reihe, Titel und Laenge. Schwer
Verwende eine Unterabfrage mit MAX(Laenge) gruppiert nach Reihe, oder einen JOIN auf eine gruppierte Unterabfrage.
SELECT f.Reihe, f.Titel, f.Laenge FROM Film f WHERE f.Laenge = (SELECT MAX(f2.Laenge) FROM Film f2 WHERE f2.Reihe = f.Reihe) AND f.Reihe IS NOT NULL
5 Zeige alle Laender, die sowohl Filmreihen als auch Serien produziert haben. Schwer
Verwende zwei IN-Unterabfragen: eine fuer Reihe.LandID und eine fuer Serie.LandID.
SELECT Name FROM Land WHERE LandID IN (SELECT LandID FROM Reihe) AND LandID IN (SELECT LandID FROM Serie)