Abfrage von Daten
Datenbanken werden mit einer spezifischen Datenbanksprache angesprochen. Im Gegensatz zur bisher im Unterricht verwendeten Programmiersprache Python ist die Datenbanksprache SQL (Structured Query Language) eine deklarative Sprache. In Python werden die Befehle grundsätzlich der Reihe nach abgearbeitet. In SQL wird das gewünschte Resultat beschrieben. Wie diese Beschreibung abgearbeitet wird, ist in den Grundlagen der Datenbank programmiert.
Grundstruktur einer SQL Abfrage
Die Grundstruktur einer SQL Abfrage ist im untenstehenden Code Snippet dargestellt.
SELECT <Spalten>
FROM <Tabelle>
WHERE <Bedingung>;
Das Schlüsselwort SELECT
gibt an, welche Spalten aus der Tabelle ausgeben werden soll(en). Das Schlüsselwort FROM
gibt an, aus welcher Tabelle die Daten ausgelesen werden. Das Schlüsselwort WHERE
gibt die Bedingung an, die erfüllt sein muss, damit die Daten angezeigt werden. Dass die Schlüsselwörter in Grossbuchstaben geschrieben werden, ist technisch nicht nötig, entspricht aber der Konvention. Die Abfrage wird mit einem Semikolon abgeschlossen.
Einfache Abfrage
In einem ersten Beispiel sollen alle Vornamen aller Lehrer aus der Tabelle Lehrer aus dem vergangenen Abschnitt angezeigt werden:
SELECT Vorname
FROM Lehrer;
In diesem Beispiel wurde auf die Formulierung einer Bedingung verzichtet. Wenn die Ausgabe zusätzlich eine Bedingung erfüllen soll, wird diese mit dem Schlüsselwort WHERE
angegeben. Im folgenden Beispiel sollen nur die Vornamen der Lehrer angezeigt werden, die vor dem Jahr 1800 geboren sind.
Abfrage mit Bedingung
SELECT Vorname
FROM Lehrer
WHERE Geburtsdatum < '1800-01-01';
Diese Abfrage führt zu folgendem Ergebnis:
Vorname |
---|
Friedrich |
Honore de |
Johann Carl Friedrich |
Guillaume-Henri |
Sortierung der Ausgabe
Falls die Ausgabe nicht nur die Vornamen, sondern auch die Nachnamen und das Geburtsdatum enthalten soll und die Ausgabe nach dem Geburtsdatum aufsteigend sortiert werden soll, wird die Abfrage entsprechend angepasst:
SELECT Name, Vorname, Geburtsdatum
FROM Lehrer
WHERE Geburtsdatum < '1800-01-01'
ORDER BY Geburtsdatum;
Diese Abfrage führt zu folgendem Ergebnis:
Name | Vorname | Geburtsdatum |
---|---|---|
Schiller | Friedrich | 10.11.1759 |
Gauss | Johann Carl Friedrich | 30.04.1777 |
Dufour | Guillaume-Henri | 15.09.1787 |
Balzac | Honoré de | 20.05.1799 |
Es können dem Schlüsselwort SELECT
mehrere Spalten übergeben werden. Zusätzlich wurde in der Anfrage das Schlüsselwort ORDER BY
verwendet. Mit diesem kann angegeben werden, nach welchem Kriterium die Ausgabe sortiert werden soll. Standardmässig wird aufsteigend sortiert. Mit dem Schlüsselwort DESC
kann die Sortierung absteigend erfolgen. Die Abfrage sieht dann folgendermassen aus:
SELECT Name, Vorname, Geburtsdatum
FROM Lehrer
WHERE Geburtsdatum < '1800-01-01'
ORDER BY Geburtsdatum DESC;
Die Sortierreihenfolge wird hinter das Kriterium geschrieben. Wenn nach mehreren Kriterien sortiert werden soll, werden die zusätzlichen Kriterien mit einem Komma an das erste Kriterium angehängt.
Abfrage aus mehreren Tabellen
Interessanter, als die Abfrage von Daten aus einer einzigen Tabelle, ist die Abfrage aus mehreren Tabellen. So ist es im Beispiel möglich, Abzufragen, wer Deutsch unterrichtet. Aus diesem Grund wurde die Tabelle erhält Unterricht in/von
angelegt.
Um abzufragen, wer Deutsch unterrichtet, müssen die Daten aus den Tabellen Lehrer
, Fach
und erhält Unterricht in/von
zusammengeführt werden. Dies geschieht mit dem Schlüsselwort JOIN
. Das Schlüsselwort JOIN
kann unterschiedlich verwendet werden. Im vorliegenden Beispiel wird die Variante INNER JOIN
verwendet.
SELECT DISTINCT l.Name, l.Vorname
FROM Lehrer AS l
INNER JOIN erhält_Unterricht_in AS u ON l.Personalnummer = u.Personalnummer
WHERE u.Fach_ID = 'Deutsch';
Das Resultat dieser Abfrage sieht wie folgt aus:
Name | Vorname |
---|---|
Schiller | Friedrich |
In Ergänzung zu den bisherigen Abfragen, kommt neu das Schlüsselwort DISTINCT
zum Einsatz. Dieses bewirkt, dass Daten, die mehrfach vorkommen, nur einmal ausgegeben werden. In diesem Beispiel wäre dies nicht nötig, da es nur einen Lehrer gibt, der Deutsch unterrichtet.
Unter dem Schlüsselwort FROM
wird die Tabelle Lehrer
mit dem Alias l
angegeben. Der Alias wird verwendet, um die Abfrage leserlicher zu machen. Wenn mehrere Tabellen abgefragt werden, muss jede Spalte die Ausgeben werden soll, mit der Tabelle, aus der sie stammt, angegeben werden. Mit dem Alias kann dies abgekürzt werden. Das Schlüsselwort AS
für den Alias ist nicht nötig, dient aber der besseren Lesbarkeit.
Mit dem Schlüsselwort INNER JOIN
werden die Datensätze aus den beiden Tabellen Lehrer
und erhält_Unterricht_in
basierend auf übereinstimmenden Werten in der Spalte Personalnummer
miteinander verbunden. Dabei entsteht eine neue Ergebnismenge, die alle Spalten beider Tabellen enthält, jedoch nur für diejenigen Zeilen, bei denen die Personalnummer
in beiden Tabellen übereinstimmt.
Aus dieser Schnittmenge werden aus der Tabelle erhält Unterricht in/von
die Lehrer ausgewählt, die Deutsch unterrichten. Dies geschieht mit dem Schlüsselwort WHERE
und dem Kriterium u.Fach_ID = 'Deutsch'
.
Die Abfrage, wer die Klasse fP_24-28 in PPP unterrichtet, sieht wie folgt aus:
SELECT l.Name, l.Vorname
FROM Lehrer AS l
INNER JOIN erhält_Unterricht_in AS u ON l.Personalnummer = u.Personalnummer
WHERE u.Fach_ID = 'PPP'
AND u.Klassen_ID = 'fP_24-28';
Die Abfrage gibt folgendes Resultat zurück:
Name | Vorname |
---|---|
Piaget | Jean |
Gegenüber der Abfrage, wer Deutsch unterrichtet, wurde mit dem Schlüsselwort AND
die zusätzliche Bedingung u.Klassen_ID = 'fP_24-28'
hinzugefügt.
Ausblick
Der nächste Abschnitt dient dazu, SQL zu üben. Als Übungsplattform wird SQL Island genutzt. Diese Plattform ist unter sql-island.informatik.uni-kl.de zu finden.