SELECT

SELECT kann entweder als Anweisung oder als Klausel innerhalb anderer Anweisungen verwendet werden:

  • Die SELECT-Anweisung ist die am häufigsten ausgeführte SQL-Anweisung. Sie fragt die Datenbank ab und ruft eine Menge von Zeilen ab.

  • Als Klausel definiert SELECT die von einer Abfrage zurückgegebene Menge von Spalten.

Siehe auch:

Abfragesyntax

Syntax

In den folgenden Abschnitten wird die Syntax dieses Befehls beschrieben:

Auswählen aller Spalten

[ ... ]
SELECT [ { ALL | DISTINCT } ]
       [ TOP <n> ]
       [{<object_name>|<alias>}.]*

       [ ILIKE '<pattern>' ]

       [ EXCLUDE
         {
           <col_name> | ( <col_name>, <col_name>, ... )
         }
       ]

       [ REPLACE
         {
           ( <expr> AS <col_name> [ , <expr> AS <col_name>, ... ] )
         }
       ]

       [ RENAME
         {
           <col_name> AS <col_alias>
           | ( <col_name> AS <col_alias>, <col_name> AS <col_alias>, ... )
         }
       ]
Copy

Sie können nach SELECT * die folgenden Kombinationen von Schlüsselwörtern angeben. Die Schlüsselwörter müssen in der unten angegebene Reihenfolge sein:

SELECT * ILIKE ... REPLACE ...
Copy
SELECT * ILIKE ... RENAME ...
Copy
SELECT * ILIKE ... REPLACE ... RENAME ...
Copy
SELECT * EXCLUDE ... REPLACE ...
Copy
SELECT * EXCLUDE ... RENAME ...
Copy
SELECT * EXCLUDE ... REPLACE ... RENAME ...
Copy
SELECT * REPLACE ... RENAME ...
Copy

Auswählen bestimmter Spalten

[ ... ]
SELECT [ { ALL | DISTINCT } ]
       [ TOP <n> ]
       {
         [{<object_name>|<alias>}.]<col_name>
         | [{<object_name>|<alias>}.]$<col_position>
         | <expr>
       }
       [ [ AS ] <col_alias> ]
       [ , ... ]
[ ... ]
Copy

Weitere Informationen zu SELECT als Anweisung und zu den anderen Klauseln in dieser Anweisung finden Sie unter Abfragesyntax.

Parameter

ALL | DISTINCT

Gibt an, ob im Resultset Duplikate entfernt werden sollen:

  • ALL schließt alle Werte in das Resultset ein.

  • DISTINCT entfernt doppelte Werte aus dem Resultset.

Standard: ALL

TOP n

Gibt die maximale Anzahl der zurückzugebenden Ergebnisse an. Siehe TOP <n>.

object_name oder . alias

Gibt den Objektbezeichner oder den Objektalias an, wie in der FROM-Klausel definiert.

*

Das Sternchen ist eine Abkürzung, um anzugeben, dass die Ausgabe alle Spalten des angegebenen Objekts oder alle Spalten aller Objekte enthalten soll, wenn * nicht mit einem Objektnamen oder Alias qualifiziert ist.

Wenn Sie * angeben, können Sie auch ILIKE, EXCLUDE, REPLACE und RENAME angeben:

ILIKE 'pattern'

Gibt an, dass nur die Spalten, die mit pattern übereinstimmen, in den Ergebnissen enthalten sein sollen.

In pattern können Sie die folgenden SQL-Platzhalter verwenden:

  • Verwenden Sie einen Unterstrich (_), um eine Übereinstimmung mit einem beliebigen einzelnen Zeichen anzugeben.

  • Verwenden Sie ein Prozentzeichen (%), um eine Übereinstimmung mit einer beliebigen Sequenz von null oder mehr Zeichen anzugeben.

Um eine Übereinstimmung mit einer Sequenz an einer bestimmten Stelle in einer Zeichenfolge anzugeben, beginnen und beenden Sie das Muster mit %.

Beim Abgleichen wird nicht zwischen Groß- und Kleinschreibung unterschieden.

Wenn keine Spalten mit dem angegebenen Muster übereinstimmen, tritt ein Kompilierungsfehler auf (001080 (42601): ... SELECT with no columns).

