Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Referenzhandbuch » Verwendung von SQL » SQL-Anweisungen » SQL-Anweisungen (P-Z)

 

SELECT-Anweisung

Mit dieser Anweisung rufen Sie Informationen aus der Datenbank ab.

Syntax
[ WITH Temporäre_Ansichten ]
  SELECT [ ALL | DISTINCT ] [ Zeilenbeschränkung ] 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 { UPDATE [ Cursorparallelität ] | READ ONLY } ]
[ FOR XML XML-Modus ]
[ OPTION( Abfrage-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änkung :
  FIRST | TOP n [ START AT m ]
Auswahlliste :
Ausdruck [ [ AS ] Aliasname ], ...
| *
| Fensterfunktion OVER { Fenstername  | Fensterspezifikation } 
   [ [ AS ] Aliasname ]

from-Ausdruck: Weitere Hinweise finden Sie unter FROM-Klausel.

group-by-Ausdruck: Weitere Hinweise finden Sie unter GROUP BY-Klausel.

Suchbedingung: Weitere Hinweise finden Sie unter Suchbedingungen.

Fenstername : Bezeichner

Fensterausdruck: Weitere Hinweise finden Sie unter WINDOW-Klausel.

Fensterspezifikation: Weitere Hinweise finden Sie unter WINDOW-Klausel.

Fensterfunktion :
RANK( )
|DENSE_RANK( )
|PERCENT_RANK( )
|CUME_DIST( )
|ROW_NUMBER( )
| Aggregatfunktion

Cursorparallelität :
  BY { VALUES | TIMESTAMP | LOCK } 
XML-Modus :
RAW [ , ELEMENTS ] 
| AUTO [ , ELEMENTS ] 
| EXPLICIT
Abfrage-Hint :
MATERIALIZED VIEW OPTIMIZATION Optionswert
| FORCE OPTIMIZATION
| FORCE NO OPTIMIZATION
| Optionsname = Optionswert
Optionsname : Bezeichner
Optionswert : Hostvariable (Bezeichner zulässig), Zeichenfolge, Bezeichner oder Zahl
Parameter
  • 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. Weitere Hinweise finden Sie unter 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änkungsklausel   Die Zeilenbeschränkungsklausel ermöglicht es Ihnen, eine Teilmenge der Zeilen zurückzugeben, die von der WHERE-Klausel erfasst werden. 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. Wenn diese Klauseln angegeben werden, wird normalerweise auch eine ORDER BY-Klausel angegeben, um die Zeilen sinnvoll zu ordnen. Weitere Hinweise finden Sie unter Die Anzahl der Zeilen, die von einer Abfrage zurückgegeben werden, explizit beschränken.

  • 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 selbst 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.

    • 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;

    Weitere Hinweise finden Sie unter 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). Weitere Hinweise finden Sie unter 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.

  • 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 Weitere Hinweise finden Sie unter 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 einer Abfrage aus geöffneten Cursor zulässig sind und, falls dem so ist, welche Parallelitätsemantik verwendet werden soll. Diese Klausel kann nicht mit der FOR XML-Klausel verwendet werden.

    Wenn Sie FOR UPDATE BY TIMESTAMP oder FOR UPDATE BY VALUES angeben, verwendet der Datenbankserver eine optimistische Parallelität, indem ein Keyset-gesteuerter Cursor eingesetzt wird. In so einer Situation kann es zu Aktualisierungsverlusten kommen.

    Wenn Sie in der SELECT-Anweisung keine FOR-Klausel verwenden, hängt die Aktualisierbarkeit eines Cursors von der Deklaration des Cursors ab (siehe DECLARE-Anweisung und FOR-Anweisung) sowie von der Angabe der Cursorparallelität durch die API. In ODBC, JDBC und OLE DB wird standardmäßig ein schreibgeschützter Vorwärts-Cursor verwendet, es sei denn, die Anwendung setzt dies außer Kraft. In Open Client, Embedded SQL und innerhalb von gespeicherten Prozeduren muss die Aktualisierbarkeit eines Cursor nicht angegeben werden, und der Standardwert ist FOR UPDATE.

    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

    Zusätzlich zur Cursoraktualisierbarkeit hängt die Aktualisierbarkeit einer Anweisung auch von der Einstellung der Datenbankoption ansi_update_constraints und den spezifischen Merkmalen der Anweisung ab, so z.B., ob die Anweisung ORDER BY, DISTINCT, GROUP BY, HAVING, UNION, Aggregatfunktionen, Joins oder nicht aktualisierbare Ansichten enthält.

    Weitere Hinweise zur Cursorempfindlichkeit finden Sie unter SQL Anywhere-Cursor.

    Weitere Informationen zur ODBC-Parallelität finden Sie in der Erläuterung von SQLSetStmtAttr in ODBC-Cursormerkmale wählen.

    Weitere Hinweise über die Datenbankoption ansi_update_constraints finden Sie unter ansi_update_constraints-Option [Kompatibilität].

    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.

    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 Select-Liste referenzierte Tabelle wird als Element in XML angegeben. Die Reihenfolge der Verschachtelung der Elemente basiert auf der Reihenfolge, in der Tabellen in der Select-Liste 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. Weitere Hinweise finden Sie unter 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. Weitere Hinweise finden Sie unter materialized_view_optimization-Option [Datenbank].

    • 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. In manchen Fällen kann es sinnvoll sein, dass eine kostenbasierte Optimierung durchgeführt wird. 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 zu komplex ist, um sie auf diese Weise zu verarbeiten - möglicherweise aufgrund der eingestellten Datenbankoptionen oder 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   Legt eine Optionseinstellung fest, die bei dieser Anweisung Vorrang vor allen öffentlichen und temporären Optionseinstellungen hat, die aktiviert sind. Die unterstützten Optionen sind folgende:

Bemerkungen

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.

Hinweis

Wenn ein GROUP BY-Ausdruck in einer SELECT-Anweisung 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.

Berechtigungen

SELECT-Berechtigung für die benannten Tabellen und Ansichten ist erforderlich.

Nebenwirkungen

Keine.

Siehe auch
Standards und Kompatibilität
  • SQL/2003   Kernfunktion. Wegen der Komplexität der SELECT-Anweisung sollten Sie individuelle Klauseln auf den Standard abprüfen. Das ROLLUP-Schlüsselwort ist beispielsweise Teil des Merkmals T431.

    FOR UPDATE, FOR READ ONLY und FOR UPDATE ( Spaltenliste ) sind Kernfunktionen.

    FOR UPDATE BY [ LOCK | TIMESTAMP | VALUES ] ist eine SQL Anywhere-Erweiterung des Herstellers.

Beispiel

Dieses Beispiel gibt die Gesamtzahl der Mitarbeiter in der Employees-Tabelle zurück.

SELECT COUNT(*)
FROM Employees;

Dieses Beispiel listet alle Kunden (customers) und den Gesamtwert ihrer Bestellungen (orders) auf.

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, in 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' );