SQL SELECT: Daten gezielt abfragen

SQL SELECT: Daten gezielt abfragen
SQL SELECT: Daten gezielt abfragen
Für Quiz, Lückentext, Lernkarten und Fortschritt ist JavaScript nötig. Alle Inhalte und Lösungen bleiben direkt lesbar.

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.

Deine Lernziele

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

Spalten mit SELECT auswählen

Stell dir eine Tabelle Student vor:

MatrNrName
26120Fichte
25403Jonas
27103Fauler

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.

Definition

Projektion

Eine Projektion ist die Auswahl bestimmter Spalten für das Abfrageergebnis.

Beispiel

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.

Lückentext

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 `.

Lösungen: Lücke 1: SELECT; Lücke 2: FROM; Lücke 3: alle Spalten. Lies die Abfrage als Satz: Wähle diese Spalten aus dieser Tabelle aus.
Zeilen filtern und Ergebnisse sortieren

Oft möchtest du nicht jede Zeile erhalten. Dafür ergänzt du eine Bedingung mit WHERE.

Definition

Selektion

Eine Selektion ist die Auswahl der Zeilen, welche eine Bedingung erfüllen. Sie verändert die gespeicherte Tabelle nicht.

Beispiel

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.

Merke

WHERE entscheidet, welche Zeilen vorkommen. ORDER BY entscheidet erst danach, in welcher Reihenfolge sie erscheinen.

Teste dich
Frage 1 von 2LeichtWelcher Platzhalter steht bei LIKE für genau ein beliebiges Zeichen?
Lösung: _ — Bei SQL-Mustern steht _ für genau ein Zeichen und % für beliebig viele Zeichen.
Frage 2 von 2MittelWelche Ergänzung sortiert Preise vom höchsten zum niedrigsten Wert?
Lösung: ORDER BY Preis DESCORDER BY sortiert, und DESC fordert eine absteigende Reihenfolge.
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.

Teste dich
Frage 1 von 2MittelEine Abfrage wählt StudGang und PLZ aus. Wann betrachtet DISTINCT zwei Ergebniszeilen als doppelt?
Lösung: Wenn sowohl StudGang als auch PLZ übereinstimmen — Bei mehreren ausgewählten Spalten müssen alle Ergebniswerte übereinstimmen, damit eine Zeile als Duplikat entfernt wird.
Frage 2 von 2SchwerWarum ist WHERE Teilnehmername LIKE 'F%' nach SELECT Name AS Teilnehmername normalerweise ungültig?
Lösung: Der Alias entsteht logisch erst nach der Auswertung von WHEREFROM und WHERE werden logisch vor der SELECT-Liste verarbeitet. Verwende im Filter deshalb den ursprünglichen Spaltennamen Name.
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.

VorlNrTitelPersNr
5001ET15
5022IT12
5045DB12
PersNrName
12Wirth
15Tesla
20Urlauber

Ein JOIN verbindet passende Zeilen. Die ON-Bedingung legt fest, welche Schlüsselwerte zusammengehören.

Beispiel

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.

Merke

Bei einem Join beantwortest du zwei verschiedene Fragen: ON legt fest, welche Tabellenzeilen zusammengehören; WHERE kann das verbundene Ergebnis anschließend weiter filtern.

Teste dich
Frage 1 von 2MittelWelche Bedingung verbindet Professoren und Vorlesungen anhand ihrer Personalnummer korrekt?
Lösung: ON p.PersNr = v.PersNr — Die Personalnummer ist der gemeinsame Schlüssel. Gleichheit verbindet jede Vorlesung mit dem zugehörigen Professor.
Frage 2 von 2SchwerWas geschieht beim gezeigten Inner Join mit einem Professor, zu dem keine Vorlesung gespeichert ist?
Lösung: Er erscheint nicht im Ergebnis — Ohne passende Vorlesungszeile entsteht kein Ergebnispaar für diesen Professor.
Gruppen mit Aggregatfunktionen auswerten

Aggregatfunktionen fassen mehrere Zeilen zu einem Wert zusammen:

  • COUNT zählt.
  • SUM addiert.
  • AVG berechnet einen Mittelwert.
  • MIN bestimmt das Minimum.
  • MAX bestimmt 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:

NameStudGang
SchmitzE-Technik
MeyerPhysik
JonasPhysik
EifrigMathematik
FaulerE-Technik
Beispiel

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.

Gut zu wissen

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.

Teste dich
Frage 1 von 3LeichtWelche Funktion zählt alle Zeilen einer Gruppe?
Lösung: COUNT(*)COUNT(*) zählt jede Zeile der jeweiligen Gruppe.
Frage 2 von 3MittelWelche Klausel filtert Gruppen anhand von COUNT(*)?
Lösung: HAVING — Bedingungen über berechnete Gruppenwerte gehören in HAVING.
Frage 3 von 3SchwerDu möchtest nur Fachrichtungen mit mindestens zwei Studierenden ausgeben. Welche Bedingung passt nach GROUP BY StudGang?
Lösung: HAVING COUNT(*) >= 2HAVING prüft die Größe jeder bereits gebildeten Gruppe. >= 2 schließt Gruppen mit genau zwei oder mehr Zeilen ein.
Karteikasten
Karteikasten

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

Alles auf einen Blick
Mindmap
  • 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
Teste dich
Frage 1 von 3LeichtWelche Klausel bestimmt die Datenquelle einer Abfrage?
Lösung: FROMFROM nennt die Tabelle oder die durch Joins verbundenen Tabellen.
Frage 2 von 3MittelWelche Abfrage gibt die Titel aller Vorlesungen mit der Personalnummer 12 aufsteigend aus?
Lösung: SELECT Titel FROM Vorlesung WHERE PersNr = 12 ORDER BY Titel ASC; — Gesucht ist die Spalte Titel. WHERE PersNr = 12 wählt die passenden Zeilen aus, und ORDER BY Titel ASC sortiert ihre Titel.
Frage 3 von 3SchwerEine Auswertung soll nur Professoren zeigen, die mindestens zwei Vorlesungen halten. Welche Abfrage ist passend?
Lösung: SELECT p.Name, COUNT(*) AS Anzahl FROM Professor AS p JOIN Vorlesung AS v ON p.PersNr = v.PersNr GROUP BY p.PersNr, p.Name HAVING COUNT(*) >= 2; — Zuerst verbindet der Join passende Personalnummern. Danach entstehen Gruppen nach eindeutiger Personalnummer und Professorenname. HAVING COUNT(*) >= 2 behält nur Gruppen mit mindestens zwei Vorlesungen.

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?

Passend dazu