SELECT
aus www.iwiki.de, der freien Wissensdatenbank
Mit dem SQL Befehl SELECT können Datensätze aus einer Datenbank abgerufen werden. Der Befehl erlaubt das Spezifizieren von Bedingungen, das Sortieren und das Gruppieren nach Spalten, die Anwendung von Spaltenfunktionen und das Einbeziehen mehrerer Tabellen.
Inhaltsverzeichnis |
Syntax
SELECT <Attributliste> FROM <Tabellenliste> [JOIN <Tabelle> ON <Join-Bedingung>]* [WHERE <Zeilenrestriktion>] [GROUP BY <Gruppierungsfelder> [HAVING <Gruppenrestriktion>] ] [ORDER BY <Sortierreihenfolge>]
Steht an Stelle der Attributliste ein „*“, so welden alle Spalten selektiert.
Beispiele
Die folgenden Beispiele beziehen sich auf die zwei Beispieltabellen Kunde und Konto.
Kunde
| kundennr | vorname | nachname | gebdat |
| 0000005000 | Egon | Mustermann | 21.05.1980 |
| 0000005001 | Schorsch | Müller | 22.05.1980 |
| 0000005002 | Schorsch | Müller | 11.02.1979 |
Konto
| kontonr | kontotyp | saldo | inhaber |
| 0000000001 | giro | 100.0 | 0000005000 |
| 0000000002 | festgeld | 500.0 | 0000005001 |
Einfache Auswahl
Die einfachste Form eines SELECT Befehls ruft alle Datensätze einer Tabelle ab.
SELECT * FROM <table name> SELECT * FROM Kunde
Es können auch einzelne Spalten abgerufen werden.
SELECT nachname, vorname FROM Kunde
Einfache Auswahl mit Einschränkung durch WHERE
Um die Auswahl einzuschränken, können im SELECT Statement Bedingungen übergeben werden.
SELECT * FROM <table name> WHERE <condition list> SELECT * FROM Kunde WHERE nachname = 'Mustermann'
In der WHERE Klausel können mehrere Bedingungen mit AND und OR logisch verknüpft werden.
Hierzu können folgende Vergleichsoperatoren benutzt werden:
- =
- ist gleich
- <>
- ungleich
- <=
- kleiner oder gleich
- <
- kleiner
- >=
- größer oder gleich
- >
- größer
- LIKE
- entspricht einem Muster
- Platzhalter % für eine beliebige Anzahl von Zeichen
- Patzer ? für genau ein Zeichen
- SELECT * FROM Kunde WHERE nachname LIKE 'M%ller'
- BETWEEN <Wert1> AND <Wert2>
- Wert liegt zwischen Wert1 und Wert2
- IN Wertliste
- Wert ist Teilmenge der Wertliste
- Diese Wertliste kann manuell angegeben werden, oder durch einen anderen SELECT Befehl ersetzt werden
- SELECT * FROM Kunde WHERE kundennr IN ('0000005000', '0000005001')
- oder
- SELECT * FROM Kunde WHERE kundennr IN SELECT inhaber FROM Konto
Identische Datensätze ignorieren
Der SELECT Befehl kann auch Duplikate liefern. Mit dem Schlüsselwort DISTINCT können diese jedoch heraus gefiltert werden.
SELECT name, vorname FROM Kunde
liefert die Datensätze:
| Egon | Mustermann |
| Schorsch | Müller |
| Schorsch | Müller |
hingegen
SELECT DISTINCT name, vorname FROM Kunde
liefert die Datensätze:
| Egon | Mustermann |
| Schorsch | Müller |
Verbund
Entspricht dem Kartesischen Produkt mehrerer Tabellen.
SELECT * FROM Kunde, Konto
Ein natürlicher Verbund wird mit Hilfe der entsprechenden WHERE Bedingung erreicht.
SELECT * FROM Kunde, Konto WHERE Kunde.kundennr = Konto.inhaber AND inhaber = 5001
Verknüpfung mit JOIN
Der Verbund bzw. Natürliche Verbund wird in SQL durch die JOIN Anweisung realisiert.
Man unterscheidet beim JOIN zwischen:
- INNER JOIN (nur Zeilen, die in beiden Tabellen den Vergleichswert
enthalten, werden in die Ergebnistabelle aufgenommen)
- LEFT JOIN (alle Zeilen der linken Tabelle werden aufgenommen,
die entsprechenden Zeilen der rechten Tabelle werden mit angezeigt, sofern sich eine korrespondierende Zeile findet)
- RIGHT JOIN (alle Zeilen der rechten Tabelle werden aufgenommen,
die entsprechenden Zeilen der linken Tabelle werden mit angezeigt, sofern sich eine korrespondierende Zeile findet)
- OUTER JOIN (entspricht der Vereinigungsmenge des LEFT JOIN
mit dem RIGHT JOIN)
SELECT * FROM Konto JOIN Kunde ON inhaber = kundennr
| kontonr | saldo | inhaber | kundennr | vorname | nachname | gebdat |
| 0000000001 | 100.0 | 0000005000 | 0000005000 | Egon | Mustermann | 1980-05-21 |
| 0000000002 | 500.0 | 0000005001 | 0000005001 | Schorsch | Müller | 1980-05-22 |
SELECT * FROM Konto LEFT JOIN Kunde ON inhaber = kundennr
| kontonr | saldo | inhaber | kundennr | vorname | nachname | gebdat |
| 0000000001 | 100.0 | 0000005000 | 0000005000 | Egon | Mustermann | 1980-05-21 |
| 0000000002 | 500.0 | 0000005001 | 0000005001 | Schorsch | Müller | 1980-05-22 |
SELECT * FROM Konto RIGHT JOIN Kunde ON inhaber = kundennr
| kontonr | saldo | inhaber | kundennr | vorname | nachname | gebdat |
| 0000000001 | 100.0 | 0000005000 | 0000005000 | Egon | Mustermann | 1980-05-21 |
| 0000005002 | Schorsch | Müller | 1979-02-11 |
Gruppierung mit GROUP BY
In der GROUP BY Klausel können Spalten zur Gruppierung spezifiziert werden. Hier können auch mehrere Spalten angegeben werden. Alle Datensätze deren gruppierte Felder die gleichen Werte beinhalten, werde zu einem Datensatz zusammengefasst.
Außerdem erlaubt eine Gruppierung den Einsatz von Spaltenfunktionen.
SELECT kontotyp, avg(saldo) FROM Konto GROUP BY kontotyp
Diese Abfrage liefert den durchschnittlichen Saldo für die erfassten Kontotypen.
Je nach Datentyp einer Spalte, können verschiedene Spaltenfunktionen benutzt werden.
Für Zahlen und Strings:
- min - Minimum einer Spalte
- max - Maximum einer Spalte
- count - Anzahl der Elemente einer Spalte
Nur für Zahlen:
- avg - Durschnittswert aller gruppierten Spaltenelemente
- sum - Summe aller gruppierten Spaltenelemente
Gruppierung mit Bedingung durch HAVING
Wird eine Gruppierung im SELECT Statement benutzt, kann man die zu gruppierenden Datensätze mit dem Schlüsselwort HAVING einschränken. Dieses kann nur in Verbindung mit GROUP BY verwendet werden.
SELECT kontotyp, avg(saldo) FROM Konto GROUP BY kontotyp HAVING avg(saldo) < 0
Diese Abfrage liefert den durchschnittlichen Saldo für die erfassten Kontotypen falls dieser negativ ist.
Die HAVING Klausel muss auf eine Spaltenfunktion angewendet werden.
Sortierung mit ORDER BY
Mit Hilfe der ORDER BY Klausel, kann die Ergebnistabelle in die gewünschte Reihenfolge gebracht werden. Hierbei kann nach einer oder mehreren Spalten jeweils auf- oder absteigend sortiert werden.
SELECT * FROM Kunde ORDER BY name ASC, vorname DESC
ASC: aufsteigende Sortierreihenfolge (ascending)
DESC: absteigende Sortierreihenfolge (descending)
ALIAS
Mit Hilfe des Schlüsselworts AS können die Spaltennamen der Ergebnistabelle angepasst werden. Weiter können innerhalb einer Abfrage Tabellen mit einem anderen Namen versehen werden.
SELECT saldo AS Guthaben from Konto AS Girokonto WHERE saldo > 0 AND kontotyp ='giro'
Literatur
Robert Grebner; Skript zur Vorlesung Datenbanken und Informationsmanagement an der Fachhochschule Würzburg
