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