Ruft Informationen aus der Datenbank ab.
[ WITH Temporäre_Ansichten ] SELECT [ ALL | DISTINCT ] [ Zeilenbeschränkungsoption_1 ] Auswahlliste [ INTO { Hostvariablenliste | Variablenliste | Tabellenname } ] [ INTO LOCAL TEMPORARY TABLE { Tabellenname } ] [ FROM FROM-Ausdruck ] [ WHERE Suchbedingung ] [ GROUP BY GROUP-BY-Ausdruck ] [ HAVING Suchbedingung ] [ WINDOW Fensterausdruck ] [ ORDER BY { Ausdruck | Ganzzahl } [ ASC | DESC ], ... ] [ FOR READ ONLY | FOR_UPDATE-Klausel ] [ FOR XML XML-Modus ] [ Zeilenbeschränkungsoption_2 ] [ OPTION( Abfragen-Hint, ... ) ]
Temporäre_Ansichten :
Reguläre_Ansicht, ...
| RECURSIVE { Reguläre_Ansicht | Rekursive_Ansicht }, ...
Reguläre_Ansicht : Ansichtsname [ ( Spaltenname, ... ) ] AS ( Unterabfrage )
Rekursive_Ansicht : Ansichtsname ( Spaltenname, ... ) AS ( Anfangsunterabfrage UNION ALL Rekursive_Unterabfrage )
Zeilenbeschränkungsoption_1 : FIRST | TOP n [ START AT m ]
Zeilenbeschränkungsoption_2 : LIMIT { [ Offset , ] Zeilenanzahl | ZeilenanzahlOFFSETOffset } Offset : Ganzzahl_oder_Variable Zeilenanzahl : Ganzzahl_oder_Variable
Auswahlliste : Ausdruck [ [ AS ] Aliasname ], ... | * | Fensterfunktion OVER { Fenstername | Fensterspezifikation } [ [ AS ] Aliasname ] | Sequenzausdruck
Sequenzausdruck Sequenzname [ CURRVAL | NEXTVAL ] FROM Tabellenname
Sequenzausdruck: Siehe Ausdrücke.
from-Ausdruck: Siehe FROM-Klausel.
group-by-Ausdruck: Siehe GROUP BY-Klausel.
Suchbedingung: Siehe Suchbedingungen.
Fenstername : Bezeichner
Fensterausdruck: Siehe WINDOW-Klausel.
Fensterspezifikation: Siehe WINDOW-Klausel.
Fensterfunktion : RANK( ) | DENSE_RANK( ) | PERCENT_RANK( ) | CUME_DIST( ) | ROW_NUMBER( ) | Aggregatfunktion
FOR_UPDATE-Klausel FOR UPDATE | FOR UPDATE Cursorparallelität | FOR UPDATE OF [ ( Spaltenname, ... ) ]
Cursorparallelität : BY { VALUES | TIMESTAMP | LOCK }
XML-Modus : RAW [ , ELEMENTS ] | AUTO [ , ELEMENTS ] | EXPLICIT
Abfragen-Hint : MATERIALIZED VIEW OPTIMIZATION Optionswert | FORCE OPTIMIZATION | FORCE NO OPTIMIZATION | Optionsname = Optionswert
Optionsname : Bezeichner
Optionswert : Hostvariable (Bezeichner zulässig), Zeichenfolge, Bezeichner oder Zahl
WITH- oder WITH RECURSIVE-Klausel Definition von einem oder mehreren gemeinsamen Tabellenausdrücken, auch als temporäre Ansichten bekannt, die im Rest der Anweisung verwendet werden können. Diese Ausdrücke können nicht-rekursiv oder selbstrekursiv sein. Rekursive gemeinsame Tabellenausdrücke können allein oder mit nicht-rekursiven Ausdrücken gemischt erscheinen, wenn das Schlüsselwort RECURSIVE angegeben wird. Gegenseitig rekursive gemeinsame Tabellenausdrücke werden nicht unterstützt.
Diese Klausel ist nur gestattet, wenn die SELECT-Anweisung an einer der folgenden Positionen erscheint:
In einer SELECT-Anweisung auf der obersten Ebene
In einer SELECT-Anweisung auf der obersten Ebene einer VIEW-Definition
In einer SELECT-Anweisung auf der obersten Ebene in einer INSERT-Anweisung
Rekursive Ausdrücke bestehen aus einer ersten Unterabfrage und einer rekursiven Unterabfrage. Die erste Abfrage definiert implizit das Schema der Ansicht. Die rekursive Unterabfrage muss eine Referenz auf die Ansicht in der FROM-Klausel enthalten. Während jeder Wiederholung bezieht sich diese Referenz nur auf die in der vorherigen Iteration in die Ansicht eingefügten Zeilen. Die Referenz darf nicht auf der Nullwert-liefernden Seite eines Outer-Join erscheinen. Ein rekursiver gemeinsamer Tabellenausdruck darf keine Aggregatfunktionen verwenden und darf keine GROUP BY-, ORDER BY- oder DISTINCT-Klausel enthalten. Siehe Allgemeine Tabellenausdrücke.
Die WITH-Klausel wird bei entfernten Tabellen nicht unterstützt.
ALL- oder DISTINCT-Klausel ALL (der Standardwert) gibt alle Zeilen zurück, welche die Klauseln der SELECT-Anweisung erfüllen. Wenn DISTINCT angegeben ist, werden mehrfach vorhandene Zeilen entfernt. Da die Ausführung vieler Anweisungen bedeutend länger dauert, wenn DISTINCT angegeben ist, sollten Sie DISTINCT nur dann verwenden, wenn es unbedingt notwendig ist.
Zeilenbeschränkungsklauseln Die Zeilenbeschränkungsklauseln ermöglichen es Ihnen, eine Teilmenge der Zeilen zurückzugeben, die von der WHERE-Klausel erfasst werden. Es kann nur eine Zeilenbeschränkungsklausel gleichzeitig angegeben werden. Wenn diese Klauseln angegeben werden, wird normalerweise auch eine ORDER BY-Klausel angegeben, um die Zeilen sinnvoll zu ordnen. Siehe Die Anzahl der Zeilen, die von einer Abfrage zurückgegeben werden, explizit beschränken.
Zeilenbeschränkungsoption_1 Die TOP- und START AT-Werte können eine Hostvariable, eine Ganzzahlkonstante oder eine Ganzzahlvariable sein. Der TOP-Wert muss mindestens 0 sein. Der START AT-Wert muss größer als 0 sein.
Zeilenbeschränkungsoption_2 Die LIMIT- und OFFSET-Werte können eine Hostvariable, eine Ganzzahlkonstante oder eine Ganzzahlvariable sein. Der LIMIT-Wert muss mindestens 0 sein. Der OFFSET-Wert muss mindestens 0 sein.
Das LIMIT-Schlüsselwort ist standardmäßig deaktiviert. Verwenden Sie die reserved_keywords-Option, um das LIMIT Schlüsselwort zu aktivieren. Siehe reserved_keywords-Option.
Auswahllistenklausel Die Auswahlliste ist eine Liste von Ausdrücken, die durch Kommata getrennt werden und angeben, was aus der Datenbank abgerufen wird. Ein Stern (*) bedeutet, dass sämtliche Spalten aller Tabellen in der FROM-Klausel ausgewählt werden.
Aggregatfunktionen sind in der Auswahlliste zulässig. Unterabfragen sind in der Auswahlliste ebenfalls zulässig. Jede Unterabfrage muss in Klammern gesetzt werden.
Aliasnamen können in der Abfrage verwendet werden, um den Ausdruck mit einem Alias darzustellen.
Aliasnamen werden auch von Interactive SQL ganz oben in jeder Spalte angezeigt, die von der SELECT-Anweisung ausgegeben wurde. Wenn der optionale Aliasname nach einem Ausdruck nicht angegeben wird, zeigt Interactive SQL den Ausdruck an.
INTO-Klausel Nachstehend werden drei Verwendungsmöglichkeiten für die INTO-Klausel angeführt:
INTO Hostvariablenliste-Klausel Diese Klausel wird nur in Embedded SQL verwendet. Sie gibt an, wo die Ergebnisse der SELECT-Anweisung abgelegt werden. Für jedes Element in der Auswahlliste muss ein Hostvariablenelement vorhanden sein. Die Elemente der Auswahlliste werden in die Hostvariablen einsortiert. Mit jeder Hostvariablen ist außerdem eine Indikator-Hostvariable zulässig, sodass das Programm erfährt, ob die Elemente in der Auswahlliste NULL waren.
Wenn die Abfrage dazu führt, dass keine Zeilen ausgewählt werden, können die Variablen nicht aktualisiert werden und die Warnung "Zeile nicht gefunden" wird angezeigt.
INTO Variablenliste-Klausel Diese Klausel wird nur in Prozeduren und Triggern verwendet. Sie gibt an, wo die Ergebnisse der SELECT-Anweisung abgelegt werden. Für jedes Element in der Auswahlliste muss eine Variable vorhanden sein. Die Elemente in der Auswahlliste werden in die Variablen einsortiert.
INTO Tabellenname-Klausel Diese Klausel wird zur Erstellung von Tabellen und zum Füllen der Tabellen mit Daten verwendet.
Um permanente Tabellen zu erstellen, muss die Abfrage eine der folgenden Bedingungen erfüllen:
Die Auswahlliste enthält mehr als ein Element und das Ziel INTO ist ein einziger Tabellennamen-Bezeichner.
Die Auswahlliste enthält ein * und das Ziel INTO ist als Eigentümer.Tabelle angegeben.
Um eine permanente Tabelle mit einer Spalte zu erstellen, muss der Tabellenname als Eigentümer.Tabelle angegeben sein.
Diese Anweisung verursacht vor der Ausführung ein COMMIT. Dies ist eine Nebenwirkung bei der Erstellung der Tabelle. Zur Ausführung der Anweisung ist eine RESOURCE-Datenbankberechtigung erforderlich. Für die neue Tabelle werden keine Berechtigungen erteilt: Die Anweisung ist eine kurze Form von CREATE TABLE, gefolgt von INSERT ... SELECT.
Tabellen, die mit dieser Klausel erstellt werden, haben keinen definierten Primärschlüssel. Sie können mithilfe von ALTER TABLE einen Primärschlüssel hinzufügen. Ein Primärschlüssel sollte hinzugefügt werden, bevor Vorgänge wie UPDATE oder DELETE auf die Tabelle angewendet werden. Andernfalls werden für alle Spaltenwerte die betroffenen Zeilen in einem Transaktionslog protokolliert.
INTO LOCAL TEMPORARY TABLE Diese Klausel wird benutzt, um eine lokale temporäre Tabelle zu erstellen und mit den Ergebnissen der Abfrage zu füllen. Wenn Sie diese Klausel verwenden, muss der temporäre Tabellenname nicht mit # beginnen.
FROM-Klausel Zeilen werden aus den in Tabellenausdruck angegebenen Tabellen und Ansichten abgerufen. Eine SELECT-Anweisung ohne FROM-Klausel kann verwendet werden, um die Werte von Ausdrücken anzuzeigen, die nicht von Tabellen abgeleitet werden. Diese zwei Anweisungen z.B. sind äquivalent und zeigen den Wert der globalen Variablen @@version an.
SELECT @@version; SELECT @@version FROM DUMMY; |
Siehe FROM-Klausel.
WHERE-Klausel Diese Klausel gibt an, welche Zeilen aus den benannten Tabellen in der FROM-Klausel ausgewählt werden. Sie kann benutzt werden, um Joins zwischen mehreren Tabellen einzurichten, als Alternative zur ON-Phrase (Teil der FROM-Klausel). Siehe Suchbedingungen und FROM-Klausel.
GROUP BY-Klausel Sie können nach Spalten, Aliasnamen oder Funktionen gruppieren. Das Ergebnis der Abfrage enthält eine Zeile für jede unterschiedliche Menge von Werten in den benannten Spalten, Aliasen oder Funktionen. Wie auch die DISTINCT und die Mengenoperationen UNION, INTERSECT und EXCEPT behandelt die GROUP BY-Klausel NULL auf dieselbe Weise wie die anderen Werte in den jeweiligen Domänen. Das bedeutet, dass mehrere NULL-Werte in einem Gruppierungsattribut eine einzige Gruppe bilden. Aggregatfunktionen können dann für diese Gruppen angewendet werden, um sinnvolle Ergebnisse zu erhalten.
Wenn GROUP BY verwendet wird, können die Auswahlliste, HAVING-Klausel und ORDER BY-Klausel nur die Bezeichner referenzieren, die in der GROUP BY-Klausel aufgeführt werden. Die Ausnahme ist, dass die Auswahlliste und die HAVING-Klausel Aggregatfunktionen enthalten können.
Siehe GROUP BY-Klausel.
HAVING-Klausel Diese Klausel wählt die Zeile auf der Grundlage der Gruppenwerte und nicht der einzelnen Zeilenwerte aus. Die HAVING-Klausel kann nur verwendet werden, wenn entweder die Anweisung eine GROUP BY-Klausel umfasst oder die Auswahlliste nur aus Aggregatfunktionen besteht. Sämtliche Spaltennamen, die in der HAVING-Klausel referenziert werden, müssen entweder in der GROUP BY-Klausel enthalten sein oder in der HAVING-Klausel als Parameter für eine Aggregatfunktion verwendet werden.
WINDOW-Klausel Diese Klausel bestimmt das ganze Fenster oder einen Fensterabschnitt für die Verwendung mit Fensterfunktionen wie AVG und RANK Siehe WINDOW-Klausel.
ORDER BY-Klausel Diese Klausel sortiert die Ergebnisse einer Abfrage. Jedes Element in der ORDER BY-Liste kann als ASC für aufsteigende Sortierfolge (der Standardwert) oder DESC für absteigende Sortierfolge benannt werden. Wenn der Ausdruck eine Ganzzahl n ist, dann werden die Abfrageergebnisse nach dem n-ten Element in der Auswahlliste sortiert.
Die einzige Möglichkeit, sicherzustellen, dass Zeilen in einer bestimmten Reihenfolge zurückgegeben werden, ist die Verwendung von ORDER BY. Ohne die Klausel ORDER BY gibt SQL Anywhere die Zeilen in der jeweils effizientesten Reihenfolge zurück. Das bedeutet, dass das Erscheinungsbild der Ergebnismengen abhängig davon variieren kann, wann Sie zuletzt auf die Zeile und andere Faktoren zugegriffen haben.
In Embedded SQL wird die SELECT-Anweisung dafür verwendet, Ergebnisse aus der Datenbank abzurufen und die Werte über die INTO-Klausel in Hostvariablen abzulegen. Die SELECT-Anweisung darf nur eine Zeile zurückgeben. Für Abfragen mehrerer Zeilen müssen Sie Cursor verwenden.
FOR UPDATE- oder FOR READ ONLY-Klausel Diese Klauseln geben an, ob Aktualisierungen über einen von der Abfrage aus geöffneten Cursor zulässig sind und, falls dem so ist, welche Parallelitätssemantik verwendet werden kann. Diese Klausel kann nicht mit der FOR XML-Klausel verwendet werden.
Wenn Sie in der SELECT-Anweisung keine FOR-Klausel verwenden, hängt die Aktualisierbarkeit eines Cursors von der Deklaration des Cursors ab sowie von der Angabe der Cursorparallelität durch die API. In ODBC, JDBC, OLE DB, ADO.NET und Embedded SQL sind die Anweisungen explizit aktualisierbar und es wird ein schreibgeschützter Cursor verwendet, es sei denn, die Anwendung setzt dies außer Kraft. In Open Client und innerhalb von gespeicherten Prozeduren muss die Aktualisierbarkeit eines Cursor nicht angegeben werden, und der Standardwert ist FOR UPDATE.
Bei Open Client und gespeicherten Prozeduren hängt die Aktualisierbarkeit von Cursor und Anweisungen von der Einstellung der Datenbankoption ansi_update_constraints und den spezifischen Merkmalen der Anweisung ab, z.B. davon, ob die Anweisung ORDER BY, DISTINCT, GROUP BY, HAVING, UNION, Aggregatfunktionen, Joins oder nicht aktualisierbare Ansichten enthält. Cursor gelten standardmäßig als FOR UPDATE bei Einzeltabellenabfragen ohne ORDER BY-Klausel bzw. wenn die Option ansi_update_constraints auf OFF gesetzt ist. Wenn die Option ansi_update_constraints auf "Cursors" oder "Strict" gesetzt ist, gelten Cursor über einer Abfrage, die eine ORDER BY-Klausel enthält, standardmäßig als READ ONLY. Sie können jedoch Cursor explizit als aktualisierbar markieren, indem Sie die FOR UPDATE-Klausel verwenden. Da es kostenträchtig ist, Aktualisierungen über Cursor mit einer ORDER BY-Klausel oder einem Join zuzulassen, sind Cursor über eine Abfrage, die einen Join von zwei oder mehr Tabellen enthält, READ ONLY und können nicht aktualisierbar gemacht werden, es sei denn, die Datenbankoption ansi_update_constraints ist auf OFF gesetzt.
Ein als FOR READ ONLY deklarierter Cursor kann nicht in (positionsbasierten) UPDATE- und DELETE- sowie in PUT-Anweisungen verwendet werden. FOR READ ONLY ist die Standardeinstellung für Embedded SQL.
Die FOR UPDATE-Klausel macht einen Cursor explizit aktualisierbar. Die Verwendung von FOR UPDATE hat alleine keine Auswirkungen auf die Parallelitätssteuerung für die Zeilen in der Ergebnismenge der Anweisung. Für diesen Zweck müssen Sie entweder FOR UPDATE BY LOCK oder FOR UPDATE BY [ VALUES | TIMESTAMP ] angeben.
FOR UPDATE BY LOCK-Klausel Der Datenbankserver erwirbt Absichtszeilensperren für abgerufene Zeilen der Ergebnismenge. Dies sind langfristige Sperren, die gehalten werden, bis die Transaktion festgeschrieben oder zurückgesetzt wird.
FOR UPDATE BY { VALUES | TIMESTAMP } Wenn Sie FOR UPDATE BY TIMESTAMP oder FOR UPDATE BY VALUES angeben, verwendet der Datenbankserver eine optimistische Parallelität, indem ein durch Keyset gesteuerter (wertsensitiver) Cursor eingesetzt wird. In diesem Fall können verlorene Aktualisierungen auftreten, wenn die Anwendung eine Zeile außerhalb des Cursors ändert (mit einer separaten Anweisung) oder wenn die Anwendung die vom Server generierten Warnungen und/oder Fehler nicht beachtet, die darauf hinweist, dass die Zeile von einer anderen Verbindung geändert wurde.
Um zu gewährleisten, dass eine Anweisung eine Absichtssperre erhält, führen Sie einen der folgenden Schritte durch:
Geben Sie FOR UPDATE BY LOCK in der Abfrage an
Geben Sie HOLDLOCK, WITH ( HOLDLOCK ), WITH ( UPDLOCK ) oder WITH ( XLOCK ) in der FROM-Klausel der Abfrage an
Öffnen Sie den Cursor mit API-Aufrufen, geben Sie CONCUR_LOCK an
Die Zeilen mit Attributen abrufen, die einen Abruf zum Aktualisieren angeben
Die FOR UPDATE OF-Klausel benennt explizit die Spalten, die mit einer (positionsbasierten) UPDATE- oder DELETE oder einer PUT-Anweisung geändert werden können. Sie können diese Klausel nicht in Kombination mit anderen FOR UPDATE-, FOR READ ONLY-, oder FOR XML-Klauseln verwenden.
FOR UPDATE OF-Spaltenlistenklausel Wenn Sie die FOR UPDATE OF-Klausel angeben, beschränkt der Datenbankserver die Spalten, die mit einer positionsbasierten UPDATE- oder DELETE-Anweisung geändert werden können, auf die in dieser Klausel explizit benannten Spalten. Der Versuch, eine andere Spalte zu ändern, führt zu der Fehlermeldung "Spalte nicht gefunden". Es wird nicht geprüft, ob eine in der Liste referenzierte Spalte tatsächlich vorhanden ist oder ob die Tabelle der Spalte eine aktualisierbare Tabelle ist.
Weitere Hinweise zur Cursorempfindlichkeit finden Sie unter SQL Anywhere-Cursor.
Weitere Hinweise zur ODBC-Parallelität finden Sie in der Erläuterung von SQLSetStmtAttr unter ODBC-Cursormerkmale wählen.
Weitere Hinweise zur Datenbankoption ansi_update_constraints finden Sie unter ansi_update_constraints-Option.
Weitere Hinweise zur Cursor-Aktualisierbarkeit finden Sie unter Aktualisierbare Anweisungen.
FOR XML-Klausel Diese Klausel legt fest, dass die Ergebnismenge als XML-Dokument zurückgegeben werden muss. Das XML-Format hängt von dem angegebenen Modus ab. Diese Klausel kann nicht mit der FOR UPDATE oder FOR READ ONLY-Klausel verwendet werden. Mit FOR XML deklarierte Cursor sind implizit READ ONLY.
Wenn Sie den RAW-Modus festlegen, wird jede Zeile in der Ergebnismenge als XML <row>-Element dargestellt, und jede Spalte als Attribut des <row>-Elements.
AUTO-Modus gibt die Abfrageergebnisse als verschachtelte XML-Elemente zurück. Jede in der Auswahlliste referenzierte Tabelle wird als Element in XML angegeben. Die Reihenfolge der Verschachtelung der Elemente basiert auf der Reihenfolge, in der Tabellen in der Auswahlliste referenziert werden.
Der EXPLICIT-Modus ermöglicht es Ihnen, die Form des generierten XML-Dokuments zu steuern. Mit dem EXPLICIT-Modus haben Sie mehr Flexibilität bei der Benennung der Elemente und Angabe der Verschachtelungsstruktur als bei RAW oder AUTO. Siehe FOR XML EXPLICIT verwenden.
Weitere Hinweise zur Verwendung der FOR XML-Klausel finden Sie unter Mit der FOR XML-Klausel Abfrageergebnisse als XML abrufen und .
OPTION-Klausel Diese Klausel liefert Hints, wie die Abfrage verarbeitet werden soll. Die folgenden Abfrage-Hints werden unterstützt:
MATERIALIZED VIEW OPTIMIZATION-Klausel Verwenden Sie die MATERIALIZED VIEW OPTIMIZATION-Klausel, um anzugeben, wie der Optimierer bei der Verarbeitung einer Abfrage materialisierte Ansichten einsetzen soll. Der angegebene Optionswert setzt die Datenbankoption materialized_view_optimization nur bei dieser Abfrage außer Kraft. Mögliche Werte für Optionswert sind dieselben wie für die Datenbankoption materialized_view_optimization. Siehe materialized_view_optimization-Option.
FORCE OPTIMIZATION-Klausel Wenn eine Abfragespezifikation nur einfache Abfragen enthält (Einzelblock- und Einzeltabellenabfragen mit Gleichheitsbedingungen in der WHERE-Klausel, die eine bestimmte Zeile eindeutig identifizieren), umgeht sie während der Verarbeitung üblicherweise die kostenbasierte Optimierung. Es kann aber sein, dass Sie eine kostenbasierte Optimierung wünschen. Wenn Sie z.B. materialisierte Ansichten in die Abfragenverarbeitung einbeziehen möchten, muss es eine Ansichtenübereinstimmung geben. Eine Ansichtenübereinstimmung findet jedoch nur während einer kostenbasierten Optimierung statt. Wenn Sie wollen, dass eine kostenbasierte Optimierung bei einer Abfrage durchgeführt wird, aber die Abfragespezifikation nur einfache Abfragen enthält, geben Sie die FORCE OPTIMIZATION-Option an, um zu gewährleisten, dass der Optimierer eine kostenbasierte Optimierung bei der Abfrage durchführt.
Auf ähnliche Weise erzwingt die Angabe der FORCE OPTIMIZATION-Option in einer SELECT-Anweisung innerhalb einer Prozedur die Verwendung des Optimierers bei jedem Aufruf der Prozedur. In diesem Fall werden Pläne für die Anweisung nicht im Cache gespeichert.
Weitere Hinweise zu einfachen Abfragen und zur Ansichtenübereinstimmung finden Sie unter Phasen der Abfrageverarbeitung und Eignung für ein Überspringen der Abfrageverarbeitungsphase.
FORCE NO OPTIMIZATION-Klausel Geben Sie die FORCE NO OPTIMIZATION-Klausel an, wenn Sie möchten, dass die Anweisung den Optimierer umgeht. Wenn die Anweisung für eine Verarbeitung auf diese Weise zu komplex ist - möglicherweise aufgrund der festgelegten Datenbankoptionen oder von Eigenschaften des Schemas bzw. der Abfrage -, schlägt die Anweisung fehl und der Datenbankserver gibt einen Fehler zurück. Weitere Hinweise zu Anweisungen, die den Optimierer umgehen können, finden Sie unter Eignung für ein Überspringen der Abfrageverarbeitungsphase.
Optionsname = Optionswert Legen Sie eine Optionseinstellung fest. Die von Ihnen angegebene Einstellung gilt nur für die aktuelle Anweisung und hat Vorrang vor allen öffentlichen und temporären Optionseinstellungen, einschließlich durch ODBC-fähige Anwendungen festgelegter Einstellungen. Die unterstützten Optionen sind folgende:
Wenn Sie die isolation_level-Option in einer Abfrage angeben, hat der in der Abfrage angegebene Wert Vorrang vor allen anderen Einstellungen für die Isolationsstufe der aktuellen Abfrage (z.B. dem Setzen der isolation_level-Option für die Datenbank oder der Einstellung für den Cursor).
Sequenzausdruck Sie können den aktuellen Wert (CURRVAL) oder den nächsten Wert (NEXTVAL) aus einem Sequenzgenerator wählen. Siehe Eine Sequenz zum Generieren eindeutiger Werte verwenden.
Die SELECT-Anweisung kann wie folgt verwendet werden:
Zum Abrufen von Ergebnissen aus der Datenbank.
In Interactive SQL, um Daten in einer Datenbank zu durchsuchen oder um Daten aus einer Datenbank in eine externe Datei zu exportieren.
In Prozeduren und Triggern oder in Embedded SQL. Eine SELECT-Anweisung mit einer INTO-Klausel wird für das Abrufen von Ergebnissen aus der Datenbank verwendet, wenn die SELECT-Anweisung nur eine Zeile zurückgibt. Für Abfragen mehrerer Zeilen müssen Sie Cursor verwenden.
Zum Zurückgeben einer Ergebnismenge aus einer Prozedur.
SELECT-Berechtigung für die benannten Tabellen und Ansichten ist erforderlich.
Um den CURRVAL- oder NEXTVAL-Wert aus einem Sequenzgenerator auswählen zu können, müssen Sie DBA-Berechtigung haben, der Eigentümer der Sequenz sein oder Ihnen muss die Berechtigung zur Verwendung des Sequenzgenerators erteilt worden sein.
Keine.
SQL/2008 Kernfunktion. Wegen der Komplexität der SELECT-Anweisung sollten Sie individuelle Klauseln auf den Standard abprüfen. Zum Beispiel ist das ROLLUP-Schlüsselwort, das in einer GROUP BY-Klausel angegeben werden kann, Teil der optionalen SQL/2008-Sprachenfunktion T431. Zu den optionalen SQL/2008-Sprachenfunktionen, die von SQL Anywhere unterstützt werden, gehören folgende:
Die WINDOW-Klausel und die WINDOW-Aggregatfunktionen umfassen die optionalen SQL/2008-Sprachenfunktionen T611 und T612. Siehe WINDOW-Klausel.
Sequenzausdrücke sind Teil der Funktion T176.
Allgemeine Tabellenausdrücke sind die optionale SQL/2008-Sprachenfunktion T121. Ein in einer verschachtelten Abfrage enthaltener gemeinsamer Tabellenausdruck ist Funktion T122. WITH RECURSIVE ist die optionale SQL/2008-Sprachenfunktion 131, bei Einbindung in eine verschachtelte Abfrage Funktion T132.
Die Möglichkeit zum Angeben einer ORDER BY-Klausel mit einem Abfrageausdruck, der UNION, EXCEPT oder INTERSECT erfordert, ist die optionale Funktion F850. Die Möglichkeit zum Angeben von ORDER BY in einer Unterabfrage ist Funktion F851.
Im SQL-Standard sind FOR UPDATE und FOR READ ONLY Teil einer Cursordeklaration. Siehe DECLARE CURSOR-Anweisung [ESQL] [SP].
SQL Anywhere bietet Unterstützung für viele Erweiterungen für die SQL/2008-Definition der Anweisung SELECT. Dazu gehören folgende:
Die optionale Klausel für die Cursorparallelität (FOR UPDATE BY { LOCK | VALUES | TIMESTAMP}) ist eine Erweiterung des Herstellers.
Die Klauseln FOR XML, OPTION und die INTO sind Erweiterungen des Herstellers.
Die Zeilenbeschränkungsklausel ist eine Erweiterung des Herstellers. Im SQL/2008-Standard wird die Zeileneinschränkung mithilfe der FETCH FIRST-Syntax unterstützt, bei der es sich um die optionale Sprachenfunktion F856 handelt. Die Syntax für die Funktion F856 wird nicht von SQL Anywhere unterstützt.
Die Möglichkeit zum Angeben von ORDER BY n ist eine Erweiterung des Herstellers.
In SQL/2008 sind alle Cursor mit Ausnahme von INSENSITIVE-Cursor standardmäßig aktualisierbar. Die schreibgeschützte Standard bei Embedded SQL-Programmen ist eine Erweiterung des Herstellers.
Transact-SQL Bei der Unterstützung für die SELECT-Anweisung gibt es erhebliche Unterschiede zwischen SQL Anywhere und Adaptive Server Enterprise. Einige Funktionen der SELECT-Anweisung werden von Adaptive Server Enterprise nicht unterstützt (siehe Kompatible Abfragen schreiben). Zu diesen Unterschieden gehören folgende:
Sybase ASE unterstützt nicht die Cursorparallelitätsklausel von SQL Anywhere. Um eine Sperre auf eine abgerufene Zeile zu setzen, müssen Sie den Tabellen-Hint HOLDLOCK verwenden. Siehe WITH Tabellen-Hint-Klausel, FROM-Klausel.
Adaptive Server Enterprise unterstützt weder rekursive Abfragen noch allgemeine Tabellenausdrücke.
Es gibt Unterschiede zwischen Adaptive Server Enterprise und SQL Anywhere in Bezug auf Outer Joins in Transact-SQL. Siehe Transact-SQL-Outer-Joins (*= oder =*).
In Transact-SQL verwenden Sie die SELECT-Anweisung zum Zuordnen eines Werts zu einer Variablen, ähnlich wie bei der Watcom-SQL-Anweisung SET.
Dieses Abfrage gibt die Gesamtzahl der Mitarbeiter in der Employees-Tabelle zurück.
SELECT COUNT(*) FROM Employees; |
In dieser Abfrage werden alle Kunden (customers) und der Gesamtwert ihrer Bestellungen (orders) aufgelistet.
SELECT CompanyName, CAST( SUM( SalesOrderItems.Quantity * Products.UnitPrice ) AS INTEGER ) VALUE FROM Customers JOIN SalesOrders JOIN SalesOrderItems JOIN Products GROUP BY CompanyName ORDER BY VALUE DESC; |
Die folgende Anweisung zeigt eine Embedded SQL-SELECT-Anweisung, bei der die Anzahl von Mitarbeitern in der Tabelle Employee in die :size-Hostvariable selektiert wird:
SELECT COUNT(*) INTO :size FROM Employees; |
Die folgende Anweisung ist dahingehend optimiert, die erste Zeile der Ergebnismenge schnell zurückzugeben:
SELECT Name FROM Products GROUP BY Name HAVING COUNT( * ) > 1 AND MAX( UnitPrice ) > 10 OPTION( optimization_goal = 'first-row' ); |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |