SELECT
selection
table-expression
|
Ein select-expression
gibt
eine Ergebnistabelle an. Es wird bei den folgenden Statements benutzt:
INSERT
|
SELECT
|
UPDATE
Dieses Dokument behandelt folgende Themen:
, | ||||||||
* |
selection
gibt an, welche
Spalten der Resultset-Tabellen (Ergebnismengen) ausgewählt werden sollen.
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 einfacher Spaltennamen kann
Beispiel: SELECT NAME, 65 - AGE FROM SQL-PERSONNEL ... |
AS |
Das optionale Schlüsselwort
AS leitet einen Korrelationsnamen (correlation-name )
für eine Spalte ein.
|
correlation-name |
Korrelationsname:
Es besteht die Möglichkeit, einem
Der
|
unpack-row |
Siehe unpack-row weiter unten. |
* |
Stern-Notation (*) :
Alle Spalten der Ergebnistabelle werden ausgewählt. Beispiel: SELECT * FROM SQL-PERSONNEL, SQL-AUTOMOBILES ... |
UNPACK
(scalar-expression)
.* AS ({field-name
data-type} ,
)
|
Mit unpack-row
geben Sie
eine Spalte nicht entpackter Binärwerte an, die zurückgegeben werden, wenn die
SQL UNPACK
-Funktion aufgerufen wird. Die Anzahl der Feldnamen
(field-names) und Datentypen
(data-types) muss mit der Anzahl der von der
SQL UNPACK
-Funktion zurückgegeben Felder übereinstimmen.
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 das Resultset (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
Zwischentabelle 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.
Die period-specification-Klausel gehört zum SQL Extended Set.
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 Zwischentabelle an, die das Ergebnis einer Verbundoperation (Join)
ist.
Bei der Verbundoperation 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 Zwischentabelle bilden, können ihrerseits Zwischentabellen einer
Verbundoperation 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
-Verbundoperationen:
search-condition |
Bei FULL OUTER
-Verbundoperationen:
full-join-expression =
full-join-expression [AND
]
|
column-name | |||||
|
(column-name
,
)
|
Innerhalb eines
join-expression
sind nur
column-names
und die
scalar-function
VALUE
(oder ihr Synonym
COALESCE
)
erlaubt.
Weitere Informationen siehe
column-name
.
Die
data-change-table-reference
-Klausel
gehört zum SQL Extended
Set
FINAL TABLE (INSERT-statement)
|
|||||
TABLE
(searched-UPDATE-statement)
|
|||||
OLD TABLE (searched-DELETE-statement)
|
|||||
FINAL TABLE (MERGE-statement)
|
Eine
data-change-table-reference
gibt eine
Zwischentabelle 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:
Die
xmltable-function
-Klausel gehört zum
SQL Extended Set
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 |
, |
Die GROUP BY
-Klausel gibt eine Gruppierung der
Ergebnistabelle an. Es ergibt sich eine Menge von Gruppen mit Zeilen. Innerhalb
einer Gruppe mit mehr als einer Zeile sind alle Werte, die die Gruppe
definieren, gleich.
Ein grouping-expression
ist ein scalar-expression
,
der die Gruppierung eines result-set
definiert.
GROUPING SETS |
( | , | ) | ||||||||
( | , | ) |
Ein grouping-set
wird
verwendet, um mehrere Gruppierungsklauseln in einem einzigen Statement
anzugeben. Ein grouping-set
kombiniert
zwei oder mehr Zeilengruppen zu einem einzigen Resultset (Ergebnismenge). Es
ist das gleiche wie eine UNION
-Verkettung mehrerer
select-expressions
mit einer
GROUP BY
-Klausel, wobei jeder Ausdruck einem
grouping-set
entspricht. Ein
grouping-set
ist ein einzelnes Element
oder eine Liste mit Elementen, die durch Klammern voneinander abgegrenzt sind.
Ein Element ist entweder ein
grouping–expression
oder eine
super-group
. Ein
grouping-set
hat den Vorteil, dass die
Gruppen in einem einzigen Durchgang über die Basistabelle berechnet werden.
(grouping-expression-list)
|
|||
(
) |
Eine super-group
ist
eine komplexerer grouping-set
.
Eine
grouping-expression-list
definiert die
Anzahl der Elemente, die in einer ROLLUP
- oder
CUBE
-Operation verwendet werden. Elemente mit mehreren
grouping-expressions
werden durch
Klammern voneinander abgegerenzt.
grouping-expression | , | ||
(grouping-expression, ) |
Gesamtresultat "grand
total" ( )
:
ROLLUP
und CUBE
liefern eine Zeile,
die die Gesamtaggregation (Gesamtresultat) ist. Dies kann durch leere Klammern
( )
in der GROUPING SETS
-Klausel angegeben
werden.
- ROLLUP
Eine
ROLLUP
-Gruppierung ist wie eine Reihe vongrouping-sets
. Zusätzlich zu den regulären gruppierten Zeilen erzeugt eineROLLUP
-Gruppierung einen Resultset (Ergebnismenge), die Zwischensummenzeilen enthält. Zwischensummenzeilen sind "super-aggregierte" Zeilen, die zusätzliche Gesamtsummen enthalten. Die aggregierten Werte werden mit denselben Spaltenfunktionen abgerufen, die zum Abrufen der regulären gruppierten Zeilen verwendet werden.Allgemein geben Sie eine
ROLLUP
-Gruppierung mitn
Elementen wie folgt an:GROUP BY ROLLUP (c1, c2, ..., cn-1, cn)Was folgender Angabe entspricht:
GROUP BY GROUPING SETS ((c1, c2, ..., cn-1, cn), (c1, c2, ..., cn-1), ... (c1, c2), (c1), ( ))- CUBE
Eine
CUBE
-Gruppierung ist wie eine Reihe vongrouping-sets
. Zusätzlich zu denROLLUP
-Aggregationszeilen erzeugtCUBE
einen Resultset (Ergebnismenge), die Kreuztabellierungszeilen enthält. Kreuztabellierungszeilen sind zusätzliche "super-aggregierte" Zeilen. Diegrouping-expression-list
einesCUBE
berechnet zusammen mit dem Gesamtresultat "grand total" alle Permutationen. Als Ergebnis werden dien
Elemente einesCUBE
in 2**ngrouping-sets
umgesetzt. Zum Beispiel:GROUP BY CUBE (a, b, c)Was folgender Angabe entspricht:
GROUP BY GROUPING SETS ((a, b, c), (a, b), (a, c), (b, c), (a), (b), (c), ())
[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 |
Die order-by
-Klausel gibt
die Reihenfolge für die Ergebnistabellenzeilen an.
column-name | ||
integer | ||
sort-key-expression |
Ein sort-key-expression
ist ein expression
, der nicht einfach
ein column-name
oder eine
vorzeichenlose ganzzahlige constant
ist.
INPUT SEQUENCE
gehört zum
SQL Extended Set.
INPUT SEQUENCE
gibt an, dass die Ergebnistabelle die
Eingabereihenfolge der Zeilen widerspiegelt, die in der
VALUE
-Klausel eines INSERT
-Statements angegeben sind.
INPUT SEQUENCE
kann nur angegeben werden, wenn in der
from-clause
ein
INSERT
-Statement angegeben ist.
ORDER OF
table-designator
gehört zum
SQL Extended Set.
ORDER OF
table-designator
gibt an, dass die
Sortierfolge der bezeichneten Tabelle nach der Tabellenkennung
(table-designator
) auf die
Ergebnistabelle der Abfrage angewendet werden soll. Der
table-designator
identifiziert eine
Basistabelle, eine Datensicht (view) oder einen geschachtelten Tabellenausdruck
(table-expression
) einer
Untervorauswahl (subselect
)
eindeutig.
Die fetch-first
-Klausel
gehört zum SQL Extended
Set.
FETCH FIRST
|
1 integer |
ROWS ROW |
ONLY
|
Die fetch-first
-Klausel
begrenzt die Anzahl der Zeilen, die abgerufen werden können. Sie verbessert die
Performance von Abfragen, wenn nur eine begrenzte Anzahl an Zeilen benöigt
wird.
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 ...