Ausführliche SELECT-Struktur

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Seitentitel: Einführung in SQL: Ausführliche SELECT-Struktur
(Einführung in SQL: Ausführliche SELECT-Struktur)


Dieses Kapitel erläutert die Syntax des SELECT-Befehls. Anstelle von Beispielen gibt es Verweise auf diejenigen Kapitel, die die betreffenden Klauseln genauer behandeln.

In diesem Kapitel werden vorzugsweise die englischen Begriffe aus der SQL-Dokumentation benutzt.

Bitte beachten Sie: Der SELECT-Befehl bietet so umfangreiche Möglichkeiten, dass auch bei dieser Übersicht nicht alle Einzelheiten vorgestellt werden können.

Allgemeine Syntax[Bearbeiten]

Der SELECT-Befehl wird als <query specification> oder <select expression>, also Abfrage-Ausdruck bezeichnet und setzt sich grundsätzlich aus diesen Bestandteilen zusammen:

 SELECT 
   [ DISTINCT | ALL ] 
     <select list>
     FROM <table reference list>
   [ <where clause> ]
   [ <group by clause> ]
   [ <having clause> ]
   [ UNION [ALL] <query specification> ]
   [ <order by clause> ]

Diese Bestandteile setzen sich je nach Situation aus weiteren einfachen oder komplexen Bestandteilen zusammen und werden in den folgenden Abschnitten erläutert.

Unbedingt erforderlich sind:

  • das Schlüsselwort SELECT
  • eine Liste von Spalten
  • das Schlüsselwort FROM mit einem oder mehreren Verweisen auf Tabellen

Alle anderen Bestandteile sind optional, können also auch weggelassen werden. Wenn sie benutzt werden, müssen sie in genau der genannten Reihenfolge verwendet werden.

Set Quantifier – Mengenquantifizierer[Bearbeiten]

Als Mengenquantifizierer stehen DISTINCT und ALL zur Verfügung.

Außerdem ist es sehr oft möglich (wenn auch nicht im SQL-Standard vorgeschrieben), das Ergebnis auf eine bestimmte Anzahl von Zeilen zu beschränken, z. B. FIRST 3 oder LIMIT 7.

Erläuterungen dazu finden sich im Kapitel Nützliche Erweiterungen.

Select List – Auswahlliste[Bearbeiten]

Die Liste der Spalten, die ausgewählt werden sollen, wird angegeben durch den Asterisk oder mit einer <column list>.

Asterisk *[Bearbeiten]

Der Asterisk, d. h. das Sternchen *, ist eine Kurzfassung und steht für die Liste aller Spalten (Felder) einer einzelnen Tabelle.

Wenn mehrere Tabellen verknüpft werden, ist der Asterisk zusammen mit dem Namen oder dem Alias einer Tabelle anzugeben.

 <Tabellenname>.*   /* oder */
 <Tabellen-Alias>.*

Erläuterungen dazu finden sich in allen Kapiteln, die sich mit Abfragen befassen.

Column List[Bearbeiten]

Die <Spaltenliste> ist eine Liste von einem oder mehreren Elementen, die in der SQL-Dokumentation als <select sublist> bezeichnet werden:

 <select sublist> [ , <select sublist> , <select sublist> , ... ]

Jedes einzelne Element ist eine Spalte einer Tabelle oder eine abgeleitete Spalte <derived column> – siehe den nächsten Abschnitt. Jedem Element kann ein Spalten-Alias zugewiesen, das Wort AS kann dabei auch weggelassen werden:

 <element> [ [AS] <column name> ]

Bei Spalten aus Tabellen wird einfach deren Name angegeben. Wenn mehrere Tabellen verknüpft werden und ein Spaltenname nicht eindeutig ist, ist der Spaltenname zusammen mit dem Namen oder dem Alias einer Tabelle anzugeben.

 <spaltenname>                   /* oder */
 <Tabellenname>.<spaltenname>    /* oder */
 <Tabellen-Alias>.<spaltenname>

Hinweis: In manchen DBMS darf der Tabellenname nicht mehr benutzt werden, wenn ein Tabellen-Alias angegeben ist.

Erläuterungen und Beispiele dazu finden sich in allen Kapiteln, die sich mit Abfragen befassen.

Derived Column[Bearbeiten]

Eine abgeleitete Spalte bezeichnet den Wert, der von einem <value expression> zurückgeliefert wird. Das kann ein beliebiger Ausdruck sein, der genau einen Wert als Ergebnis hat: vor allem eine Funktion oder eine passende Unterabfrage.

Erläuterungen dazu finden sich vor allem in den Kapiteln Berechnete Spalten und Unterabfragen.

Table Reference List – Tabellen-Verweise[Bearbeiten]

