SQL Lernen mit der Filmdatenbank
In diesem Kurs lernst du Schritt für Schritt, wie du mit SQL Daten aus einer Datenbank abfragen kannst. Unsere Datenbank enthält Informationen über 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 über Daten durchführen
So funktioniert dieser Kurs
Arbeite die Kapitel der Reihe nach durch. Jedes Kapitel enthält:
- Theorie — Erklärungen der SQL-Konzepte
- Beispiele — Klicke auf ein Beispiel, um es im Editor auszuprobieren
- Übungen — Schreibe eigene Abfragen. Tipps und Lösungen helfen dir weiter.
Unsere Datenbank
Die Datenbank besteht aus 9 Tabellen. In der Seitenleiste links findest du das komplette Schema. Hier eine Übersicht der wichtigsten Beziehungen:
Probiere gleich deine erste Abfrage aus:
Übungen 0 / 3
SELECT — Daten abfragen
Mit dem SELECT-Befehl holst du Daten aus der Datenbank. Es ist der wichtigste und am häufigsten verwendete SQL-Befehl.
Grundaufbau einer Abfrage
Jede SQL-Abfrage hat mindestens zwei Teile:
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:
Bestimmte Spalten auswählen
Meistens brauchst du nicht alle Spalten. Gib einfach die gewünschten Spaltennamen an, getrennt durch Kommas:
Übungen 0 / 25
WHERE — Daten filtern
Mit WHERE kannst du bestimmen, welche Zeilen angezeigt werden sollen. Nur Zeilen, die die Bedingung erfüllen, erscheinen im Ergebnis.
Grundaufbau mit WHERE
FROM tabelle
WHERE bedingung
Vergleichsoperatoren
Du kannst Werte vergleichen mit:
=— gleich!=oder<>— ungleich<,>,<=,>=— kleiner, größer, ...
Textsuche mit LIKE
Mit LIKE kannst du nach Textmustern suchen. Das Prozentzeichen % steht für „beliebig viele Zeichen“:
LIKE 'A%'— beginnt mit ALIKE '%man'— endet mit „man“LIKE '%Star%'— enthält „Star“
Bedingungen kombinieren: AND, OR, NOT
Mehrere Bedingungen lassen sich verknüpfen:
BETWEEN und IN
BETWEEN prüft, ob ein Wert in einem Bereich liegt. IN prüft, ob ein Wert in einer Liste enthalten ist:
Übungen 0 / 25
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
ORDER BY spalte ASC|DESC
Ergebnisse begrenzen mit LIMIT
LIMIT begrenzt die Anzahl der zurückgegebenen Zeilen. Besonders nützlich in Kombination mit ORDER BY:
Übungen 0 / 10
Zählen von Daten (COUNT)
Lerne, wie du herausfindest, wie viele Einträge deine Tabellen haben und wie du Duplikate beim Zählen ignorierst.
Zeilen und Werte zählen
Die COUNT() Funktion ist oft die erste, die man braucht:
- COUNT(*) — zählt einfach alle Zeilen in einer Tabelle.
- COUNT(DISTINCT spalte) — zählt nur die unterschiedlichen Werte in einer Spalte. Duplikate werden ignoriert.
Übungen 0 / 20
Kleinste und größte Werte (MIN & MAX)
Finde die Extreme in der Datenbank.
Minimum und Maximum
Mit diesen Funktionen durchsuchst du eine Spalte nach dem höchsten oder niedrigsten Wert. Das Tolle daran: Sie funktionieren nicht nur bei Zahlen, sondern auch bei Jahreszahlen und sogar bei Texten (alphabetisch sortiert)!
- MIN(spalte) — findet den kleinsten Wert (z. B. das älteste Jahr, die kleinste Zahl, das erste Wort im Alphabet).
- MAX(spalte) — findet den größten Wert (z. B. das jüngste Jahr, die größte Zahl, das letzte Wort im Alphabet).
Übungen 0 / 18
Durchschnitt (AVG) und Summe (SUM)
Berechne Durchschnittswerte und Gesamtsummen direkt in deiner Datenbank.
Summe berechnen
Wenn in einer Spalte Zahlen sind, kannst du mit SUM (Summe) alle zahlen zusammen zählen.
- COUNT(spalte) — Zählt die Anzahl der Spalten!
- SUM(spalte) — Addiert alle Werte der Spalte zu einer Gesamtsumme zusammen.
- SUM(DISTINCT spalte) — Addiert nur die unterschiedlichen Werte zusammen.
Durchschnitt berechnen
Wenn du mit Zahlen arbeitest, kannst du mit AVG (Average) den Durchschnitt berechnen.
- AVG(spalte) — Berechnet den mathematischen Mittelwert aller Zahlen in dieser Spalte.
- AVG(DISTINCT spalte) — Berechnet nur den Durchschnitt aller unterschiedlichen Zahlen.
Übungen 0 / 21
Unterabfragen (Subqueries)
Lerne, wie du Abfragen ineinander verschachtelst, um komplexe Filterbedingungen zu erstellen.
Was ist eine Unterabfrage?
Eine Unterabfrage ist eine SELECT-Anweisung innerhalb einer anderen SELECT-Anweisung. Sie wird meistens in der WHERE-Klausel verwendet, um einen Wert zu berechnen, den man vorher nicht genau kennt.
- Die innere Abfrage (Subquery) wird zuerst ausgeführt.
- Ihr Ergebnis wird an die äußere Abfrage übergeben.
- Wichtig: Die innere Abfrage muss in Klammern stehen.
Unterabfragen mit Aggregaten
Besonders mächtig werden Unterabfragen in Kombination mit Funktionen wie MAX, MIN oder AVG. So kannst du Datensätze mit dem Durchschnitt oder Extremwerten vergleichen.
Übungen 0 / 20
Tabellen verknüpfen (Natürlicher Verbund)
Lerne, wie du Daten aus mehreren Tabellen zusammenführst, um komplexere Zusammenhänge abzufragen.
Der Natürliche Verbund
Bisher haben wir Daten immer nur aus einer einzigen Tabelle abgefragt. In echten Datenbanken sind Informationen aber meist auf mehrere Tabellen verteilt, um Wiederholungen zu vermeiden. Mit einem NATURAL JOIN (Natürlicher Verbund) kannst du zwei Tabellen automatisch miteinander verbinden. Das funktioniert immer dann, wenn beide Tabellen eine Spalte mit dem exakt gleichen Namen haben (wie zum Beispiel die Spalte LandID in den Tabellen Serie und Land oder RegieID bei Film und Regisseur).
- FROM tabelle1 NATURAL JOIN tabelle2 — Verbindet die beiden Tabellen anhand ihrer gleichnamigen Spalte nahtlos miteinander.
- Nach dem Verknüpfen kannst du auf die Spalten beider Tabellen zugreifen, als wären sie eine einzige große Tabelle.
- Du kannst den Verbund problemlos mit WHERE, AVG() oder anderen bekannten Funktionen kombinieren.
Übungen 0 / 22
Tabellen verknüpfen (INNER JOIN mit ON)
Lerne, Tabellen gezielt über selbst gewählte Spalten zu verknüpfen – auch wenn die Spaltennamen unterschiedlich sind.
INNER JOIN – der explizite Verbund
Der NATURAL JOIN aus Kapitel 8 ist praktisch, aber er hat eine Einschränkung: Er funktioniert nur, wenn beide Tabellen eine Spalte mit exakt demselben Namen haben. Was aber, wenn die Spalten inhaltlich zusammenpassen, aber unterschiedlich heißen? Zum Beispiel: In der Tabelle Folge heißt die Spalte Serie, in der Tabelle Serie heißt der Primärschlüssel aber Name. Ein NATURAL JOIN würde hier nicht funktionieren. Genau für diesen Fall gibt es den INNER JOIN mit ON: Du gibst selbst an, welche Spalten verknüpft werden sollen.
- FROM tabelle1 INNER JOIN tabelle2 ON tabelle1.spalte = tabelle2.spalte — Verbindet die Tabellen anhand der von dir angegebenen Spalten.
- Das Schlüsselwort INNER kann weggelassen werden — JOIN allein bedeutet dasselbe.
- Du kannst Spaltennamen mit dem Tabellennamen qualifizieren: Film.RegieID statt nur RegieID. Das ist besonders wichtig, wenn beide Tabellen eine gleichnamige Spalte haben.
- Der INNER JOIN gibt nur Zeilen zurück, bei denen in beiden Tabellen ein passender Wert existiert. Datensätze ohne Treffer (z. B. Filme ohne Regisseur) fallen heraus.
Übungen 0 / 23
Drei oder mehr Tabellen verbinden
Verknüpfe mehrere Tabellen in einer einzigen Abfrage, um komplexe Zusammenhänge auf einmal sichtbar zu machen.
Mehrere JOINs hintereinander
Manchmal reicht es nicht, zwei Tabellen zu verbinden. Wenn du zum Beispiel wissen willst, aus welchem Land die Reihe eines Films stammt, musst du drei Tabellen verknüpfen: Film → Reihe → Land. Das funktioniert, indem du einfach mehrere JOIN ... ON ... Blöcke hintereinander schreibst. Jeder neue JOIN baut auf dem Ergebnis des vorherigen auf.
Übungen 0 / 13
Äußerer Verbund (LEFT JOIN)
Lerne, wie du alle Datensätze einer Tabelle ausgibst – auch dann, wenn es in der verknüpften Tabelle keinen passenden Eintrag gibt.
Das Problem mit dem INNER JOIN
Ein INNER JOIN gibt nur die Zeilen zurück, bei denen in beiden Tabellen ein passender Wert vorhanden ist. Das klingt sinnvoll – hat aber einen Haken: Datensätze ohne Treffer verschwinden einfach aus dem Ergebnis. In unserer Datenbank haben einige Filme keinen Regisseur eingetragen (der Wert ist NULL). Ein Film INNER JOIN Regisseur würde diese Filme komplett ausblenden. Mit einem LEFT JOIN (auch: LEFT OUTER JOIN) bleiben dagegen alle Zeilen der linken Tabelle im Ergebnis – auch die ohne Treffer. Für die fehlenden Spalten der rechten Tabelle steht dann NULL.
- FROM tabelle1 LEFT JOIN tabelle2 ON ... — Alle Zeilen aus tabelle1 bleiben erhalten. Zeilen ohne Treffer in tabelle2 erhalten dort den Wert NULL.
- LEFT JOIN und LEFT OUTER JOIN sind gleichbedeutend — das Wort OUTER kann weggelassen werden.
- Mit WHERE spalte IS NULL findest du gezielt die Zeilen, bei denen kein Treffer gefunden wurde — zum Beispiel alle Filme ohne Regisseur.
- Mit WHERE spalte IS NOT NULL filterst du dagegen nur die Zeilen mit einem Treffer — das Ergebnis entspricht dann einem INNER JOIN.
Übungen 0 / 18
RIGHT JOIN, CROSS JOIN und die richtige Wahl
Lerne den RIGHT JOIN als Spiegelung des LEFT JOIN kennen, entdecke den CROSS JOIN und übe, in komplexeren Aufgaben selbst den richtigen Verbund zu wählen.
RIGHT JOIN – der Spiegel des LEFT JOIN
Ein RIGHT JOIN funktioniert genau wie ein LEFT JOIN – nur spiegelverkehrt: Alle Zeilen der rechten Tabelle bleiben erhalten, auch wenn es in der linken keinen passenden Eintrag gibt. Fehlende Werte auf der linken Seite erscheinen als NULL.
In der Praxis wird RIGHT JOIN selten verwendet, weil man jede RIGHT JOIN-Abfrage durch einfaches Tauschen der Tabellen als LEFT JOIN schreiben kann – mit identischem Ergebnis. Trotzdem ist es wichtig, ihn zu kennen, weil er in vorhandenem Code vorkommt und weil er dir hilft, JOIN-Richtungen sicher zu denken.
CROSS JOIN – das Kreuzprodukt
Ein CROSS JOIN verbindet jede Zeile der ersten Tabelle mit jeder Zeile der zweiten – ohne jede Bedingung. Das Ergebnis ist das kartesische Produkt: Hat Tabelle A 30 Zeilen und Tabelle B 3 Zeilen, entstehen 90 Ergebniszeilen. Es gibt kein ON. Der CROSS JOIN ist in der Praxis selten nützlich, erzeugt aber schnell riesige Ergebnismengen und ist gut geeignet, um alle denkbaren Kombinationen sichtbar zu machen.
FULL OUTER JOIN – ein kurzer Hinweis
Ein FULL OUTER JOIN würde alle Zeilen beider Tabellen ausgeben – auch dann, wenn auf keiner Seite ein Treffer existiert. MySQL unterstützt diesen JOIN leider nicht direkt. Er lässt sich jedoch mit UNION aus einem LEFT und einem RIGHT JOIN zusammensetzen – das ist aber ein fortgeschrittenes Thema.