Informatik

SQL lernen: Abfragen, JOINs und Datenänderungen

SQL lernen: Abfragen, JOINs und Datenänderungen
SQL lernen: Abfragen, JOINs und Datenänderungen
Für Quiz, Lückentext, Lernkarten und Fortschritt ist JavaScript nötig. Alle Inhalte und Lösungen bleiben direkt lesbar.

SQL ist eine Sprache, mit der du Daten in relationalen Datenbanken strukturierst, abfragst und veränderst. Hier lernst du, Tabellen sicher zu verknüpfen, Ergebnisse auszuwerten und Änderungen vor ihrer Ausführung zu prüfen.

Deine Lernziele

Hake ab, was du schon kannst — und komm am Ende hierher zurück!

Wie speichert eine relationale Datenbank Daten?

Eine relationale Datenbank ordnet Daten in Tabellen. Eine Zeile enthält einen Datensatz, eine Spalte beschreibt ein Attribut und ein einzelnes Tabellenfeld enthält einen Attributwert.

Eine Tabelle Personen könnte so aussehen:

PersonenIDPersonAlterWohnort
1Leon Maier183
2Emma Maier162
3Max Mustermann251
4Amir Schneider173

Die Zahlen in Wohnort sind keine Städtenamen. Sie verweisen auf eine zweite Tabelle:

StadtIDNameLand
1BerlinDeutschland
2ParisFrankreich
3MünchenDeutschland
Definition

Primärschlüssel

Ein Primärschlüssel identifiziert jede Tabellenzeile eindeutig. Er muss für jeden Datensatz einen Wert besitzen und darf keine unnötigen Attribute enthalten. In Personen ist PersonenID der Primärschlüssel.

Namen eignen sich nicht immer als dauerhafte Schlüssel: Zwei Menschen können gleich heißen. Eine künstlich angelegte ID heißt Surrogatschlüssel.

Definition

Fremdschlüssel

Ein Fremdschlüssel verweist auf den Primärschlüssel einer anderen Tabelle. Personen.Wohnort verweist hier auf Staedte.StadtID. So bedeutet Wohnort = 3, dass die Person in München wohnt.

Merke

Der Primärschlüssel sagt: „Das ist genau dieser Datensatz.“ Der Fremdschlüssel sagt: „Dieser Datensatz gehört zu einem Datensatz in einer anderen Tabelle.“

Teste dich
Frage 1 von 1LeichtWelche Aussage beschreibt Personen.Wohnort im Beispiel richtig?
Lösung: Die Spalte ist ein Fremdschlüssel und verweist auf Staedte.StadtID. — Ein Fremdschlüssel übernimmt den Schlüsselwert eines Datensatzes aus einer anderen Tabelle. Der Wert 3 verweist deshalb auf München.
Wie fragst du bestimmte Daten mit SELECT ab?

Eine Abfrage liest Daten, ohne sie zu verändern. Ihre Grundstruktur lautet:

SELECT Datenfelder FROM Tabelle WHERE Bedingung;

  • SELECT bestimmt die gewünschten Spalten.
  • FROM bestimmt die Tabelle.
  • WHERE filtert die Zeilen.
  • Ohne Filter kann WHERE entfallen.
  • * steht für alle Spalten.

Du möchtest Namen und Alter aller Personen unter 18 Jahren sehen:

Beispiel

SELECT Person, Alter FROM Personen WHERE Alter < 18;

Der Denkweg:

  1. Benötigt werden Person und Alter: Diese Spalten stehen hinter SELECT.
  2. Beide Spalten kommen aus Personen: Die Tabelle steht hinter FROM.
  3. Nur Werte unter 18 sollen erscheinen: Deshalb lautet die Bedingung Alter < 18.

Das Ergebnis enthält Emma Maier mit 16 Jahren und Amir Schneider mit 17 Jahren.

SQL-Schlüsselwörter wie SELECT, FROM und WHERE dürfen gewöhnlich auch kleingeschrieben werden. Großbuchstaben machen die Struktur besser erkennbar. Ob Bezeichner wie Tabellen- und Spaltennamen Groß- und Kleinschreibung unterscheiden, kann vom Datenbanksystem abhängen.

Merke

Nutze die S-F-W-Reihenfolge: gewünschte Spalten mit SELECT, Datenquelle mit FROM, Filter mit WHERE.

Teste dich
Frage 1 von 1MittelWelche Abfrage liefert nur Person und Alter für Personen ab 18 Jahren?
Lösung: SELECT Person, Alter FROM Personen WHERE Alter >= 18; — Die Abfrage folgt der Reihenfolge SELECT – FROM – WHERE. Das Zeichen >= bedeutet „größer oder gleich“.
Wie verknüpfst du Tabellen mit JOIN?

Die Tabelle Personen enthält nur Stadt-IDs. Für lesbare Städtenamen musst du Personen und Staedte verbinden. Das übernimmt ein JOIN.

Beim INNER JOIN erscheinen nur Zeilen, für die die Verknüpfungsbedingung in beiden Tabellen passt.

Beispiel

Gesucht sind Personen in deutschen Städten:

SELECT p.Person, s.Name AS Stadt FROM Personen AS p INNER JOIN Staedte AS s ON p.Wohnort = s.StadtID WHERE s.Land = 'Deutschland';

Der Denkweg:

  1. p ist ein kurzer Alias für Personen, s für Staedte.
  2. ON p.Wohnort = s.StadtID verbindet jeden Wohnortwert mit der passenden Stadt.
  3. WHERE s.Land = 'Deutschland' filtert erst danach die verbundenen Zeilen.
  4. AS Stadt gibt der Ergebnisspalte einen verständlichen Namen.

Das Ergebnis enthält Leon Maier mit München, Max Mustermann mit Berlin und Amir Schneider mit München.

Eine häufige Verwechslung: ON und WHERE haben unterschiedliche Aufgaben. ON legt fest, welche Zeilen zusammengehören. WHERE filtert die entstandenen Ergebniszeilen.

Gut zu wissen

Ein LEFT JOIN behält zusätzlich alle Zeilen der linken Tabelle, auch wenn rechts kein passender Datensatz existiert. Beim INNER JOIN bleiben dagegen nur passende Paare erhalten.

Teste dich
Frage 1 von 2MittelWelche Bedingung verbindet im Beispiel eine Person mit ihrer Stadt?
Lösung: p.Wohnort = s.StadtID — Eine sinnvolle JOIN-Bedingung verbindet einen Fremdschlüssel mit dem zugehörigen Primärschlüssel.
Frage 2 von 2SchwerWas änderst du, wenn auch Personen ohne passenden Stadtdatensatz erscheinen sollen?
Lösung: Du verwendest Personen links in einem LEFT JOIN. — Ein LEFT JOIN behält alle Datensätze der linken Tabelle. Deshalb muss Personen links stehen, wenn jede Person erscheinen soll.
Wie bildest du Gruppen und Kennzahlen?

Mit einer Aggregatfunktion fasst du mehrere Zeilen zu einem Ergebniswert zusammen. COUNT() zählt Zeilen, SUM() summiert Werte, AVG() berechnet einen Durchschnitt, MAX() bestimmt den größten und MIN() den kleinsten Wert.

GROUP BY bildet Gruppen. HAVING filtert anschließend ganze Gruppen. Dagegen filtert WHERE einzelne Zeilen vor der Gruppierung.

Beispiel

Gesucht sind Städte, denen mindestens zwei Personen zugeordnet sind:

SELECT s.Name AS Stadt, COUNT(p.PersonenID) AS AnzahlPersonen FROM Staedte AS s INNER JOIN Personen AS p ON p.Wohnort = s.StadtID GROUP BY s.StadtID, s.Name HAVING COUNT(p.PersonenID) >= 2;

Der Denkweg:

  1. Der JOIN ordnet jeder Person ihre Stadt zu.
  2. GROUP BY s.StadtID, s.Name sammelt die Zeilen stadtweise.
  3. COUNT(p.PersonenID) zählt die Personen jeder Gruppe.
  4. HAVING ... >= 2 behält nur Gruppen mit mindestens zwei Personen.

München hat die StadtID 3. Leon und Amir tragen beide Wohnort = 3. Deshalb liefert die Abfrage München | 2.

Merke

WHERE prüft einzelne Zeilen vor dem Gruppieren. HAVING prüft das Ergebnis einer Gruppe.

Teste dich
Frage 1 von 1MittelWomit filterst du Gruppen nach dem Ergebnis von COUNT()?
Lösung: Mit HAVING. — GROUP BY bildet Gruppen, die Aggregatfunktion berechnet Kennzahlen und HAVING filtert diese Gruppen.
Wie änderst du Daten kontrolliert?

INSERT INTO fügt Datensätze ein, UPDATE verändert vorhandene Datensätze und DELETE FROM löscht Datensätze. Änderungen können viele Zeilen betreffen. Prüfe deshalb zuerst mit einer SELECT-Abfrage, welche Zeilen dieselbe Bedingung erfüllt.

