SELECT
selection table-expression
|
Ein select-expression gibt eine Ergebnistabelle an.
Es wird bei den folgenden Statements benutzt: INSERT | SELECT | UPDATE
Dieser Abschnitt 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 abgegrenzt.
|
|
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 mitnElementen 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 erzeugtCUBEeinen Resultset (Ergebnismenge), die Kreuztabellierungszeilen enthält. Kreuztabellierungszeilen sind zusätzliche "super-aggregierte" Zeilen. Diegrouping-expression-listeinesCUBEberechnet zusammen mit dem Gesamtresultat "grand total" alle Permutationen. Als Ergebnis werden dienElemente einesCUBEin 2**ngrouping-setsumgesetzt. 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 und 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
|
|
|
|
|
|
|
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ötigt 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 ...