Datenabfragen mit SQL
GK: SELECT-Befehl
Die SQL-Abfrage erfolgt mit dem Befehl SELECT unter Angabe von bis zu fünf Komponenten. Die allgemeine Syntax hat die Gestalt:
SELECT [DISTINCT] * | <Attributliste>
FROM <Tabelle oder Verbund>
[WHERE <Boolescher Ausdruck]
[ORDER BY <Attributliste> [ASC | DESC]]
[LIMIT Zahl [[OFFSET Zahl]]

Die schwierige Syntax lässt sich wie folgt verstehen:
| Klausel |
Erläuterung |
| SELECT [DISTINCT] |
Wähle die Werte aus der/den Spalte [mehrfache Datensätze nur einmal] ... |
| FROM |
... aus der Tabelle bzw. den Tabellen ... |
| WHERE |
... wobei die Bedingung(en) erfüllt sein soll(en) ... |
| ORDER BY [ASC/DESC] |
... und sortiere nach den Spalten [auf- bzw. absteigend] ... |
| LIMIT |
... und zeige nur eine bestimmte Anzahl von Datensätze an. |
LK: SELECT-Befehl
Die SQL-Abfrage erfolgt mit dem Befehl SELECT unter Angabe von bis zu sieben Komponenten. Die allgemeine Syntax hat die Gestalt:
SELECT [DISTINCT] * | <Attributliste>
FROM <Tabelle oder Verbund>
[WHERE <Boolescher Ausdruck]
[GROUP BY <Attributliste>]
[HAVING <Bedingung>]
[ORDER BY <Attributliste> [ASC | DESC]]
[LIMIT Zahl [[OFFSET Zahl]]

Die schwierige Syntax lässt sich wie folgt verstehen:
| Klausel |
Erläuterung |
| SELECT [DISTINCT] |
Wähle die Werte aus der/den Spalte [mehrfache Datensätze nur einmal] ... |
| FROM |
... aus der Tabelle bzw. den Tabellen ... |
| WHERE |
... wobei die Bedingung(en) erfüllt sein soll(en) ... |
| GROUP BY |
... und fasse Zeilen mit gleichen Werten der angegebenen Attribute zu Gruppen zusammen ... |
| HAVING |
... wobei darin folgende zusätzliche Bedingung(en) gelten müssen/muss ... |
| ORDER BY [ASC/DESC] |
... und sortiere nach den Spalten [auf- bzw. absteigend] ... |
| LIMIT |
... und zeige nur eine bestimmte Anzahl von Datensätze an. |
Auswahl von Zeilen - Selektion
Aus der Tabelle Schüler sollen alle Zeilen ausgewählt werden, in denen der Name "Müller" steht. Diese Auswahl von Zeilen entspricht in der Relationenalgebra einer Selektion.
(Die Selektion hat also die Form SName = 'Müller'(Schüler))
Die Umsetzung in SQL lautet:
SELECT *
FROM Schüler
WHERE Name = 'Müller';
| Schüler |
|
Ergebnis
|
| SNr |
Vorname |
Name |
| 4711 |
Paul |
Müller |
| 0815 |
Erich |
Schmidt |
| 7472 |
Sven |
Lehmann |
| 1234 |
Olaf |
Müller |
| 2313 |
Jürgen |
Paulsen |
|
→
|
| SNr |
Vorname |
Name |
| 4711 |
Paul |
Müller |
| 1234 |
Olaf |
Müller |
|
Die WHERE-Klausel liefert also die Selektion. Um zu zeigen, dass alle Spalten angezeigt werden sollen, wird das Stern-Symbol verwendet.
Nun sollen aus der Tabelle Schüler alle Zeilen selektiert werden, in denen der Name "Müller" steht und deren Vorname mit "O" beginnt.
(Die Selektion hat also die Form SName = 'Müller' UND Vorname beginnt mit 'O'(Schüler))
Die Umsetzung in SQL lautet:
SELECT *
FROM Schüler
WHERE Name = 'Müller' AND Vorname LIKE 'O%';
| Schüler |
|
Ergebnis
|
| SNr |
Vorname |
Name |
| 4711 |
Paul |
Müller |
| 0815 |
Erich |
Schmidt |
| 7472 |
Sven |
Lehmann |
| 1234 |
Olaf |
Müller |
| 2313 |
Jürgen |
Paulsen |
|
→
|
| SNr |
Vorname |
Name |
| 1234 |
Olaf |
Müller |
|
Bedingungen lassen sich mit AND, OR und NOT verknüpfen. Das Prozentsymbol steht als Platzhalter für eine beliebige Folge von Zeichen. Das Prozentzeichen % steht für eine beliebige Folge von Zeichen, auch für eine leere Zeichenfolge. Der Unterstrich _ steht für genau ein beliebiges Zeichen. LIKE wird verwendet im Sinne von "SO WIE".
| Operator |
Erklärung |
= < <= >= > <> |
Vergleicht einen Attributwert mit einem anderen Attributwert oder einer Konstanten. gleich, kleiner als, kleiner gleich, größer gleich, größer, ungleich |
| BETWEEN ... AND ... |
prüft, ob ein Attributwert zwischen zwei Grenzen einschließlich der Grenzwerte liegt |
| IN (..., ..., ...) |
prüft, ob ein Attributwert in einer angegebenen Werteliste enthalten ist |
| LIKE |
vergleicht Zeichenketten mit Mustern unter Verwendung der Platzhalter:
%: für beliebige Zeichen
_: für genau ein Zeichen
Ob dabei Groß- und Kleinschreibung unterschieden werden, hängt vom verwendeten Datenbanksystem und dessen Einstellungen ab.
|
| IS (NOT) NULL |
prüft, ob für ein Attribut kein Wert (NULL) bzw. ein Wert vorhanden ist. |
Auswahl von Spalten - Projektion
Aus der Tabelle Schüler sollen nur die Spalte mit dem Attribut "Name" ausgewählt werden. Diese Auswahl von Spalten entspricht in der Relationenalgebra einer Projektion.
(Die Projektion hat also die Form PName(Schüler))
Die Umsetzung in SQL lautet:
SELECT Name
FROM Schüler;
| Schüler |
|
Ergebnis |
| SNr |
Vorname |
Name |
| 4711 |
Paul |
Müller |
| 0815 |
Erich |
Schmidt |
| 7472 |
Sven |
Lehmann |
| 1234 |
Olaf |
Müller |
| 2313 |
Jürgen |
Paulsen |
|
→
|
| Name |
| Müller |
| Schmidt |
| Lehmann |
| Müller |
| Paulsen |
|
Mit DISTINCT werden Mehrfachvorkommen entfernt.
Die Umsetzung in SQL lautet:
SELECT DISTINCT Name
FROM Schüler;
| Schüler |
|
Ergebnis |
| SNr |
Vorname |
Name |
| 4711 |
Paul |
Müller |
| 0815 |
Erich |
Schmidt |
| 7472 |
Sven |
Lehmann |
| 1234 |
Olaf |
Müller |
| 2313 |
Jürgen |
Paulsen |
|
→
|
| Name |
| Müller |
| Schmidt |
| Lehmann |
| Paulsen |
|
Hintereinanderausführung von Projektion und Selektion
Aus der Tabelle Schüler sollen die Vornamen aller Schüler angezeigt werden, deren Nachname Müller ist.
(Die Abfrage hat also die Form PVorname(SName = 'Müller'(Schüler)))
Die Umsetzung in SQL lautet:
SELECT Vorname
FROM Schüler
WHERE Name = 'Müller';
| Schüler |
|
Ergebnis |
| SNr |
Vorname |
Name |
| 4711 |
Paul |
Müller |
| 0815 |
Erich |
Schmidt |
| 7472 |
Sven |
Lehmann |
| 1234 |
Olaf |
Müller |
| 2313 |
Jürgen |
Paulsen |
|
→
|
|
In der zugehörigen Relationenalgebra wird zunächst die Selektion und anschließend die Projektion ausgeführt. Auch bei SQL wird logisch zunächst festgelegt, aus welchen Daten (FROM) und unter welchen Bedingungen (WHERE) Zeilen berücksichtigt werden. Erst anschließend bestimmt SELECT, welche Spalten im Ergebnis erscheinen.
Inner Join in SQL
Die Tabellen Schüler und Kurse sollen über das gemeinsame Attribut SNr miteinander verbunden werden. Im Ergebnis erscheinen nur die Kombinationen von Zeilen, für die die angegebenen Werte von SNr übereinstimmen.
(Die Abfrage hat also die Form JSchüler.SNr = Kurs.SNr(Schüler, Kurse))
Die Umsetzung in SQL lautet:
SELECT *
FROM Schüler INNER JOIN Kurse
ON Schüler.SNr = Kurse.SNr;
| Schüler |
Kurse |
|
Ergebnis |
| SNr |
Vorname |
Name |
| 4711 |
Paul |
Müller |
| 0815 |
Erich |
Schmidt |
| 7472 |
Sven |
Lehmann |
| 1234 |
Olaf |
Müller |
| 2313 |
Jürgen |
Paulsen |
|
| SNr |
KNr |
Fehlzeit |
Punkte |
| 0815 |
03 |
0 |
12 |
| 4711 |
03 |
12 |
03 |
| 4711 |
09 |
8 |
05 |
| 1234 |
23 |
3 |
14 |
|
→
|
| SNr |
Vorname |
Name |
SNr |
KNr |
Fehlzeit |
Punkte |
| 4711 |
Paul |
Müller |
4711 |
03 |
12 |
03 |
| 4711 |
Paul |
Müller |
4711 |
09 |
8 |
05 |
| 0815 |
Erich |
Schmidt |
0815 |
03 |
0 |
12 |
| 1234 |
Olaf |
Müller |
1234 |
23 |
3 |
14 |
|
Da mit SELECT * alle Spalten beider Tabellen ausgegeben werden, erscheint das Verknüpfungsattribut SNr im Ergebnis zweimal. Ein solches Ergebnis wird in der Regel nicht gewünscht. Es genügen oft nur einige Spalten des Verbundes. Existieren zu einer Zeile der ersten Tabelle mehrere passende Zeilen der zweiten Tabelle, entstehen entsprechend mehrere Ergebniszeilen.
Aus den Tabellen Schüler und Kurse sollen alle Schülernamen mit ihren Fehlzeiten aufgelistet werden. Der Befehl lautet:
SELECT Schüler.Vorname, Schüler.Name, Kurse.KNr, Kurse.Fehlzeit
FROM Schüler INNER JOIN Kurse
ON Schüler.SNr = Kurse.SNr
ORDER BY Kurse.Fehlzeit DESC;
| Ergebnis |
| Vorname |
Name |
KNr |
Fehlzeit |
| Paul |
Müller |
03 |
12 |
| Paul |
Müller |
09 |
8 |
| Olaf |
Müller |
23 |
3 |
| Erich |
Schmidt |
03 |
0 |
|