SELECT-Ausdrücke

SELECT selection   table-expression

Ein select-expression gibt eine Ergebnistabelle an. Sie wird bei den folgenden Statements benutzt: INSERT | SELECT | UPDATE

Dieses Dokument behandelt folgende Themen:


selection

ALL
DISTINCT

../graphics/cbo3b.gif

scalar-expression [[AS] correlation-name]

, ../graphics/dot3.gif

../graphics/cbc3b.gif

  *  

Mit selection geben Sie die Spalten der auszuwählenden Ergebnissatztabellen an.

Syntax-Element-Beschreibung:

Syntax-Element Beschreibung
ALL | DISTINCT
Eliminierung doppelt vorkommender Zeilen:

Doppelt vorkommende Zeilen werden nicht automatisch aus dem Ergebnis eines select-expression entfernt. Wenn Sie dies wünschen, müssen Sie das Schlüsselwort DISTINCT angeben.

Die Alternative zu DISTINCT ist ALL. Wenn Sie nichts angeben, gilt ALL.

scalar-expression
Skalar-Ausdruck:

Anstelle eines einfachen Spaltennamen können Sie auch allgemeine scalar-expressions angeben, die Skalar-Operatoren und Skalar-Funktionen enthalten, die berechnete Werte liefern. Siehe Skalar-Ausdrücke.

Beispiel:

SELECT NAME, 65 - AGE 
  FROM SQL-PERSONNEL 
  ...
AS Das optionale Schlüsselwort AS steht zu Beginn eines correlation-name für eine Spalte.
correlation-name
Korrelationsname:

Es besteht die Möglichkeit, einem scalar-expression einen correlation-name als Alias-Namen für eine Ergebnisspalte zuzuweisen.

Der correlation-name braucht nicht eindeutig sein. Wenn für eine Ergebnisspalte kein correlation-name angegeben wird, wird der betreffende column-name genommen (falls sich die Ergebnisspalte von einem Spaltennamen ableitet; andernfalls hat die Ergebnisspalte keinen Namen). Der Name einer Ergebnisspalte kann beispielsweise als Spaltenname in der ORDER BY-Klausel eines SELECT-Statements angegeben werden.

*
Stern-Notation (*) :

Alle Spalten aller in der FROM-Klausel angegebenen Tabellen werden ausgewählt.

Beispiel:

SELECT * 
  FROM SQL-PERSONNEL, SQL-AUTOMOBILES 
  ...

table-expression

from-clause [where-clause]
[group-by-clause] [having-clause]
[order-by-clause] [fetch-first-clause]

Ein table-expression gibt an, von wo und nach welchen Kriterien Zeilen ausgewählt werden sollen.

Folgende Themen werden behandelt:

FROM-Klausel

FROM table-reference,…

Diese Klausel gibt an, von welchen Tabellen die Ergebnismenge erstellt werden soll.

Table Reference

table-name [period-specification] [correlation-clause]
[TABLE] subquery correlation-clause
joined-table
TABLE (function-name (scalar-expression,...)) correlation-clause
data-change-table-reference [correlation-clause]
xmltable-function correlation-clause

Die in der FROM-Klausel angegebenen Tabellen müssen die in der Auswahlliste verwendeten Spaltenfelder enthalten.

Sie können entweder eine einzelne Tabelle angeben oder eine Zwischenergebnistabelle erzeugen, die das Ergebnis einer subquery oder einer Join-Operation ist (siehe unten).

Da in einer FROM-Klausel mehrere Tabellen (d.h. DDMs) angesprochen werden können und eine table-expression mehrere FROM-Klauseln enthalten kann, wenn subqueries angegeben sind, bestimmt die Datenbanknummer (DBID) des ersten DDMs in der ersten FROM-Klausel die zugrunde liegende Datenbank.

TABLE function-name-Klausel

Die TABLE function-name-Klausel gehört zum SQL Extended Set und erfordert eine correlation-clause mit einer column-name-Liste.

period-specification

FOR

SYSTEM_TIME
BUSINESS_TIME

AS OF expr
FROM expr1 TO expr2
BETWEEN expr1 AND expr2

Mit der optionalen Angabe einer period-specification geben Sie an, dass für die Zeittabelle (table-name) eine Zeitraumangabe gilt. Derselbe Zeitraumname (SYSTEM_TIME oder BUSINESS_TIME) darf nicht mehr als einmal für dieselbe Tabelle angegeben werden.

Syntax-Element-Beschreibung:

