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 0 / 25

Zeige alle Daten der Tabelle Film an.
Zeige alle Daten der Tabelle Schauspieler an.
Zeige alle Regisseure an.
Zeige alle Daten der Tabelle Reihe an.
Zeige alle Daten der Tabelle Land an.
Zeige alle Daten der Tabelle Folge an.
Zeige alle Daten der Tabelle Serie an.
Zeige nur die Titel aller Filme.
Zeige nur die Nachnamen aller Regisseure.
Zeige nur die Namen aller Laender.
Zeige Vorname und Nachname aller Schauspieler. ★★
Zeige Titel und Bewertung aller Filme. ★★
Zeige Name und Einwohner aller Laender. ★★
Zeige Name und Staffeln aller Serien. ★★
Zeige Reihenname und Anzahl aller Filmreihen. ★★
Zeige Vorname und Nachname aller Regisseure. ★★
Zeige Titel und Laenge aller Filme. ★★
Zeige Titel und Jahr aller Filme. ★★
Zeige Titel, Staffel und Nummer aller Folgen. ★★
Zeige Vorname, Nachname und GebOrt aller Schauspieler. ★★
Zeige Titel, Dauer und Bewertung aller Filme. ★★
Zeige Titel, Jahr, Laenge und Bewertung aller Filme. ★★★
Zeige Vorname, Nachname, GebJahr und GebOrt aller Schauspieler. ★★★
Zeige Vorname, Nachname und GebJahr aller Regisseure. ★★★
Zeige Name, Einwohner und Sprache aller Laender. ★★★
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 0 / 25

Finde alle Filme, die im Jahr 2020 erschienen sind.
Finde alle Filme mit einer Bewertung hoeher als 8.
Finde alle Schauspieler, die nach dem Jahr 1970 geboren wurden.
Finde alle Laender, die weniger als 80 Millionen Einwohner haben.
Finde alle Filmreihen, die mehr oder genau 5 Filme haben.
Finde alle Serien mit mehr als 3 Staffeln.
Finde alle Folgen, die eine zweistellige Nummer haben.
Finde alle Filme, die keinen Regisseur haben (RegieID ist leer).
Finde alle Filme, die zu einer Reihe gehoeren (Reihe ist nicht leer).
Finde alle Schauspieler, deren Nachname mit „B“ beginnt. ★★
Finde alle Filme, deren Titel „Star“ enthaelt. ★★
Finde alle Schauspieler, deren Vorname mit „Ma“ beginnt. ★★
Finde alle Filme, deren Titel mit „ter“ aufhoert. ★★
Gib alle Regisseure aus, deren Geburtsjahr mit einer 6 endet. ★★
Gib alle Serien aus, deren Name genau zwoelf Zeichen lang ist. ★★
Gib alle Laender aus, deren Name ein Leerzeichen enthaelt. ★★
Finde alle Filme mit einer Bewertung ueber 8, die auf Netflix verfuegbar sind. ★★
Finde alle Schauspieler, die zwischen 1990 und 2000 geboren wurden. ★★
Finde alle Schauspieler mit Vornamen „Chris“, „Christopher“, „John“, „Jon“ oder „Mike“. ★★
Finde alle Folgen, die genau 60, 57 oder 54 Minuten lang sind. ★★
Finde alle Schauspieler, die in den Siebzigern (1970–1979) geboren wurden. ★★
Finde die Titel aller Folgen, die nicht zu „King of Queens“, „The IT Crowd“ oder „Two and a Half Men“ gehoeren. ★★
Finde alle Folgen mit einstelliger Nummer, die nicht in der ersten Staffel sind. ★★★
Finde alle Schauspieler, die vor dem Jahr 1970 geboren wurden, aber nicht in New York. ★★★
Finde alle Filme aus den Jahren 2018 bis 2022, die laenger als 120 Minuten sind. ★★★
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 0 / 10

Zeige alle Filme sortiert nach Bewertung (beste zuerst).
Zeige alle Schauspieler alphabetisch nach Nachname sortiert.
Zeige die 5 am besten bewerteten Filme (Titel und Bewertung).
Zeige die 3 laengsten Filme (Titel und Laenge).
Zeige die 10 am besten bewerteten Filme (Titel und Bewertung). ★★
Zeige die 3 aeltesten Regisseure mit Vorname, Nachname und Geburtsjahr. ★★
Zeige alle Filme sortiert nach Jahr (neueste zuerst), bei gleichem Jahr nach Bewertung (beste zuerst). ★★
Zeige die 5 kuerzesten Folgen mit Titel und Laenge. ★★
Zeige die 3 Serien mit den meisten Staffeln (Name und Staffeln). ★★★
Zeige die 5 aeltesten Schauspieler mit Vorname, Nachname und Geburtsjahr. ★★★
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 0 / 20