EXCLUDE col_name . EXCLUDE (col_name, col_name, ...)

Gibt die Spalten an, die von den Ergebnissen ausgeschlossen werden sollen.

Wenn Sie eine Auswahl aus mehreren Tabellen vornehmen, verwenden Sie SELECT table_name.*, um anzugeben, dass Sie alle Spalten einer bestimmten Tabelle auswählen möchten. Den nicht qualifizierten Spaltennamen geben Sie dann in EXCLUDE an. Beispiel:

SELECT table_a.* EXCLUDE column_in_table_a ,
  table_b.* EXCLUDE column_in_table_b
  ...
Copy
REPLACE (expr AS col_name [ , expr AS col_name, ...] )

Ersetzt den Wert von col_name durch den Wert des ausgewerteten Ausdrucks expr.

Um beispielsweise die Zeichenfolge 'DEPT-' den Werten in der Spalte department_id voranzustellen, verwenden Sie:

SELECT REPLACE ('DEPT-' || department_id AS department_id) ...
Copy

col_name:

  • Die Spalte muss existieren und kann nicht durch ILIKE oder EXCEPT herausgefiltert werden.

  • Sie können die gleiche Spalte nicht mehrmals in der Liste der Ersetzungen angeben.

  • Wenn die Spalte in mehreren Tabellen enthalten ist (z. B. in beiden Tabellen einer Verknüpfung), schlägt die Anweisung mit einem „ambiguous column“-Fehler (mehrdeutige Spalte) fehl.

expr muss einen einzelnen Wert ergeben.

RENAME col_name AS col_alias . RENAME (col_name AS col_alias, col_name AS col_alias, ...)

Gibt die Spalten-Aliasse an, die in den Ergebnissen verwendet werden sollen.

Wenn Sie eine Auswahl aus mehreren Tabellen vornehmen, verwenden Sie SELECT table_name.*, um anzugeben, dass Sie alle Spalten einer bestimmten Tabelle auswählen möchten. Den nicht qualifizierten Spaltennamen geben Sie dann in RENAME an. Beispiel:

SELECT table_a.* RENAME column_in_table_a AS col_alias_a,
  table_b.* RENAME column_in_table_b AS col_alias_b
  ...
Copy

Bemerkung

Wenn Sie nach SELECT * eine Kombination von Schlüsselwörtern angeben:

  • Sie können nicht gleichzeitig ILIKE und EXCLUDE angeben.

  • Wenn Sie EXCLUDE mit RENAME oder REPLACE angeben:

    • Sie müssen EXCLUDE vor RENAME oder REPLACE angegeben:

      SELECT * EXCLUDE col_a RENAME col_b AS alias_b ...
      
      Copy
      SELECT * EXCLUDE employee_id REPLACE ('DEPT-' || department_id AS department_id) ...
      
      Copy
    • Es kann nicht die gleiche Spalte in EXCLUDE und RENAME angegeben werden.

  • Wenn Sie ILIKE mit RENAME oder REPLACE angeben, müssen Sie zuerst ILIKE angeben:

    SELECT * ILIKE '%id%' RENAME department_id AS department ...
    
    Copy
    SELECT * ILIKE '%id%' REPLACE ('DEPT-' || department_id AS department_id) ...
    
    Copy
  • Wenn Sie REPLACE und RENAME angeben:

    • Sie müssen zuerst REPLACE angegeben:

      SELECT * REPLACE ('DEPT-' || department_id AS department_id) RENAME employee_id as employee ...
      
      Copy
    • Sie können denselben Spaltennamen in REPLACE und in RENAME angeben:

      SELECT * REPLACE ('DEPT-' || department_id AS department_id) RENAME department_id as department ...
      
      Copy
col_name

Gibt den Spaltenbezeichner an, wie in der FROM-Klausel definiert.

$col_position

Gibt die Position der Spalte (1-basiert) an, wie in der FROM-Klausel definiert. Wenn eine Spalte aus einer Tabelle referenziert wird, darf diese Anzahl die maximale Anzahl von Spalten in der Tabelle nicht überschreiten.

expr

Gibt einen Ausdruck an, beispielsweise einen mathematischen Ausdruck, der für eine bestimmte Zeile einen bestimmten Wert ergibt.

[ AS ] col_alias

Gibt den Spaltenalias an, der dem resultierenden Ausdruck zugewiesen ist. Dieser wird als Anzeigename in einer SELECT-Liste der obersten Ebene und als Spaltenname in einer Inline-Ansicht verwendet.

Weisen Sie keinen Spaltenalias zu, der mit dem Namen einer anderen Spalte, auf die in der Abfrage verwiesen wird, identisch ist. Wenn Sie beispielsweise Spalten mit den Namen prod_id und product_id auswählen, dürfen Sie für prod_id nicht den Alias product_id verwenden. Siehe Fehlerfall: Angeben eines Alias, der mit einem anderen Spaltennamen übereinstimmt.

Verwenden der FOR UPDATE-Klausel

Sperren Sie mit der optionalen FOR UPDATE-Klausel die Ergebnisse für künftige Aktualisierungen.

SELECT ...
  FROM ...
  [ ... ]
  FOR UPDATE [ NOWAIT | WAIT <wait_time> ]
Copy

Parameter

WAIT

Eine Ganzzahl gibt die maximale Dauer (in Sekunden) an, die diese Anweisung auf den Erwerb von Sperren wartet.

Nutzungshinweise

Bemerkung

Da Hybridtabellen die Isolationsebene READ COMMITTED unterstützen, können FOR UPDATE-Klauseln keine Lesestabilität garantieren.

  • Eine Tabelle T mit nur einer Spalte ID beginnt mit zwei Tupeln: 5 und 10.

  • SELECT * FROM T WHERE ID < 20 FOR UPDATE in Transaktion T1 würde zwei Tupel 5 und 10 zurückgeben und diese sperren.

    • DELETE FROM T WHERE ID = 5 aus einer anderen Transaktion T2 muss warten, bis T1 abgeschlossen ist (Commit oder Rollback).

  • Allerdings kann INSERT INTO T VALUES 12 in einer weiteren Transaktion T3 abgeschlossen werden, und ein nachfolgendes SELECT * FROM T WHERE ID < 20 in T1 wird drei Tupel sehen: 5, 10 und 12.