Syntax-Element Beschreibung
FOR SYSTEM_TIME Gibt an, dass der SYSTEM_TIME-Zeitraum für die Zeitraumangabe benutzt wird. SYSTEM_TIME muss ein Zeitraum sein, der in der Tabelle definiert ist, und die die Tabelle muss eine vom System verwaltete Zeittabelle sein, die bei der Systemdatenversionierung definiert wird.
FOR BUSINESS_TIME Gibt an, dass der BUSINESS_TIME-Zeitraum für die Zeitraumangabe benutzt wird. BUSINESS_TIME muss ein Zeitraum sein, der in der Tabelle definiert ist
expr, expr1, expr2 Geben Sie Audrücke an, die einen Wert eines eingebauten Datentyps zurückgeben, der mit dem Datentyp der Spalten des angegebenen Zeitraums vergleichbar sein und der keine TIME ZONE enthalten darf.
AS OF expr Gibt an, dass die Tabelle jede Zeile enthält, für die der Startwert für den angegebenen Zeitraum kleiner als der oder gleich dem Ausdruck expr und der Endewert für den angebenen Zeitraum größer als der Ausdruck expr ist.
FROM expr1 TO expr2 Gibt an, dass die Tabelle Zeilen enthält, die für den mit expr1 bis expr2 angegebenen Zeitraum vorhanden sind. Eine Zeile wird in die Tabelle aufgenommen, wenn der Startwert für den Zeitraum in der Zeile kleiner als expr2 und der Endewert für den Zeitraum in der Zeile größer als expr1 ist.
BETWEEN expr1 AND expr2 Gibt an, dass die Tabelle eine Zeile enthält, in welcher sich der angegebene Zeitraum zu einem beliebigen Zeitpunkt zwischen expr1 und expr2 überlappt. Eine Zeile wird in die Tabelle aufgenommen, wenn der Startwert für den Zeitraum in der Zeile kleiner als oder gleich expr2 und der Endewert für den Zeitraum in der Zeile größer als expr1 ist.

Optional kann eine correlation-clause zu einem table-name zugeordnet werden. Bei einer subquery muss eine correlation-clause zugeordnet werden.

correlation-clause

[AS] correlation-name [(column-name,...)]

Eine correlation-clause besteht aus dem optionalen Schlüsselwort AS und einem correlation-name. Optional kann danach noch eine einfache Liste mit Spaltennamen angegeben werden. column-name gehört zum SQL Extended Set.

joined-table

table-reference

INNER
LEFT [OUTER]
RIGHT [OUTER]
FULL [OUTER]

JOIN table-reference ON join-condition

(joined-table)

Eine joined-table gibt eine Zwischenergebnistabelle an, die das Ergebnis einer Zusammenfügungsoperation (Join) ist.

Bei der Zusammenfügung kann es sich um einen INNER, LEFT OUTER, RIGHT OUTER oder FULL OUTER JOIN handeln. Falls Sie nichts angeben, gilt INNER.

Es ist möglich, mehrere Joins zu schachteln, d.h. die Tabellen, die die Zwischenergebnistabelle bilden, können ihrerseits Zwischenergebnistabellen einer Zusammenfügungsoperation oder einer subquery sein, wobei letztere wiederum ebenfalls eine joined-table oder eine weitere subquery in der FROM-Klausel haben kann.

Jjoin-condition

Bei INNER-, LEFT OUTER- und RIGHT OUTER-Zusammenfügungen:

search-condition

Bei FULL OUTER-Zusammenfügungen:

full-join-expression = full-join-expression [AND ]

full-join-expression

column-name

VALUE
COALESCE

(column-name , )

Innerhalb einer join-expression sind nur column-names und die scalar-function VALUE (oder ihr Synonym COALESCE) erlaubt.

Siehe Informationen zu column-name.

data-change-table-reference

FINAL TABLE (INSERT-statement)

FINAL
OLD

TABLE (searched-UPDATE-statement)
OLD TABLE (searched-DELETE-statement)
FINAL TABLE (MERGE-statement)

Eine data-change-table-reference gibt eine Zwischenergebnistabelle an, die auf den Zeilen basiert, die durch das in der FROM-Klausel angegebene SQL-Datenänderungs-Statement verändert werden. Eine data-change-table-reference kann nur als die einzige Tabellenreferenz in der FROM-Klausel angegeben werden.

Syntax-Element-Beschreibung:

