Abfragen: Grundlagen

Über Datenbankabfragen können wir uns Tabellen anzeigen lassen. Dazu hat sich eine Sprache durchgesetzt, deren Befehle wie englische Sätze klingen: SQL, die Structured Query Language. Die folgende Fahrschuldatenbank soll als Beispiel dienen.

Die folgende Abfrage zeigt die vollständige Tabelle fahrlehrer an.

SELECT * FROM fahrlehrer

Hinter dem Schlüsselwort FROM steht der Name der Tabelle, für die man sich interessiert. Der Stern * bedeutet „alle Spalten“.

Manchmal interessiert man sich nur für bestimmte Spalten. Man sagt auch, dass man diese Spalten aus der ursprünglichen Tabelle „herausprojiziert“ und spricht folglich von einer Projektion. Bsp.:

„Die Vornamen und Nachnamen aller Fahrlehrer“

würde der folgenden Abfrage entsprechen.

SELECT vorname, nachname FROM fahrlehrer

Manchmal interessiert man sich nur für bestimmte Zeilen. Man sagt auch, dass man aus der ursprünglichen Tabelle „selektiert“ und spricht folglich von einer Selektion. Die Selektion erfolgt nach einer Bedingung, die man sehr flexibel wählen kann. Bsp.:

„Vornamen, Nachnamen und Fahrstunden aller Fahrschüler, die mehr als 15 Fahrstunden absolviert haben“

...würde der folgenden Abfrage entsprechen.

SELECT vorname, nachname, anz_fahrstunden
FROM   fahrschueler
WHERE  anz_fahrstunden > 15

Statt der Bedingung anz_fahrstunden > 15 sind viele weitere möglich; hier eine Auflistung einiger am häufigsten verwendeter.

Bedingung Bedeutung Prinzip
vorname = 'Manfred' Die Zelle in der vorname-Spalte enthält die Zeichenkette 'Manfred' Gleichheit für Zeichenketten
vorname <> 'Manfred' Die Zelle in der vorname-Spalte enthält nicht die Zeichenkette 'Manfred' Ungleichheit für Zeichenketten
anzahl_fahrstunden = 10 Die Zelle in der anz_fahrstunden-Spalte enthält die Zahl 10 Gleichheit für Zahlen
anzahl_fahrstunden > 10 Die Zelle in der anz_fahrstunden-Spalte ist $\gt$ der Zahl 10 (also z.B. 11, 12, 13...) Zahlenvergleich
anzahl_fahrstunden >= 10 Die Zelle in der anz_fahrstunden-Spalte ist $\ge$ der Zahl 10 (also z.B. 10, 11, 12, ...) Zahlenvergleich
theorie_bestanden = 1 Die Zelle in der theorie_bestanden-Spalte enthält den Wahrheitswert „wahr“ Prüfung für Wahrheitswerte:
  • 1 entspricht „wahr“,
  • 0 entspricht „falsch”
gebdatum < '2000-04-01' Die Zelle in der gebdatum-Spalte enthält ein Datum vor dem 01.04.2024 Datumsvergleich
gebdatum BETWEEN '2000-01-01' AND '2000-12-31' Die Zelle in der gebdatum-Spalte ist ein Datum, welches im Jahr 2000 liegt. Prüfung, dass ein Wert zwischen zwei angegeben Werten liegt (funktioniert auch für Zahlen).
vorname IN ('Adam', 'Bert') Die Zelle in der vorname-Spalte entweder die Zeichenkette 'Adam' oder 'Bert'. Prüfung, dass ein Wert aus einer angegebenen Liste von Werten stammt.
vorname LIKE 'A%' Die Zelle in der vorname-Spalte beginnt mit A oder a und endet beliebig (hier ist ausnahmsweise Groß-/kleinschreibung egal). Musterabgleich für Zeichenketten: Das % dient als Platzhalter für eine beliebige Zeichenkette, auch wildcard genannt.
fl_kuerzel IS NULL Der Wert in Spalte fl_kuerzel ist leer gelassen worden Abwesenheit eines Werts in einer Zelle (NULL steht für „abwesend“)
fl_kuerzel IS NOT NULL Der Wert in Spalte fl_kuerzel ist nicht leer gelassen worden Anwesenheit eines Werts in einer Zelle (NULL steht für „abwesend“)

Bedingungen lassen sich zu neuen Bedingungen über die Schlüsselwörter AND, OR, NOT kombinieren.

Bsp.: „Alle Fahrschüler, die mehr als 10 Fahrstunden absolviert haben und bei Herrn Mustermann Fahrunterricht haben.“

SELECT *
FROM   fahrschueler
WHERE  anz_fahrstunden > 10 AND
       fl_kuerzel = 'Mus'

Außer dem AND-Operator gibt es wie beschrieben noch den OR- und den NOT-Operator, die entsprechend ähnlich notiert werden.

Zusammengesetze Bedingung Bedeutung
Bedingung 1 AND Bedingung 2 Sowohl Bedingung 1 als auch Bedingung 2 müssen erfüllt sein.
Bedingung 1 OR Bedingung 2 Mindestens eine von Bedingung 1 und Bedingung 2 muss erfüllt sein.
NOT Bedingung Die Bedingung darf nicht erfüllt sein.

Manchmal ist nicht klar, in welcher Reihenfolge die AND-, OR- und NOT-Operatoren gelesen werden sollen. In diesem Fall klammert man entsprechend, ganz analog zur Klammerung bei Zahlentermen. Siehe dazu auch das folgende Beispiel und beachte die Klammerung:

Bsp.: „Alle Fahrschüler, die mehr als 10 Fahrstunden absolviert haben und bei Frau Mustermann oder Herrn Mustermann Fahrunterricht haben.“

SELECT *
FROM   fahrschueler
WHERE  theorie_bestanden = 1 AND
       (fl_kuerzel = 'Mus' OR fl_kuerzel = 'Mu')

Die Zeilen einer Tabelle können sortiert werden mittels ORDER BY. Es können mehrere Spaltennamen angegeben werden, per Komma getrennt, z.B. ORDER BY nachname, vorname. Es wird dann z.B. erst nach Nachname sortiert, und bei gleichen Nachnamen nach Vorname. Um eine absteigende Sortierung zu erzielen, muss das Schlüsselwort DESC (englisch descending) hinter einen Spaltennamen angefügt werden, z.B. ORDER BY anz_fahrstunden DESC.

SELECT   vorname, nachname, anz_fahrstunden
FROM     fahrschueler
ORDER BY anz_fahrstunden

Manchmal möchte man die Zeilen mehrerer Tabellen kombinieren. Die Idee ist, dass man eine Tabelle als eine Menge von Elementen auffasst und die Mengenoperationen Vereinigung, Schnitt, Mengendifferenz anwendet. Wichtig ist hierbei, dass das Schema der beteiligten Tabellen (also die Spaltennamen inkl. Datentypen) übereinstimmt. Bsp.:

„Alle Vornamen von Fahrlehrern und Fahrschülern“

...würde der folgenden Abfrage entsprechen.

SELECT vorname FROM fahrlehrer
UNION
SELECT vorname FROM fahrschueler

Die hierzu passende SQL-Abfrage liest sich wieder wie ein englischer Satz; genauer werden zwei Sätze mittels der Konjunktion UNION verbunden. Folgende weitere SQL-Operatoren gibt es:

SQL-Operator Mengenoperator Math. Symbol
UNION Vereinigung $\bigcup$
INTERSECT Schnitt $\bigcap$
EXCEPT Differenz $\setminus$

Jede Spalte ist mit einem Spaltenkopf ausgestattet, dem sogenannten Attribut. Der Spaltenkopf kann umbenannt werden. Die Umbenennung ist vor allem später wichtig, wenn es passieren kann, dass beim Verschmelzen zweier Tabellen mehrere Spaltenköpfe denselben Namen tragen. In folgendem Beispiel wird der Spaltenkopf „vorname“ in „name“ umbenannt.

SELECT vorname AS name
FROM   fahrlehrer

Wir waren bisher nicht ganz korrekt: Eine Tabelle ist eigentlich eine Multimenge von Zeilen, nicht eine Menge. Der Unterschied ist, dass Elemente in einer Multimenge mehrfach vorkommen dürfen, in einer Menge hingegen nicht.

Tabellen können grundsätzlich Zeilen mehrfach enthalten. Wir können Duplikate entfernen, indem wir in der Anfrage SELECT DISTINCT statt bloß SELECT formulieren. „Distinct“ ist englisch für „unterschieden“1.

Tabelle als Multimenge von Zeilen

Multimenge“ bedeutet, dass Elemente mehrfach enthalten sein dürfen.

Die folgende Abfrage selektiert also alle Vornamen unter den Fahrschülern. Der Name „Marie“ kommt doppelt vor.

SELECT   vorname
FROM     fahrschueler
ORDER BY vorname

Tabelle als Menge von Zeilen

Menge“ bedeutet, dass Elemente einfach enthalten sind (zugehörig vs. nicht zugehörig).

Die folgende Abfrage selektiert also alle verschiedenen Vornamen unter den Fahrschülern.

SELECT DISTINCT vorname
FROM            fahrschueler
ORDER BY        vorname

Manchmal interessiert man sich nur für eine bestimmte Anzahl an Ergebnissen, z.B. die „Top 3“, und will also die Zeilenanzahl limitieren (deutsch: begrenzen). In diesem Fall fügt man einer (beliebig komplexen) SELECT-Abfrage noch eine LIMIT-Klausel an. Diese bewirkt, dass abschließend nur die ersten n Zeilen ausgegeben werden.

SELECT   vorname, nachname, anz_fahrstunden
FROM     fahrschueler
ORDER BY anz_fahrstunden DESC
LIMIT    3
  1. Im Deutschen gibt es zudem auch noch das selten verwendete Wort „distinguiert“, das denselben Ursprung hat, aber anders verwendet wird.