Angenommen, Amirs Alter soll von 17 auf 18 geändert werden.

Beispiel

1. Betroffene Zeile prüfen:

SELECT PersonenID, Person, Alter FROM Personen WHERE PersonenID = 4;

Die Abfrage liefert genau Amir Schneider mit dem bisherigen Alter 17.

2. Änderung gezielt formulieren:

UPDATE Personen SET Alter = 18 WHERE PersonenID = 4;

3. Ergebnis erneut prüfen:

SELECT PersonenID, Person, Alter FROM Personen WHERE PersonenID = 4;

Die eindeutige PersonenID verhindert, dass versehentlich weitere 17-jährige Personen geändert werden.

Bei DELETE ist nicht nur die Anzahl der Treffer wichtig. Du musst auch Beziehungen zwischen Tabellen beachten. Vor DELETE FROM Staedte WHERE StadtID = 3; zeigt die Prüfung SELECT PersonenID, Person FROM Personen WHERE Wohnort = 3;, dass Leon und Amir auf diese Stadt verweisen.

Ein Fremdschlüssel schützt die referenzielle Integrität: Ein Verweis soll nicht auf einen nicht vorhandenen Datensatz zeigen. Wie ein Datenbanksystem auf einen Löschversuch reagiert, hängt von den festgelegten Fremdschlüsselregeln ab. Ohne geklärten Umgang mit den Verweisen ist das Löschen nicht sicher.

Merke

Vor UPDATE oder DELETE: dieselbe WHERE-Bedingung mit SELECT testen, Treffer prüfen und Beziehungen zu anderen Tabellen untersuchen.

Innerhalb einer laufenden Transaktion bestätigt COMMIT die Änderungen. ROLLBACK macht noch nicht bestätigte Änderungen rückgängig. Ob und wie Transaktionen gestartet werden, hängt vom verwendeten Datenbanksystem ab.

Teste dich
Frage 1 von 2MittelWarum ist WHERE Alter = 17 für die Änderung von Amirs Alter riskanter als WHERE PersonenID = 4?
Lösung: Die Altersbedingung könnte mehrere Personen treffen. — Ein eindeutiger Primärschlüssel eignet sich für gezielte Änderungen. Ein gemeinsam vorkommender Wert wie ein Alter kann mehrere Zeilen auswählen.
Frage 2 von 2SchwerWas musst du vor dem Löschen der Stadt mit StadtID = 3 besonders prüfen?
Lösung: Ob Personen über Wohnort = 3 auf die Stadt verweisen. — Ein Löschvorgang darf keine ungültigen Fremdschlüsselverweise hinterlassen. Deshalb prüfst du zuerst die abhängigen Datensätze.
Karteikasten
Karteikasten

Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.

Alles auf einen Blick
Mindmap
  • SQL
    • Tabellen und Schlüssel strukturieren Daten
    • SELECT und WHERE wählen Daten aus
    • JOIN verbindet Tabellen
    • GROUP BY und Aggregatfunktionen werten Gruppen aus
    • UPDATE und DELETE verändern Daten
    • Fremdschlüssel schützen Beziehungen
Abschluss-Check
Teste dich
Frage 1 von 3LeichtWelche SQL-Klausel legt die Datenquelle einer Abfrage fest?
Lösung: FROM — Die Grundstruktur lautet SELECT Datenfelder FROM Tabelle WHERE Bedingung.
Frage 2 von 3MittelDu willst alle Personen aus München ausgeben. Welche Abfrage nutzt die Tabellenbeziehung korrekt?
Lösung: SELECT p.Person FROM Personen AS p INNER JOIN Staedte AS s ON p.Wohnort = s.StadtID WHERE s.Name = 'München'; — Erst verbindet ON p.Wohnort = s.StadtID Personen und Städte. Danach filtert WHERE auf München.
Frage 3 von 3SchwerEine Löschbedingung trifft drei Datensätze. Was ist der nächste sichere Schritt?
Lösung: Du prüfst die drei Datensätze und ihre Fremdschlüsselbeziehungen, bevor du löschst. — Die Vorschau mit SELECT zeigt die betroffenen Zeilen. Die Prüfung der Beziehungen verhindert, dass Verweise ungültig werden oder unerwartete Folgen auftreten.

Wenn du alle drei Aufgaben begründen kannst, beherrschst du den Kernweg: Datenstruktur verstehen, Ergebnisse gezielt abfragen, Tabellen verknüpfen, Gruppen auswerten und Änderungen kontrollieren.

Passend dazu