Nutzungshinweise

  • Aliasnamen und Bezeichner unterscheiden standardmäßig nicht zwischen Groß- und Kleinschreibung. Um die Groß-/Kleinschreibung zu erhalten, schließen Sie diese in Anführungszeichen (") ein. Weitere Informationen dazu finden Sie unter Objektbezeichner.

  • Ohne eine ORDER BY-Klausel sind die von SELECT zurückgegebenen Ergebnisse eine ungeordnete Menge. Wenn Sie die gleiche Abfrage wiederholt für dieselben Tabellen ausführen, kann dies jedes Mal zu einer anderen Ausgabereihenfolge führen. Wenn die Reihenfolge von Belang ist, verwenden Sie die ORDER BY-Klausel.

  • SELECT kann nicht nur als unabhängige Anweisung verwendet werden, sondern auch als Klausel in anderen Anweisungen, z. B. INSERT INTO ... SELECT ...;. SELECT kann auch in einer Unterabfrage innerhalb einer Anweisung verwendet werden.

  • Wenn Sie einen Spaltenalias für einen Ausdruck (z. B. expr AS col_alias) in anderen Teilen derselben Abfrage (in JOIN, FROM, WHERE, GROUP BY, anderen Spaltenausdrücken usw.) verwenden, wird der Ausdruck in vielen Fällen nur einmal ausgewertet.

    Beachten Sie jedoch, dass der Ausdruck in einigen Fällen mehrfach ausgewertet werden kann, was zu unterschiedlichen Werten für den in verschiedenen Teilen derselben Abfrage verwendeten Alias führen kann.

Beispiele

Nachfolgend finden Sie ein paar einfache Beispiele.

Viele Beispiele sind in anderen Teilen der Dokumentation enthalten, einschließlich der detaillierten Beschreibung von Abfragesyntax.

Beispiele für das Abfragen einer Ereignistabelle (deren Schema von Snowflake vordefiniert ist) finden Sie unter Zugriff auf protokollierte Meldungsdaten und Zugriff auf Ablaufverfolgungsdaten.

Einrichten der Daten für die Beispiele

Einige der Abfragen unten verwenden folgende Tabellen und Daten:

CREATE TABLE employee_table (
    employee_ID INTEGER,
    last_name VARCHAR,
    first_name VARCHAR,
    department_ID INTEGER
    );

CREATE TABLE department_table (
    department_ID INTEGER,
    department_name VARCHAR
    );
Copy
INSERT INTO employee_table (employee_ID, last_name, first_name, department_ID) VALUES
    (101, 'Montgomery', 'Pat', 1),
    (102, 'Levine', 'Terry', 2),
    (103, 'Comstock', 'Dana', 2);

INSERT INTO department_table (department_ID, department_name) VALUES
    (1, 'Engineering'),
    (2, 'Customer Support'),
    (3, 'Finance');
Copy

Beispiele für das Auswählen aller Spalten (SELECT *)

Auswählen aller Spalten in der Tabelle

In diesem Beispiel wird gezeigt, wie alle Spalten in employee_table auswählt werden:

SELECT * FROM employee_table;
Copy
+-------------+------------+------------+---------------+
| EMPLOYEE_ID | LAST_NAME  | FIRST_NAME | DEPARTMENT_ID |
|-------------+------------+------------+---------------|
|         101 | Montgomery | Pat        |             1 |
|         102 | Levine     | Terry      |             2 |
|         103 | Comstock   | Dana       |             2 |
+-------------+------------+------------+---------------+

Auswählen aller Spalten mit Namen, die mit einem Muster übereinstimmen

In diesem Beispiel wird gezeigt, wie Sie alle Spalten in employee_table auswählen, deren Namen id enthalten:

SELECT * ILIKE '%id%' FROM employee_table;
Copy
+-------------+---------------+
| EMPLOYEE_ID | DEPARTMENT_ID |
|-------------+---------------|
|         101 |             1 |
|         102 |             2 |
|         103 |             2 |
+-------------+---------------+

Auswählen aller Spalten bis auf eine Spalte

In diesem Beispiel wird gezeigt, wie alle Spalten in employee_table mit Ausnahme der Spalte department_id ausgewählt werden:

SELECT * EXCLUDE department_id FROM employee_table;
Copy
+-------------+------------+------------+
| EMPLOYEE_ID | LAST_NAME  | FIRST_NAME |
|-------------+------------+------------|
|         101 | Montgomery | Pat        |
|         102 | Levine     | Terry      |
|         103 | Comstock   | Dana       |
+-------------+------------+------------+

Auswählen aller Spalten bis auf zwei oder mehr Spalten

In diesem Beispiel wird gezeigt, wie Sie alle Spalten in employee_table mit Ausnahme der Spalten department_id und employee_id auswählen:

SELECT * EXCLUDE (department_id, employee_id) FROM employee_table;
Copy
+------------+------------+
| LAST_NAME  | FIRST_NAME |
|------------+------------|
| Montgomery | Pat        |
| Levine     | Terry      |
| Comstock   | Dana       |
+------------+------------+

Auswählen aller Spalten und Umbenennen einer Spalte

In diesem Beispiel wird gezeigt, wie Sie alle Spalten in employee_table auswählen und die Spalte department_id umbenennen:

SELECT * RENAME department_id AS department FROM employee_table;
Copy
+-------------+------------+------------+------------+
| EMPLOYEE_ID | LAST_NAME  | FIRST_NAME | DEPARTMENT |
|-------------+------------+------------+------------|
|         101 | Montgomery | Pat        |          1 |
|         102 | Levine     | Terry      |          2 |
|         103 | Comstock   | Dana       |          2 |
+-------------+------------+------------+------------+

Auswählen aller Spalten und Umbenennen mehrerer Spalten

In diesem Beispiel wird gezeigt, wie Sie alle Spalten in employee_table auswählen und die Spalten department_id und employee_id umbenennen:

SELECT * RENAME (department_id AS department, employee_id AS id) FROM employee_table;
Copy
+-----+------------+------------+------------+
|  ID | LAST_NAME  | FIRST_NAME | DEPARTMENT |
|-----+------------+------------+------------|
| 101 | Montgomery | Pat        |          1 |
| 102 | Levine     | Terry      |          2 |
| 103 | Comstock   | Dana       |          2 |
+-----+------------+------------+------------+

Auswählen aller Spalten, Ausschließen einer Spalte und Umbenennen mehrerer Spalten

In diesem Beispiel wird gezeigt, wie Sie alle Spalten in employee_table auswählen, die Spalte first_name aber ausschließen und die Spalten department_id und employee_id umbenennen:

SELECT * EXCLUDE first_name RENAME (department_id AS department, employee_id AS id) FROM employee_table;
Copy
+-----+------------+------------+
|  ID | LAST_NAME  | DEPARTMENT |
|-----+------------+------------|
| 101 | Montgomery |          1 |
| 102 | Levine     |          2 |
| 103 | Comstock   |          2 |
+-----+------------+------------+

Auswählen aller Spalten mit Namen, die mit einem Muster übereinstimmen, und Umbenennen einer Spalte

In diesem Beispiel wird gezeigt, wie Sie alle Spalten in employee_table auswählen, deren Namen id enthalten, und wie Sie die Spalte department_id umbenennen:

SELECT * ILIKE '%id%' RENAME department_id AS department FROM employee_table;
Copy
+-------------+------------+
| EMPLOYEE_ID | DEPARTMENT |
|-------------+------------|
|         101 |          1 |
|         102 |          2 |
|         103 |          2 |
+-------------+------------+

Auswählen aller Spalten und Ersetzen des Werts einer Spalte

Dieses Beispiel zeigt, wie Sie alle Spalten in employee_table auswählen und den Wert in der Spalte department_id durch den Wert ID mit vorangestelltem DEPT- ersetzen:

SELECT * REPLACE ('DEPT-' || department_id AS department_id) FROM employee_table;
Copy
+-------------+------------+------------+---------------+
| EMPLOYEE_ID | LAST_NAME  | FIRST_NAME | DEPARTMENT_ID |
|-------------+------------+------------+---------------|
|         101 | Montgomery | Pat        | DEPT-1        |
|         102 | Levine     | Terry      | DEPT-2        |
|         103 | Comstock   | Dana       | DEPT-2        |
+-------------+------------+------------+---------------+

Auswählen aller Spalten, Ersetzen des Werts einer Spalte und Umbenennen der Spalte

Dieses Beispiel zeigt, wie Sie alle Spalten in employee_table auswählen, den Wert in der Spalte department_id durch den Wert ID mit vorangestelltem DEPT- ersetzen und die Spalte umbenennen:

SELECT * REPLACE ('DEPT-' || department_id AS department_id) RENAME department_id AS department FROM employee_table;
Copy
+-------------+------------+------------+------------+
| EMPLOYEE_ID | LAST_NAME  | FIRST_NAME | DEPARTMENT |
|-------------+------------+------------+------------|
|         101 | Montgomery | Pat        | DEPT-1     |
|         102 | Levine     | Terry      | DEPT-2     |
|         103 | Comstock   | Dana       | DEPT-2     |
+-------------+------------+------------+------------+

Auswählen aller Spalten mit Namen, die mit einem Muster übereinstimmen, und Ersetzen des Wertes in einer Spalte

Dieses Beispiel zeigt, wie Sie alle Spalten in employee_table auswählen, deren Namen id enthalten, und wie Sie den Werten in der Spalte department_id die Zeichenfolge DEPT- voranstellen:

SELECT * ILIKE '%id%' REPLACE('DEPT-' || department_id AS department_id) FROM employee_table;
Copy
+-------------+---------------+
| EMPLOYEE_ID | DEPARTMENT_ID |
|-------------+---------------|
|         101 | DEPT-1        |
|         102 | DEPT-2        |
|         103 | DEPT-2        |
+-------------+---------------+

Auswählen aller Spalten aus mehreren Tabellen, Ausschließen einer Spalte und Umbenennen einer Spalte

In diesem Beispiel werden zwei Tabellen verknüpft und alle Spalten aus beiden Tabellen ausgewählt, bis auf eine Spalte aus employee_table. Im Beispiel wird auch eine der aus department_table ausgewählten Spalten umbenannt.

SELECT
  employee_table.* EXCLUDE department_id,
  department_table.* RENAME department_name AS department
FROM employee_table INNER JOIN department_table
  ON employee_table.department_id = department_table.department_id
ORDER BY department, last_name, first_name;
Copy
+-------------+------------+------------+---------------+------------------+
| EMPLOYEE_ID | LAST_NAME  | FIRST_NAME | DEPARTMENT_ID | DEPARTMENT       |
|-------------+------------+------------+---------------+------------------|
|         103 | Comstock   | Dana       |             2 | Customer Support |
|         102 | Levine     | Terry      |             2 | Customer Support |
|         101 | Montgomery | Pat        |             1 | Engineering      |
+-------------+------------+------------+---------------+------------------+

Beispiele für das Auswählen bestimmter Spalten (SELECT <Spaltenname>)

Auswählen einer einzelnen Spalte nach Name

Dieses Beispiel zeigt, wie Sie nach dem Nachnamen eines Mitarbeiters suchen können, wenn Sie die ID kennen.

SELECT last_name FROM employee_table WHERE employee_ID = 101;
+------------+
| LAST_NAME  |
|------------|
| Montgomery |
+------------+
Copy

Auswählen mehrerer Spalten nach Namen aus verknüpften Tabellen

In diesem Beispiel werden alle Mitarbeiter mit dem Namen der Abteilung aufgelistet, in der sie tätig sind. Die Reihenfolge bei der Ausgabe erfolgt nach Abteilungsnamen, und innerhalb der einzelnen Abteilung nach Namen der Mitarbeiter. Diese Abfrage verwendet eine Verknüpfung (Join), um die Informationen einer Tabelle mit den Informationen einer anderen Tabelle zu verknüpfen.

SELECT department_name, last_name, first_name
    FROM employee_table INNER JOIN department_table
        ON employee_table.department_ID = department_table.department_ID
    ORDER BY department_name, last_name, first_name;
+------------------+------------+------------+
| DEPARTMENT_NAME  | LAST_NAME  | FIRST_NAME |
|------------------+------------+------------|
| Customer Support | Comstock   | Dana       |
| Customer Support | Levine     | Terry      |
| Engineering      | Montgomery | Pat        |
+------------------+------------+------------+
Copy

Auswählen einer Spalte nach Position

Dieses Beispiel zeigt, wie Sie mithilfe von $ eine Spalte statt über den Spaltennamen mit der Spaltennummer identifizieren:

SELECT $2 FROM employee_table ORDER BY $2;
+------------+
| $2         |
|------------|
| Comstock   |
| Levine     |
| Montgomery |
+------------+
Copy

Angeben eines Alias für eine Spalte in der Ausgabe

Dieses Beispiel zeigt, dass die Ausgabespalten nicht direkt aus den Tabellen in der FROM-Klausel entnommen werden müssen. Die Ausgabespalten können allgemeine Ausdrücke sein. Dieses Beispiel berechnet die Fläche eines Kreises mit dem Radius 2.0. Dieses Beispiel zeigt auch, wie Sie einen Spaltenalias verwenden, damit die Ausgabe einen aussagekräftigen Spaltennamen hat:

SELECT pi() * 2.0 * 2.0 AS area_of_circle;
+----------------+
| AREA_OF_CIRCLE |
|----------------|
|   12.566370614 |
+----------------+
Copy

Fehlerfall: Angeben eines Alias, der mit einem anderen Spaltennamen übereinstimmt

Dieses Beispiel zeigt, warum es nicht empfehlenswert ist, einen Spaltenalias zu verwenden, der mit dem Namen einer anderen in der Abfrage verwendeten Spalte übereinstimmt. Diese GROUP BY-Abfrage führt zu einem SQL-Compilerfehler, nicht zu einem Fehler aufgrund von mehrdeutigen Spalten. Der Alias prod_id, der product_id in table1 zugewiesen wird, entspricht dem Namen der Spalte prod_id in table2. Die einfachste Lösung für diesen Fehler besteht darin, der Spalte einen anderen Alias zu geben.

CREATE OR REPLACE TABLE table1 (product_id NUMBER);

CREATE OR REPLACE TABLE table2 (prod_id NUMBER);

SELECT t1.product_id AS prod_id, t2.prod_id
  FROM table1 AS t1 JOIN table2 AS t2
    ON t1.product_id=t2.prod_id
  GROUP BY prod_id, t2.prod_id;
Copy
001104 (42601): SQL compilation error: error line 1 at position 7
'T1.PRODUCT_ID' in select clause is neither an aggregate nor in the group by clause.