Syntax-Element Beschreibung
FINAL TABLE Gibt an, dass die Zeilen der Zwischenergebnistabelle den Satz Zeilen, die vom SQL-Datenänderungs-Statement geändert werden, so darstellt wie sie beim Beenden des SQL-Datenänderungs-Statement erscheinen.
OLD TABLE Gibt an, dass die Zeilen der Zwischenergebnistabelle den Satz Zeilen, die vom SQL-Datenänderungs-Statement geändert werden, so darstellt, wie sie vor der Anwendung des SQL-Datenänderungs-Statement vorhanden sind.

xmltable-function

Eine xmltable-function gibt den Aufruf der eingebauten XMLTABLE-Funktion an.

WHERE-Klausel

[WHERE search-condition]

In der WHERE-Klausel geben Sie ein Auswahlkriterium (search-condition) an, nach dem die Zeilen ausgewählt werden sollen.

Beispiel:

DEFINE DATA LOCAL 
01 NAME   (A20) 
01 AGE    (I2) 
END-DEFINE 
... 
SELECT * 
  INTO NAME, AGE 
  FROM SQL-PERSONNEL   
  WHERE AGE = 32 
END-SELECT 
...

Weitere Informationen siehe Suchbedingungen.

GROUP BY-Klausel

[GROUP BY column-reference, ...]

Die GROUP BY-Klausel sortiert die durch der FROM-Klausel angegebene Tabelle nach Gruppen, und zwar so, dass alle Zeilen einer Gruppe in der GROUP BY-Spalte den gleichen Wert haben.

Jede column-reference in der Selektionsliste muss entweder eine GROUP BY-Spalte sein oder mit einer aggregate-function angegeben werden. aggregate-functions werden auf einzelne Gruppen (nicht auf die ganze Tabelle) angewandt. Die Ergebnistabelle enthält soviele Zeilen wie Gruppen.

Weitere Informationen siehe Column Reference und Aggregate Function.

Beispiel:

DEFINE DATA LOCAL 
1 #AGE     (I2) 
1 #NUMBER  (I2) 
END-DEFINE 
... 
SELECT AGE , COUNT(*)  
  INTO #AGE, #NUMBER 
  FROM SQL-PERSONNEL 
  GROUP BY AGE 
  ...

Falls der GROUP BY-Klausel eine WHERE-Klausel vorangeht, werden alle Zeilen, die nicht die WHERE-Klausel erfüllen, ausgeschlossen, bevor die Sortierung erfolgt.

HAVING-Klausel

[HAVING search-condition]

Wenn Sie eine HAVING-Klausel verwenden, sollten Sie auch eine GROUP BY-Klausel verwenden.

So wie die WHERE-Klausel Zeilen aus einer Ergebnistabelle aussortiert, sortiert die HAVING-Klausel Gruppen aus, und zwar auf Grundlage einer Suchbedingung (search-condition). Skalar-Ausdrücke in einer HAVING-Klausel dürfen pro Gruppe nur einen Wert enthalten.

Weitere Informationen siehe Scalar Expressions and Search Conditions.

Beispiel:

DEFINE DATA LOCAL 
1 #NAME     (A20) 
1 #AVGAGE   (I2) 
1 #NUMBER   (I2) 
END-DEFINE 
... 
SELECT NAME, AVG(AGE), COUNT(*)  
  INTO #NAME, #AVGAGE, #NUMBER 
  FROM SQL-PERSONNEL 
  GROUP BY NAME 
  HAVING COUNT(*) > 1 
  ...

ORDER BY-Klausel

ORDER BY

sort-key

ASC
DESC

,

INPUT SEQUENCE
ORDER OF table-designator

sort-key

column-name

integer
sort-key-expression

FETCH FIRST-Klausel

FETCH FIRST

1
integer

ROWS
ROW

ONLY

Beispiele für Tabellenausdrücke

Beispiel 1:

DEFINE DATA LOCAL
01 #NAME      (A20)
01 #FIRSTNAME (A15)
01 #AGE       (I2)
...
END-DEFINE
...
SELECT NAME, FIRSTNAME, AGE
  INTO #NAME, #FIRSTNAME, #AGE
  FROM SQL-PERSONNEL
    WHERE NAME IS NOT NULL
      AND AGE > 20
...
  DISPLAY #NAME #FIRSTNAME #AGE   
END-SELECT
...
END

Beispiel 2:

DEFINE DATA LOCAL
01 #COUNT    (I4)
...
END-DEFINE
...
SELECT SINGLE COUNT(*) INTO #COUNT FROM SQL-PERSONNEL   
...