## Tabellenausdruck (table_expression)

Ein Tabellenausdruck (table_expression) spezifiziert eine einfache oder eine gruppierte Ergebnistabelle.

### Syntax

<table_expression> ::= <from_clause> [<where_clause>] [<group_clause>] [<having_clause>]

<from_clause> ::= FROM <from_table_spec>,...
<where_clause> ::= WHERE <search_condition>
<group_clause> ::= GROUP BY <expression>,...
<having_clause> ::= HAVING <search_condition>

<from_table_spec> ::= <table_name> [AS] [<reference_name>]
| <result_table_name> [AS] [<reference_name>]
| (<query_expression>) [AS] [<reference_name>]
| <joined_table>

### Beispiele

SQL-Tutorial, Auswählen und Anordnen von Zeilen, Bilden von Gruppen: GROUP BY, HAVING

### Erläuterung

Ein Tabellenausdruck liefert eine Zwischenergebnistabelle. Wenn alle optionalen Klauseln fehlen, ist diese Zwischenergebnistabelle die von der FROM-Klausel gelieferte Ergebnistabelle. Sonst wird jede angegebene Klausel auf das Ergebnis der vorherigen Bedingung angewendet, und die Tabelle ist das Ergebnis der Anwendung der letzten spezifizierten Klausel. Die Zwischenergebnistabelle enthält alle Spalten aller in der FROM-Klausel aufgeführten Tabellen.

Die Reihenfolge der GROUP-Klausel und der HAVING-Klausel ist beliebig.

#### FROM-Klausel (from_clause)

Die FROM-Klausel from_clause spezifiziert eine Tabelle. Diese Tabelle kann aus mehreren Basis-, View-und Ergebnistabellen abgeleitet werden. Die Anzahl der zugrundeliegenden Tabellen einer FROM-Klausel ist die Summe der zugrundeliegenden Tabellen jeder FROM TABLE-Spezifikation from_table_spec. Die Anzahl der zugrundeliegenden Tabellen einer FROM-Klausel darf höchstens 64 sein.

Der Datenbankbenutzer muss das SELECT-Privileg für jede angegebene Tabelle oder für wenigstens eine Spalte der angegebenen Tabelle besitzen.

Das Ergebnis einer FROM-Klausel ist eine Tabelle, die aus den angegebenen Tabellen im Prinzip wie folgt erzeugt wird:

● Wenn die FROM-Klausel aus einer einzigen FROM TABLE-Spezifikation besteht, ist das Ergebnis die angegebene Tabelle.

● Wenn die FROM-Klausel mehr als eine FROM TABLE-Spezifikation enthält, wird eine Ergebnistabelle gebildet, die aus allen möglichen Kombinationen aller Zeilen der ersten Tabelle mit allen Zeilen der zweiten Tabelle usw. besteht. Im mathematischen Sinn wird also das kartesische Produkt sämtlicher Tabellen gebildet.

Diese Regel beschreibt die Wirkung der FROM-Klausel, nicht deren tatsächliche Implementierung.

#### WHERE-Klausel (where_clause)

Die WHERE-Klausel where_clause gibt die Bedingungen für das Bilden einer Ergebnistabelle an.

Die Suchbedingung search_condition wird auf jede Zeile der durch die FROM-Klausel gebildeten Zwischenergebnistabelle angewendet. Das Ergebnis der WHERE-Klausel ist eine Tabelle, die nur noch diejenigen Zeilen der Ergebnistabelle enthält, für die die Suchbedingung wahr ist.

Die Suchbedingung darf nur Spaltenspezifikationen enthalten, auf die der Benutzer das SELECT-Privileg hat.

Jede direkt in der Suchbedingung enthaltene Spaltenspezifikation muss eindeutig eine Spalte aus den in der FROM-Klausel des Tabellenausdrucks angegebenen Tabellen bezeichnen. Gegebenenfalls ist der Spaltenname durch den Tabellenbezeichner zu qualifizieren. Wenn in der FROM-Klausel für Tabellennamen Referenznamen reference_name definiert wurden, sind die Referenznamen als Tabellenbezeichner in der Suchbedingung zu verwenden.

Ein in der Suchbedingung enthaltener Ausdruck expression darf bis auf folgende Ausnahme keine Set-Funktion enthalten:

SELECT ... FROM uppertab,...
HAVING ... (SELECT ...
WHERE MIN(uppertab, ...)...
)

Die SELECT-Anweisung in der angegebenen Form ist erlaubt.

In der in einer HAVING-Klausel verwendeten Subquery ist es möglich, WHERE-Klauseln zu verwenden, die Set-Funktionen für die Spalten der in der SELECT … HAVING-Anweisung angegebenen Tabelle enthalten.

Im Fall einer Correlated Subquery kann eine Spaltenspezifikation eine Spalte einer Tabelle bezeichnen, die in einer FROM-Klausel eines anderen Tabellenausdrucks der QUERY-Spezifikation angegeben wurde.

Jede Subquery in der Suchbedingung wird in der Regel nur einmal ausgewertet. Im Fall einer Correlated Subquery wird die Subquery für jede Zeile der durch die FROM-Klausel gebildeten Ergebnistabelle ausgeführt.

#### GROUP-Klausel (group_clause)

Die GROUP-Klausel group_clause gibt eine Gruppierung einer Ergebnistabelle an.

Jeder in der GROUP-Klausel angegebene Spaltenname muss einen result_column_name in den selektiertem Spalten der QUERY-Spezifikation bezeichnen oder eindeutig eine Spalte aus den der QUERY-Spezifikation zugrundeliegenden Tabellen bezeichnen. Gegebenenfalls ist der Spaltenname mit dem Tabellenbezeichner zu qualifizieren.

Die GROUP-Klausel erlaubt die Anwendung der Set-Funktionen AVG, COUNT, MAX/MIN, STDDEV, SUM und VARIANCE nicht nur für ganze Ergebnistabellen, sondern für Gruppen von Zeilen innerhalb einer Ergebnistabelle. Dabei wird eine Gruppe durch die in GROUP BY angegebenen Gruppierspalten definiert. Alle Zeilen einer Gruppe haben in den Gruppierspalten dieselben Werte. Zeilen, die in einer Gruppierspalte den NULL-Wert enthalten, werden zu einer Gruppe zusammengefasst. Dasselbe gilt für den Spezial-NULL-Wert.

Die Verwendung von GROUP BY führt dazu, dass für jede Gruppe eine Zeile in der Ergebnistabelle gebildet wird. Die selektierten Spalten in der QUERY-Spezifikation dürfen deshalb nur die Gruppierspalten, Operationen auf den Gruppierspalten und Ausdrücke (expression) enthalten, in denen die Funktionen SUM, AVG, MAX/MIN, COUNT, STDDEV und VARIANCE verwendet werden.

Wenn es keine Zeile gibt, die die in der WHERE-Klausel angegebenen Bedingungen erfüllt, und eine GROUP-Klausel angegeben wurde, ist die Ergebnistabelle leer.

In einer GROUP-Klausel ist die Angabe skalarer Subqueries nicht erlaubt.

#### HAVING-Klausel (having_clause)

Die HAVING-Klausel having_clause spezifiziert die Eigenschaften einer Gruppe.

Jeder in der Suchbedingung search_condition auftretende Ausdruck, der nicht im Argument einer Set-Funktion auftritt, muss eine Gruppierspalte bezeichnen.

Wenn die HAVING-Klausel ohne GROUP-Klausel angewendet wird, wird die bisher gebildete Ergebnistablle als eine Gruppe betrachtet.

Die Suchbedingung wird auf jede Gruppe der Ergebnistabelle angewendet. Das Ergebnis der HAVING-Klausel ist eine Tabelle, die nur noch die Gruppen enthält, für die die Suchbedingung wahr ist.

#### FROM TABLE-Spezifikation (from_table_spec)

Jede FROM TABLE-Spezifikation from_table_spec in einer FROM-Klausel spezifiziert keinen, einen oder beliebig viele Tabellenbezeichner.

##### Referenzname (reference_name)

Wenn eine FROM TABLE-Spezifikation keinen Referenznamen enthält, ist der Tabellenname table_name bzw. der Ergebnistabellenname result_table_name der Tabellenbezeichner.

Wenn eine FROM TABLE-Spezifikation einen Referenznamen enthält, ist der Referenzname der Tabellenbezeichner.

