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:
|
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
- ↑ Im Deutschen gibt es zudem auch noch das selten verwendete Wort „distinguiert“, das denselben Ursprung hat, aber anders verwendet wird.