SQL SELECT: Daten gezielt abfragen
Mit einer SELECT-Abfrage liest du Daten aus einer relationalen Datenbank. SELECT bestimmt die Ergebnisspalten, FROM die Datenquelle und WHERE bei Bedarf die ausgewählten Zeilen.
Auf dieser Seite lernst du, einfache und mehrtabellige Abfragen zu formulieren, Ergebnisse vorherzusagen und Gruppenauswertungen richtig aufzubauen.
Hake ab, was du schon kannst — und komm am Ende hierher zurück!
Spalten mit SELECT auswählen
Stell dir eine Tabelle Student vor:
| MatrNr | Name |
|---|---|
| 26120 | Fichte |
| 25403 | Jonas |
| 27103 | Fauler |
Die Grundform einer Abfrage lautet:
sql SELECT Spalten FROM Tabelle;
SELECT legt fest, welche Spalten im Ergebnis erscheinen. FROM nennt die Tabelle, aus der die Daten stammen.
Projektion
Eine Projektion ist die Auswahl bestimmter Spalten für das Abfrageergebnis.
Diese Abfrage gibt nur die Namen aus:
sql SELECT Name FROM Student;
Das Ergebnis enthält eine Spalte mit Fichte, Jonas und Fauler. Die Matrikelnummern werden nicht ausgegeben, obwohl sie weiterhin in der Tabelle gespeichert sind.
Mit einem Stern wählst du alle Spalten aus:
sql SELECT * FROM Student;
Beim Ausprobieren ist * praktisch. In Programmen solltest du meist die wirklich benötigten Spalten nennen. So bleibt die Abfrage verständlich und überträgt keine unnötigen Daten.
Wähle in jeder Lücke die passende Form und prüfe anschließend deine Antworten.
Mit ` bestimmst du die Ergebnisspalten. Hinter steht die Datenquelle. Der Stern bedeutet `.
Zeilen filtern und Ergebnisse sortieren
Oft möchtest du nicht jede Zeile erhalten. Dafür ergänzt du eine Bedingung mit WHERE.
Selektion
Eine Selektion ist die Auswahl der Zeilen, welche eine Bedingung erfüllen. Sie verändert die gespeicherte Tabelle nicht.
sql SELECT VorlNr, Titel FROM Vorlesung WHERE Titel = 'ET';
Zuerst dient Vorlesung als Datenquelle. Danach bleiben nur Zeilen mit dem Titel ET übrig. Aus ihnen werden VorlNr und Titel ausgegeben. Das Ergebnis lautet (5001, ET).
Für Textmuster verwendest du LIKE:
sql SELECT Name FROM Student WHERE Name LIKE 'F%';
% steht für eine beliebig lange Zeichenfolge. Deshalb passen Fichte und Fauler. Der Platzhalter _ steht dagegen für genau ein beliebiges Zeichen.
Mit ORDER BY bestimmst du die Reihenfolge des Ergebnisses:
sql SELECT Name FROM Student WHERE Name LIKE 'F%' ORDER BY Name ASC;
ASC bedeutet aufsteigend, DESC absteigend. Ohne Angabe gilt ASC. Ohne ORDER BY ist keine bestimmte Ergebnisreihenfolge zugesichert.
WHERE entscheidet, welche Zeilen vorkommen. ORDER BY entscheidet erst danach, in welcher Reihenfolge sie erscheinen.
Aliase und DISTINCT richtig einsetzen
Ein Alias gibt einer Ergebnisspalte einen verständlicheren Namen:
sql SELECT MatrNr AS Matrikelnummer, Name FROM Student;
AS Matrikelnummer ändert nur die Überschrift im Ergebnis. Die Spalte in der Tabelle heißt weiterhin MatrNr.
Ein Alias aus der SELECT-Liste steht in WHERE normalerweise noch nicht zur Verfügung:
sql SELECT Name AS Teilnehmername FROM Student WHERE Name LIKE 'F%';
Hier muss die Bedingung Name verwenden. Logisch werden zuerst die Datenquelle und der Filter verarbeitet; der Ergebnisalias entsteht später.
Mit DISTINCT entfernst du doppelte Ergebniszeilen:
sql SELECT DISTINCT StudGang FROM Student;
Jeder vorhandene Studiengang erscheint dadurch nur einmal. Bei mehreren Ergebnisspalten entfernt DISTINCT nur Zeilen, deren ausgewählte Werte vollständig übereinstimmen.
Tabellen mit JOIN verbinden
Relationale Daten sind häufig auf mehrere Tabellen verteilt. Die Tabelle Vorlesung enthält beispielsweise eine PersNr, die auf den zuständigen Professor verweist.
| VorlNr | Titel | PersNr |
|---|---|---|
| 5001 | ET | 15 |
| 5022 | IT | 12 |
| 5045 | DB | 12 |
| PersNr | Name |
|---|---|
| 12 | Wirth |
| 15 | Tesla |
| 20 | Urlauber |
Ein JOIN verbindet passende Zeilen. Die ON-Bedingung legt fest, welche Schlüsselwerte zusammengehören.
sql SELECT v.VorlNr, v.Titel, p.Name FROM Professor AS p JOIN Vorlesung AS v ON p.PersNr = v.PersNr ORDER BY v.VorlNr;
Die Tabellenaliase p und v machen die Abfrage kürzer und verhindern Verwechslungen gleichnamiger Spalten.
Für Vorlesung 5001 gilt v.PersNr = 15. Dazu passt Professor Tesla. Die weiteren Ergebniszeilen verbinden IT und DB mit Wirth. Professor Urlauber erscheint nicht, weil keine Vorlesung mit seiner Personalnummer vorhanden ist.
Der hier verwendete normale JOIN ist ein Inner Join: Er liefert nur Kombinationen, welche die ON-Bedingung erfüllen.
Bei einem Join beantwortest du zwei verschiedene Fragen: ON legt fest, welche Tabellenzeilen zusammengehören; WHERE kann das verbundene Ergebnis anschließend weiter filtern.
Gruppen mit Aggregatfunktionen auswerten
Aggregatfunktionen fassen mehrere Zeilen zu einem Wert zusammen:
COUNTzählt.SUMaddiert.AVGberechnet einen Mittelwert.MINbestimmt das Minimum.MAXbestimmt das Maximum.
COUNT(*) zählt alle ausgewählten Zeilen. COUNT(Spalte) zählt nur Zeilen, in denen diese Spalte nicht NULL ist.
Mit GROUP BY bildest du Gruppen. Betrachte diese Studierenden:
| Name | StudGang |
|---|---|
| Schmitz | E-Technik |
| Meyer | Physik |
| Jonas | Physik |
| Eifrig | Mathematik |
| Fauler | E-Technik |
sql SELECT StudGang AS Studiengang, COUNT(*) AS Anzahl FROM Student GROUP BY StudGang ORDER BY StudGang;
GROUP BY StudGang bildet für jeden Studiengang eine Gruppe. COUNT(*) zählt die Zeilen jeder Gruppe. Das Ergebnis lautet: E-Technik 2, Mathematik 1 und Physik 2.
WHERE filtert einzelne Zeilen vor der Gruppenbildung. HAVING filtert dagegen bereits berechnete Gruppen.
sql SELECT StudGang AS Studiengang, COUNT(*) AS Anzahl FROM Student GROUP BY StudGang HAVING COUNT(*) < 2 ORDER BY StudGang;
Nur Mathematik bleibt übrig, weil diese Gruppe genau eine Zeile enthält.
In einer Gruppenauswertung dürfen normalerweise nur Gruppenspalten und Aggregatwerte in SELECT stehen. Eine zusätzliche unaggregierte Spalte könnte innerhalb einer Gruppe mehrere verschiedene Werte besitzen und wäre daher nicht eindeutig.
Karteikasten
Überlege zuerst selbst und drehe die Karte anschließend zum Prüfen um.
Alles auf einen Blick
- SQL-SELECT-Abfrage
- Spalten auswählen: SELECT
- Datenquelle festlegen: FROM und JOIN
- Einzelzeilen filtern: WHERE
- Gruppen bilden: GROUP BY
- Gruppen filtern: HAVING
- Duplikate entfernen: DISTINCT
- Ergebnis sortieren: ORDER BY
Eine hilfreiche logische Reihenfolge lautet: Datenquellen verbinden, Zeilen filtern, Gruppen bilden, Gruppen filtern, Ergebnisspalten auswählen und schließlich sortieren. Beim Schreiben steht SELECT trotzdem am Anfang.
Abschluss-Check
Prüfe beim Formulieren einer eigenen Abfrage immer drei Punkte: Sind die richtigen Spalten ausgewählt? Werden die beabsichtigten Zeilen oder Gruppen gefiltert? Ist eine gewünschte Reihenfolge ausdrücklich mit ORDER BY festgelegt?
Mit Google fortfahren