## SELECT-Anweisung (select_statement)

Durch eine SELECT-Anweisung (select_statement) wird eine unbenannte Ergebnistabelle definiert und gleichzeitig erzeugt.

### Syntax

<select_statement> ::= <query_expression> [<order_clause>] [<limit_clause>]
[<update_clause>] [<lock_option>] [FOR REUSE]

<limit_clause> ::= LIMIT <row_count>
| LIMIT <offset>,<row_count>
<row_count> ::= <unsigned_integer>
| <parameter_name>
<offset> ::= <unsigned_integer>
| <parameter_name>

### Beispiele

SQL-Tutorial, Datenanfrage

### Erläuterung

Für die SELECT-Anweisung select_statement gelten die Regeln, die für die DECLARE CURSOR-Anweisung angegeben werden.

Je nach Suchstrategie wird die Suche nach allen Zeilen der Ergebnistabelle bei der Ausführung der SELECT-Anweisung durchgeführt und die Ergebnistabelle physisch erzeugt oder jeweils die nächste Zeile der Ergebnistabelle bei der Ausführung einer FETCH-Anweisung gesucht und nicht physisch gespeichert. Dies ist beim Zeitverhalten von FETCH-Anweisungen zu berücksichtigen.

#### Änderbare Ergebnistabelle

Eine Ergebnistabelle bzw. die ihr zugrundeliegenden Basistabellen sind änderbar, wenn die QUERY-Anweisung folgende Bedingungen erfüllt:

● Die QUERY-Anweisung besteht aus einer DECLARE CURSOR-Anweisung.

● Der QUERY-Ausdruck query_expression darf nur aus einer QUERY-Spezifikation query_spec bestehen.

● In der FROM-Klausel der QUERY-Spezifikation darf nur eine Basistabelle oder eine änderbare View-Tabelle angegeben worden sein.

● Es darf nicht das Schlüsselwort DISTINCT, eine GROUP- oder HAVING-Klausel angegeben werden.

● Ausdrücke dürfen keine Set-Funktion (set_function_spec) enthalten.

#### ORDER-Klausel

Die ORDER-Klausel order_clause spezifiziert eine Sortierreihenfolge für eine Ergebnistabelle.

#### LIMIT-Klausel

Die LIMIT-Klausel limit_clause können Sie verwenden, um die maximale Zeilenanzahl der Ergebnistabelle einzuschränken. Sie geben entweder nur die gewünschte maximale Zeilenanzahl an oder noch zusätzlich die Information, ab welcher Zeile die Ausgabe erfolgen soll (Offset-Wert). Der Offset der initialen Zeile ist 0. Ohne Angabe eines Offset werden die Zeilen ab Beginn der Ergebnistabelle ausgegeben.

Wenn Sie ein ROWNO-Prädikat oder ein TOP-Syntaxelement verwenden, dürfen Sie die LIMIT-Klausel nicht verwenden.

Wird eine LIMIT-Klausel und eine ORDER-Klausel angegeben, so werden alle Ergebniszeilen sortiert und dann die entsprechende Anzahl von Zeilen ausgegeben. Das Ergebnis unterscheidet sich im Normalfall von dem, das man erhalten hätte, wäre keine ORDER-Klausel angegeben gewesen.

#### UPDATE-Klausel

Die Angabe einer UPDATE-Klausel update_clause ist nur bei änderbaren Ergebnistabellen erlaubt. Bei änderbaren Ergebnistabellen entspricht ein Standpunkt in der Ergebnistabelle immer einem Standpunkt in den zugrundeliegenden Tabellen und damit letzlich einem Standpunkt in einer oder mehreren Basistabellen.

Wenn eine UPDATE-Klausel angegeben wurde, können die Basistabellen mit Hilfe des Standpunktes in der Ergebnistabelle (Angabe von CURRENT OF <result_table_name>) durch eine UPDATE-Anweisung oder eine DELETE-Anweisung geändert werden. Es kann mit Hilfe einer LOCK-Anweisung eine Sperre für die betroffene Zeile jeder betroffenen Basistabelle angefordert werden.

#### LOCK-Option

Die LOCK-Option lock_option bestimmt, welche Sperren auf die gelesenen Zeilen gesetzt werden.

#### FOR REUSE

Soll die Ergebnistabelle in einer nachfolgenden QUERY-Anweisung in der FROM-Klausel angegeben werden, so sollte diese Ergebnistabelle mit den Schlüsselwörtern FOR REUSE angegeben werden. Wenn FOR REUSE nicht angegeben ist, hängt die Wiederverwendbarkeit der Ergebnistabelle von systeminternen Strategien ab.

Da die Angabe von FOR REUSE die Antwortzeiten einiger QUERY-Anweisungen verschlechtert, sollte FOR REUSE nur angegeben werden, wenn es für die Wiederverwendbarkeit der Ergebnistabelle notwendig ist.