Als Bestandteil der FROM-Klausel werden die beteiligten Tabellen und Verweise darauf aufgeführt:

 FROM <reference list>     /* nämlich */
 FROM <reference1> [ , <reference2> , <reference3> ... ]

In der <Tabellenliste> stehen eine oder (mit Komma getrennt) mehrere Verweise (Referenzen); diese können direkt aus der Datenbank übernommen oder auf verschiedene Arten abgeleitet werden.

Jede dieser Varianten kann erweitert werden:

 <reference> [ [ AS ] <Alias-Name>
               [ ( <derived column list> ) ] ]

Mit AS kann ein Alias-Name dem Verweis hinzugefügt werden; das Schlüsselwort AS kann auch entfallen. Diesem Tabellen-Alias kann (je nach DBMS) in Klammern eine Liste von Spaltennamen hinzugefügt werden, die anstelle der eigentlichen Spaltennamen angezeigt werden sollen.

Die folgenden Varianten sind als Verweise möglich.

Tabellen, Views[Bearbeiten]

Primär verwendet man die Tabellen sowie die Views (fest definierte Sichten).

Erläuterungen dazu finden sich in allen Kapiteln, die sich mit Abfragen befassen, sowie in Erstellen von Views.

Derived Table – Abgeleitete Tabellen[Bearbeiten]

Vor allem können Unterabfragen wie eine Tabelle benutzt werden.

Hinweis: Es gibt eine Reihe weiterer Varianten, um andere Tabellen „vorübergehend“ abzuleiten. Wegen der DBMS-Unterschiede würde die Übersicht zu kompliziert; wir verzichten deshalb auf eine vollständige Darstellung.

Erläuterungen dazu finden sich im Kapitel Unterabfragen.

Joined Table – Verknüpfte Tabelle[Bearbeiten]

Wie eine Tabelle kann auch eine Verknüpfung verwendet werden. Dabei handelt es sich um zwei Tabellen, die nach bestimmten Bedingungen verbunden werden.

Für die Verknüpfung zweier (oder mehrerer) Tabellen gibt es zwei Verfahren: Beim (traditionellen) direkten Weg werden die beiden Tabellen einfach nacheinander aufgeführt. Beim (modernen) Weg wird zu einer Tabelle eine weitere mit JOIN genannt, die durch eine Verknüpfungsbedingung über ON verbunden wird.

Erläuterungen dazu finden sich ab dem Kapitel Mehrere Tabellen.

Where Clause – WHERE-Klausel[Bearbeiten]

Mit der WHERE-Klausel wird eine Suchbedingung festgelegt, welche Zeilen der Ergebnistabelle zur Auswahl gehören sollen. Dieser Filter wird zuerst erstellt; erst anschließend werden Bedingungen wie GROUP BY und ORDER BY ausgewertet.

 WHERE <search condition>

Die Suchbedingung <search condition> ist eine Konstruktion mit einem eindeutigen Prüfergebnis: Entweder die Zeile gehört zur Auswahl, oder sie gehört nicht zur Auswahl. Es handelt sich also um eine logische Verknüpfung von einer oder mehreren booleschen Variablen.

Erläuterungen zu den folgenden Einzelheiten finden sich vor allem in den Kapiteln WHERE-Klausel im Detail und Unterabfragen.

Eine einzelne Suchbedingung[Bearbeiten]

Eine Suchbedingung hat eine der folgenden Formen, deren Ergebnis immer WAHR oder FALSCH (TRUE bzw. FALSE) lautet:

 <wert1> [ NOT ] <operator> <wert2>
 <wert1> [ NOT ] BETWEEN <wert2> AND <wert3>
 <wert1> [ NOT ] LIKE <wert2> [ ESCAPE <wert3> ]
 <wert1> [ NOT ] CONTAINING <wert2>
 <wert1> [ NOT ] STARTING [ WITH ] <wert2>
 <wert1> IS [ NOT ] NULL
 <wert1> [ NOT ] IN <werteliste>
 EXISTS <select expression>
 NOT <search condition>

Anstelle eines Wertes kann auch ein Wertausdruck <value expression> stehen, also eine Unterabfrage, die genau einen Wert als Ergebnis liefert.

Anstelle einer Werteliste kann auch ein Auswahl-Ausdruck <select expression> stehen, also eine Unterabfrage, die eine Liste mehrerer Werte als Ergebnis liefert.

Als <operator> sind folgende Vergleiche möglich, und zwar sowohl für Zahlen als auch für Zeichenketten und Datumsangaben:

 =  <  >  <=  >=  <>

Mehrere Suchbedingungen[Bearbeiten]

Mehrere Suchbedingungen können miteinander verbunden werden:

 NOT <search condition> 
 <search condition1> AND <search condition2>
 <search condition1> OR  <search condition2>

