SQL lernen: Abfragen, JOINs und Datenänderungen
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.
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:
| PersonenID | Person | Alter | Wohnort |
|---|---|---|---|
| 1 | Leon Maier | 18 | 3 |
| 2 | Emma Maier | 16 | 2 |
| 3 | Max Mustermann | 25 | 1 |
| 4 | Amir Schneider | 17 | 3 |
Die Zahlen in Wohnort sind keine Städtenamen. Sie verweisen auf eine zweite Tabelle:
| StadtID | Name | Land |
|---|---|---|
| 1 | Berlin | Deutschland |
| 2 | Paris | Frankreich |
| 3 | München | Deutschland |
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.
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.
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.“
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;
SELECTbestimmt die gewünschten Spalten.FROMbestimmt die Tabelle.WHEREfiltert die Zeilen.- Ohne Filter kann
WHEREentfallen. *steht für alle Spalten.
Du möchtest Namen und Alter aller Personen unter 18 Jahren sehen:
SELECT Person, Alter FROM Personen WHERE Alter < 18;
Der Denkweg:
- Benötigt werden
PersonundAlter: Diese Spalten stehen hinterSELECT. - Beide Spalten kommen aus
Personen: Die Tabelle steht hinterFROM. - 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.
Nutze die S-F-W-Reihenfolge: gewünschte Spalten mit SELECT, Datenquelle mit FROM, Filter mit WHERE.
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.
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:
pist ein kurzer Alias fürPersonen,sfürStaedte.ON p.Wohnort = s.StadtIDverbindet jeden Wohnortwert mit der passenden Stadt.WHERE s.Land = 'Deutschland'filtert erst danach die verbundenen Zeilen.AS Stadtgibt 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.
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.
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.
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:
- Der
JOINordnet jeder Person ihre Stadt zu. GROUP BY s.StadtID, s.Namesammelt die Zeilen stadtweise.COUNT(p.PersonenID)zählt die Personen jeder Gruppe.HAVING ... >= 2behä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.
WHERE prüft einzelne Zeilen vor dem Gruppieren. HAVING prüft das Ergebnis einer Gruppe.
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.
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.
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.
Karteikasten
Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.
Alles auf einen Blick
- 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
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.
Mit Google fortfahren