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:
|
|
|
|
|
|
,
|
|
||
* |
||||||||
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 Die Alternative zu |
scalar-expression |
Skalar-Ausdruck:
Anstelle eines einfachen Spaltennamen können Sie auch
allgemeine 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
Der
|
* |
Stern-Notation (*) :
Alle Spalten aller in der Beispiel: SELECT * FROM SQL-PERSONNEL, SQL-AUTOMOBILES ... |
| 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
table-reference,…
|
Diese Klausel gibt an, von welchen Tabellen die Ergebnismenge erstellt werden soll.
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.
Die TABLE
function-name-Klausel gehört zum
SQL Extended Set und
erfordert eine
correlation-clause
mit einer column-name-Liste.
FOR
|
|
|
|
|
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:
Optional kann eine
correlation-clause zu einem
table-name zugeordnet werden. Bei einer
subquery muss eine
correlation-clause zugeordnet
werden.
[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.
|
|
table-reference |
|
|
|
|
|
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.
Bei INNER-, LEFT OUTER- und
RIGHT OUTER-Zusammenfügungen:
search-condition |
Bei FULL OUTER-Zusammenfügungen:
full-join-expression =
full-join-expression [AND
|
|
|
column-name |
|
|||
|
|
|
|
(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.
|
|
FINAL TABLE (INSERT-statement)
|
|
|||
|
|
|
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:
Eine xmltable-function
gibt den Aufruf der eingebauten XMLTABLE-Funktion an.
[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
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
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
|
|
sort-key |
|
|
|
, |
|
INPUT SEQUENCE |
|||||||
ORDER OF
table-designator |
|||||||
|
|
column-name |
|
| integer | ||
| sort-key-expression |
|
|
FETCH FIRST
|
|
1integer |
|
|
ROWSROW |
|
ONLY
|
|
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 ...