Bitte beachten Sie: NOT hat die stärkste Verbindung und wird zuerst ausgewertet. Danach hat AND eine stärkere Verbindung und wird als nächstes untersucht. Erst zum Schluss kommen die OR-Verbindungen. Um Unklarheiten zu vermeiden, wird dringend empfohlen, zusammengesetzte Suchbedingungen in Klammern zu setzen, um Prioritäten deutlich zu machen.

Group By Clause – GROUP BY-Klausel[Bearbeiten]

Mit der GROUP BY-Klausel werden alle Zeilen, die in einer oder mehreren Spalten den gleichen Wert enthalten, in jeweils einer Gruppe zusammengefasst. Dies macht in der Regel nur dann Sinn, wenn in der Spaltenliste des SELECT-Befehls eine gruppenweise Auswertung, also eine der Spaltenfunktionen enthalten ist.

Die allgemeine Syntax lautet:

 GROUP BY <Spaltenliste>

Die Spaltenliste enthält, durch Komma getrennt, die Namen von einer oder mehreren Spalten. Bei jeder Spalte kann eine eigene Sortierung angegeben werden (wie bei den Datentypen erläutert):

   <Spaltenname>
   -- oder
   <Spaltenname> COLLATE <Collation-Name>

Erläuterungen dazu finden sich vor allem im Kapitel Gruppierungen.

Having Clause – HAVING-Klausel[Bearbeiten]

Die HAVING-Klausel dient dazu, nicht alle ausgewählten Zeilen in die Ausgabe zu übernehmen, sondern nur diejenigen, die den zusätzlichen Bedingungen entsprechen. Sie wird in der Praxis überwiegend als Ergänzung zur GROUP BY-Klausel verwendet und folgt ggf. direkt danach.

 HAVING <bedingungsliste>

Erläuterungen dazu finden sich ebenfalls im Kapitel Gruppierungen.

Union Clause – UNION-Klausel[Bearbeiten]

Mit der UNION-Klausel werden mehrere eigentlich getrennte Abfragen zusammengefasst, um ein einheitliches Ergebnis zu liefern. Dabei sind die einzelnen Bedingungen zu komplex, um sie zusammenzufassen; oder sie können nicht sinnvoll verbunden werden. Es setzt eine weitgehend identische Spaltenliste voraus.

 SELECT <spaltenliste1> FROM <tabellenliste1> WHERE <bedingungsliste1>
 UNION
 SELECT <spaltenliste2> FROM <tabellenliste2> WHERE <bedingungsliste2>

Erläuterungen dazu finden sich im Kapitel Nützliche Erweiterungen.

Order By Clause – ORDER BY-Klausel[Bearbeiten]

Mit der ORDER BY-Klausel werden die Datensätze der Ergebnismenge in eine bestimmte Reihenfolge gebracht.

Erläuterungen dazu finden sich in allen Kapiteln, die sich mit Abfragen befassen.

Zusammenfassung[Bearbeiten]

In diesem Kapitel erhielten Sie einen umfangreichen Überblick über die Syntax des SELECT-Befehls:

  • Die Listen der gewünschten Spalten und der beteiligten Tabellen sind Pflichtangaben, alle anderen Klauseln sind optional.
  • Für die Verknüpfung mehrerer Tabellen gibt es einen (traditionellen) direkten Weg und den (modernen) Weg über JOIN.
  • Die WHERE-Klausel ermöglicht komplexe Bedingungen darüber, welche Datensätze abgefragt werden sollen.
  • Mit Gruppierung, Sortierung und Zusammenfassung gibt es weitere Möglichkeiten für Abfragen.

Übungen[Bearbeiten]

Übung 1 Allgemeine Syntax Zur Lösung

Bringen Sie die folgenden Bestandteile des SELECT-Befehls in die richtige Reihenfolge (es gibt Begriffe, die an zwei bzw. drei Stellen gehören):

<bedingung> – DISTINCT – FROM – GROUP BY – HAVING – 
ORDER BY – SELECT – <spalten> – <tabelle> – WHERE 

Übung 2 Allgemeine Syntax Zur Lösung

Welche der genannten Bestandteile eines SELECT-Befehls sind unbedingt erforderlich?

Übung 3 Spaltenliste Zur Lösung

Welche der folgenden Spaltenlisten aus der Beispieldatenbank sind richtig, welche nicht?

  1. SELECT * FROM Mitarbeiter;
  2. SELECT ID, Name FROM Mitarbeiter;
  3. SELECT ID, Name FROM Mitarbeiter, Abteilung;
  4. SELECT ID, Name, Kuerzel FROM Mitarbeiter, Abteilung;
  5. SELECT ab.ID, Name FROM Mitarbeiter, Abteilung ab;
  6. SELECT ab.ID, Name, Krz Kuerzel FROM Mitarbeiter, Abteilung ab;
  7. SELECT ab.ID, Name, Kuerzel Krz FROM Mitarbeiter, Abteilung ab;
  8. SELECT ab.ID, mi.Name, ab.Kuerzel FROM Mitarbeiter mi, Abteilung ab;

Übung 4 Spaltenliste Zur Lösung

Schreiben Sie für folgende Abfragen die Spalten und Tabellen auf.

  1. Zeige alle Informationen zu den Mitarbeitern.
  2. Zeige zu jedem Mitarbeiter Name, Vorname und Nummer der Abteilung.
  3. Zeige zu jedem Mitarbeiter Name, Vorname und Kuerzel der Abteilung.
  4. Zeige zu jedem Mitarbeiter ID, Name, Vorname sowie das Kennzeichen des Dienstwagens.

Übung 5 Suchbedingungen Zur Lösung

Welche der folgenden Suchbedingungen sind richtig, welche nicht? Welche korrekten Bedingungen liefern immer FALSE als Ergebnis?

  1. WHERE Name NOT = 'Meyer';
  2. WHERE 1 = 2;
  3. WHERE NOT Name LIKE 'M%';
  4. WHERE Geburtsdatum LIKE '1980';
  5. WHERE ID BETWEEN 20 AND 10;
  6. WHERE Mobil IS NULL;
  7. WHERE Name IS NULL;
  8. WHERE Name STARTING WITH 'L' AND CONTAINING 'a';
  9. WHERE ID IN (1, 3, 'A');
  10. WHERE ID IN (1, 3, '5');

Übung 6 Suchbedingungen Zur Lösung

Formulieren Sie die folgenden Aussagen als Bedingungen der WHERE-Klausel zur Tabelle Mitarbeiter.

  1. Der Vorname lautet 'Petra'.
  2. Der Name enthält die Zeichen 'mann'.
  3. Der Name beginnt mit 'A', es handelt sich um Abteilung 8.
  4. Es ist keine Mobil-Nummer gespeichert.
Lösungen

Lösung zu Übung 1 Allgemeine Syntax Zur Übung

Richtig ist dies (mit Vervollständigung zu einem Befehl):

SELECT DISTINCT <spalten>
  FROM <tabelle>
 WHERE <bedingung>
 GROUP BY <spalten>
   HAVING <bedingung>
 ORDER BY <spalten>;

Lösung zu Übung 2 Allgemeine Syntax Zur Übung
SELECT <spalten> FROM <tabelle>

Lösung zu Übung 3 Spaltenliste Zur Übung

Richtig sind 1, 2, 5, 7, 8.

Falsch sind 3, 4 (ID ist mehrdeutig), 6 (Spaltenname und -Alias in falscher Reihenfolge).

Lösung zu Übung 4 Spaltenliste Zur Übung

  1. SELECT * FROM Mitarbeiter
  2. SELECT Name, Vorname, Abteilung_ID FROM Mitarbeiter
  3. SELECT Name, Vorname, Kuerzel FROM Mitarbeiter, Abteilung
    /* oder mit Tabellen-Alias: */
    SELECT mi.Name, mi.Vorname, ab.Kuerzel FROM Mitarbeiter mi, Abteilung ab
  4. SELECT Name, Vorname, Dienstwagen.ID, Kennzeichen FROM Mitarbeiter, Dienstwagen
    /* auch einheitlich mit Tabellen-Namen oder Tabellen-Alias möglich */

Lösung zu Übung 5 Suchbedingungen Zur Übung
  1. Richtig.
  2. Richtig, immer FALSE: 1 ist immer ungleich 2.
  3. Richtig, weil die Teilbedingung "Name LIKE 'M%'" verneint wird. Ebenfalls richtig wäre es, das NOT hinter <wert1>, also hinter Name zu schreiben.
  4. Richtig, weil das Jahr laut ISO 8601 am Anfang steht.
  5. Richtig, immer FALSE: es gibt keine Zahl „größer/gleich 20“ und gleichzeitig „kleiner/gleich 10“.
  6. Richtig.
  7. Richtig, immer FALSE, weil der Name als Pflichtangabe niemals NULL sein kann.
  8. Falsch, weil Name in der zweiten Bedingung hinter AND fehlt.
  9. Falsch, weil 'A' keine Zahl ist, aber zu ID bei IN eine Liste von Zahlen gehört.
  10. Richtig, weil '5' automatisch als Zahl konvertiert wird.

Lösung zu Übung 6 Suchbedingungen Zur Übung

  1. WHERE Vorname = 'Petra';
  2. WHERE Name CONTAINING 'mann';
  3. WHERE Name STARTING WITH 'A' AND Abteilung_ID = 8;
  4. WHERE Mobil = '' OR Mobil IS NULL;