Zaehle alle Schauspieler.
Finde die hoechste Bewertung bei den Filmen.
Gib die durchschnittlichen Einwohner aller Laender aus.
Finde die niedrigste RegieID in den Folgen.
Finde das Jahr, in dem der aelteste Film gedreht wurde.
Finde das Geburtsjahr des juengsten Schauspielers.
Gib die durchschnittliche Laenge einer Folge aus.
Gib aus, wie lange alle Filme insgesamt dauern.
Finde den Titel des kuerzesten Films. ★★
Finde das Land mit den meisten Einwohnern. ★★
Finde den Nachnamen des juengsten Regisseurs. ★★
Wie viele Filme gibt es pro Streaming-Plattform (Online)? ★★
Wie viele Filme sind pro Jahr erschienen? ★★
Wie viele Folgen hat jede Serie? ★★
Welche Streaming-Plattformen haben mehr als 5 Filme? ★★
Wie viele Filme hat jede Filmreihe? Zeige nur Reihen mit mehr als einem Film. ★★
Welches Jahr hat die hoechste durchschnittliche Filmbewertung? ★★★
Finde die Titel der kuerzesten und laengsten Folgen. ★★★
Finde den Titel und den Seriennamen der aeltesten Folge. ★★★
Welche Sprachen werden in mehr als einem Land gesprochen? ★★★
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 0 / 15

Zeige alle Filme mit dem Vor- und Nachnamen ihres Regisseurs. ★★
Zeige alle Serien mit dem Namen des Landes, in dem sie produziert wurden. ★★
Zeige alle Schauspieler und die Filmtitel, in denen sie mitspielen. ★★
Finde den Titel und die Laenge aller Filme, in denen „Kevin James“ mitspielt. ★★
Finde alle Schauspieler, die in einem Film mit einer Bewertung von genau 6.5 mitgespielt haben. ★★
Finde alle Seriennamen, in denen ein Schauspieler mit dem Nachnamen „Jones“ mitgespielt hat. ★★
Zeige alle Filme mit dem Namen des Landes ihrer Filmreihe. ★★
Finde alle Folgen, in denen „Holland Taylor“ mitgespielt hat. ★★
Finde die Namen aller Schauspieler, die in einer Folge aus dem Jahr 2007 mitgespielt haben. ★★★
Gib alle Filmtitel aus, die nicht vom Regisseur „Steven Spielberg“ sind (ueber JOIN). ★★★
Zeige alle Schauspieler mit Filmtitel und Bewertung der Filme, in denen sie mitspielen (zwei JOINs). ★★★
Welcher Regisseur hat die meisten Filme gedreht? Zeige Name und Anzahl. ★★★
Zeige alle Filme mit Regisseur-Nachname und Reihenname (auch Filme ohne Reihe sollen erscheinen). ★★★
Finde Titel und Laenge aller Filme von „Frank Coraci“ oder Filme unter 100 Minuten mit Bewertung ueber 5. ★★★
Gib alle Seriennamen aus, von Serien mit mehr als 10 Staffeln oder einer Bewertung ueber 9.0. ★★★
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 0 / 15

Zeige alle verschiedenen Geburtsorte der Schauspieler (ohne Doppelte). ★★
Zeige alle verschiedenen Streaming-Plattformen (ohne Doppelte). ★★
Zeige alle verschiedenen Sprachen der Laender (ohne Doppelte). ★★
Zeige Titel, Bewertung als „Note“ und Laenge als „Dauer“ aller Filme. ★★
Zaehle die Anzahl der Filme und nenne die Spalte „Anzahl_Filme“. ★★
Verwende Tabellen-Aliase: Zeige Filmtitel und Regisseur-Nachname mit kurzen Alias-Namen (f, r). ★★
Finde alle Filme, deren Bewertung ueber dem Durchschnitt aller Filme liegt. ★★★
Finde den laengsten Film (mit einer Unterabfrage). ★★★
Zeige alle Schauspieler, die in mindestens einem Film mitspielen (mit IN-Unterabfrage). ★★★
Zaehle alle Filme mit Bewertung ueber 5.0 und einem Regisseur, der vor 1980 geboren wurde. ★★★
Finde alle Filmtitel mit Bewertung unter dem Durchschnitt, sowie (falls vorhanden) den Reihennamen und den Landnamen. ★★★
Finde alle Schauspieler, die vor 1970 geboren wurden und deren Nachname mit „s“ endet, sowie deren Filmtitel. ★★★
Zaehle alle unterschiedlichen Folgen, in denen Kevin James, Charlie Sheen oder Holland Taylor zu sehen sind. ★★★
Finde den laengsten Film jeder Filmreihe. Zeige Reihe, Titel und Laenge. ★★★
Zeige alle Laender, die sowohl Filmreihen als auch Serien produziert haben. ★★★