Jeder Referenzname muss sich von jedem Bezeichner, der einen Tabellennamen angibt, unterscheiden. Wenn ein Ergebnistabellenname ein Tabellenbezeichner ist, darf es keinen Tabellenbezeichner table_name der Form [<schema_name>.]<result_table_name> geben. Jeder Tabellenbezeichner muss sich von jedem anderen Tabellenbezeichner unterscheiden.

Der Gültigkeitsbereich der Tabellenbezeichner ist die ganze QUERY-Spezifikation, innerhalb der die FROM TABLE-Spezifikation verwendet wird. Wenn innerhalb der QUERY-Spezifikation Spaltennamen qualifiziert werden sollen, muss das mit den Tabellenbezeichnern geschehen.

Referenznamen sind unbedingt nötig für die Formulierung von JOIN-Bedingungen einer Tabelle mit sich selbst. Zum Beispiel wird durch FROM HOTEL, HOTEL X ein Referenzname X für das zweite Auftreten der Tabelle HOTEL definiert. Darüber hinaus sind Referenznamen manchmal nötig für die Formulierung von Correlated Subqueries. Außerdem ist ein Referenzname notwendig, wenn nur durch die Angabe des Referenznamens eine Spalte des Ergebnisses des QUERY-Ausdrucks eindeutig bezeichnet werden kann.

##### Anzahl der zugrundeliegenden Tabellen

Wenn eine FROM TABLE-Spezifikation eine Basistabelle, eine Ergebnistabelle oder das Ergebnis eines QUERY-Ausdrucks bezeichnet, ist die Anzahl der zugrundeliegenden Tabellen dieser FROM TABLE-Spezifikation gleich 1.

Wenn eine FROM TABLE-Spezifikation eine komplexe View-Tabelle bezeichnet, ist die Anzahl der zugrundeliegenden Tabellen dieser FROM TABLE-Spezifikation gleich 1.

Wenn eine FROM TABLE-Spezifikation eine View-Tabelle bezeichnet, die keine komplexe View-Tabelle ist, ist die Anzahl der zugrundeliegenden Tabellen gleich der Anzahl der zugrundeliegenden Tabellen der FROM-Klausel der View-Tabelle.

Wenn eine FROM TABLE-Spezifikation eine Join-Tabelle joined_table bezeichnet, ist die Anzahl der zugrundeliegenden Tabellen dieser FROM TABLE-Spezifikation die Summe der zugrundeliegenden Tabellen der in ihr enthaltenen FROM TABLE-Spezifikationen.

##### QUERY-Ausdruck (query_expression)

Eine FROM TABLE-Spezifikation, in der ein QUERY-Ausdruck query_expression enthalten ist, spezifiziert nur dann einen Tabellenbezeichner, wenn ein Referenzname reference_name angegeben ist.

Enthält eine FROM TABLE-Spezifikation einen QUERY-Ausdruck, so wird eine Ergebnistabelle gebildet, die diesem QUERY-Ausdruck entspricht. Diese Ergebnistabelle erhält einen systeminternen Namen, der weder mit einer unbenannten noch einer benannten Ergebnistabelle kollidiert. Während der Bearbeitung der FROM-Bedingung wird das Ergebnis des QUERY-Ausdrucks wie eine benannte Ergebnistabelle verwendet und nach der Bearbeitung implizit gelöscht.

Ein Tabellenausdruck, in dem mindestens ein OUTER JOIN-Indikator oder OUTER JOIN TYPE (LEFT | RIGHT | FULL) angegeben wird, ist strengen Restriktionen unterworfen, wenn mehr als zwei Tabellen zugrundeliegen sollen. Daher ist die Verwendung eines QUERY-Ausdrucks häufig notwendig für die Formulierung einer QUERY-Spezifikation, der mindestens drei Tabellen zugrundeliegen sollen und in der mindestens ein OUTER JOIN-Indikator in einem JOIN-Prädikat verwendet wird.

##### JOINED TABLE (joined_table)

Eine FROM TABLE-Spezifikation, in der eine Join-Tabelle joined_table enthalten ist, spezifiziert so viele Tabellenbezeichner wie durch die in ihr enthaltenen FROM TABLE-Spezifikationen angegeben sind.

Siehe auch:

Restriktionen für SQL-Anweisungen