

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# SELECT
<a name="select"></a>

Ruft Datenzeilen aus null oder mehr Tabellen ab.

**Anmerkung**  
Dieses Thema enthält zusammenfassende Informationen zur Referenz. Umfassende Informationen über die Verwendung von `SELECT` und der SQL-Sprache gehen über den Rahmen dieser Dokumentation hinaus. Weitere Informationen zur Verwendung von SQL speziell für Athena finden Sie unter [Überlegungen und Einschränkungen für SQL-Abfragen in Amazon Athena](other-notable-limitations.md) und [Ausführen von SQL-Abfragen in Amazon Athena](querying-athena-tables.md). Für ein Beispiel für das Erstellen einer Datenbank, das Erstellen einer Tabelle und das Ausführen einer `SELECT`-Abfrage auf dem Tisch in Athena siehe [Erste Schritte](getting-started.md).

## Syntax
<a name="synopsis"></a>

```
[ WITH with_query [, ...] ]
SELECT [ ALL | DISTINCT ] {{select_expression}} [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]
[ HAVING condition ]
[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
[ ORDER BY expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST] [, ...] ]
[ OFFSET count [ ROW | ROWS ] ]
[ LIMIT [ count | ALL ] ]
```

**Anmerkung**  
Reservierte Wörter in SQL SELECT-Anweisungen müssen in doppelte Anführungszeichen eingeschlossen werden. Weitere Informationen finden Sie unter [Reservierte Schlüsselwörter, die in SQL-SELECT-Anweisungen umgegangen werden müssen](reserved-words.md#list-of-reserved-words-sql-select).

## Parameters
<a name="select-parameters"></a>

**[ WITH with\_query [, ....] ]**  
Mit `WITH` können Sie verschachtelte Abfragen reduzieren oder Unterabfragen vereinfachen.  
Die Verwendung der `WITH`-Klausel zur Erstellung rekursiver Abfragen wird ab der Athena-Engine-Version 3 unterstützt. Die maximale Rekursionstiefe beträgt 10.  
Die Klausel `WITH` geht der `SELECT`-Liste in einer Abfrage voraus und legt eine oder mehrere Unterabfragen für die Verwendung in der `SELECT`-Abfrage fest.   
Jede Unterabfrage definiert eine temporäre Tabelle ähnlich wie eine Ansichtdefinition, die mit der `FROM`-Klausel referenziert werden kann. Die Tabellen werden nur verwendet, wenn die Abfrage ausgeführt wird.   
Die Syntax von `with_query` lautet:  

```
subquery_table_name [ ( column_name [, ...] ) ] AS (subquery)
```
Wobei Folgendes gilt:  
+  `subquery_table_name` ist ein eindeutiger Name für eine temporäre Tabelle, die die Ergebnisse der Unterabfrage mit `WITH`-Klausel definiert. Jede `subquery` muss einen Tabellennamen erhalten, der in der `FROM`-Klausel referenziert werden kann.
+  `column_name [, ...]` ist eine optionale Liste der ausgegebenen Spaltennamen. Die Anzahl der Spaltennamen muss größer als oder gleich der Anzahl der Spalten sein, die von der `subquery` definiert wird.
+  `subquery` ist eine Abfrageanweisung.

**[ ALL \| DISTINCT ] select\_expression**  
 `select_expression` legt die auszuwählenden Zeilen fest. Ein `select_expression` kann eines der folgenden Formate verwenden:  

```
expression [ [ AS ] column_alias ] [, ...]
```

```
row_expression.* [ AS ( column_alias [, ...] ) ]
```

```
relation.*
```

```
*
```
+ Die `expression [ [ AS ] column_alias ]` Syntax gibt eine Ausgabespalte an. Die optionale `[AS] column_alias`-Syntax gibt einen benutzerdefinierten Überschriftennamen an, der für die Spalte in der Ausgabe verwendet werden soll.
+ Für `row_expression.* [ AS ( column_alias [, ...] ) ]`, `row_expression` ist ein beliebiger Ausdruck eines Datentyps `ROW`. Die Felder der Zeile definieren die Ausgabespalten, die im Ergebnis enthalten sein sollen.
+ Für `relation.*`, die Spalten von `relation` sind im Ergebnis enthalten. Diese Syntax erlaubt nicht die Verwendung von Spaltenaliasnamen.
+ Das Sternchen `*` gibt an, dass alle Spalten in die Ergebnismenge aufgenommen werden.
+ In der Ergebnismenge entspricht die Reihenfolge der Spalten der Reihenfolge ihrer Angabe durch den Auswahlausdruck. Gibt ein Auswahlausdruck mehrere Spalten gibt, folgt die Spaltenreihenfolge der Reihenfolge, die in der Quellrelation oder im Zeilentypausdruck verwendet wurde.
+ Sind Spaltenaliase angegeben, überschreiben die Aliase bereits vorhandene Spalten- oder Zeilenfeldnamen. Enthält der Auswahlausdruck keine Spaltennamen, werden anonyme Spaltennamen (`_col0`, `_col1`, `_col2, ...`) mit einem Nullindex in der Ausgabe angezeigt.
+  `ALL` ist die Standardeinstellung. Bei Verwendung von `ALL` wird dies so behandelt, als wäre kein Wert angegeben worden. Alle Zeilen aller Spalten werden einschließlich Duplikaten ausgewählt.
+ Verwenden Sie `DISTINCT`, um nur eindeutige Werte zurückzugeben, wenn eine Spalte Duplikatwerte enthält.

**FROM from\_item [,...]**  
Gibt die Eingabe der Abfrage an, wobei `from_item` eine Ansicht, ein JOIN-Konstrukt oder eine Unterabfrage wie unten beschrieben sein kann.  
`from_item` kann eines der Folgenden sein:  
+  `table_name [ [ AS ] alias [ (column_alias [, ...]) ] ]` 

  Hier ist `table_name` der Name der Zieltabelle, aus der Zeilen ausgewählt werden. `alias` ist der Name für die Ausgabe der `SELECT`-Anweisung und `column_alias` definiert die Spalten für den angegebenen `alias`.
 **-ODER-**   
+  `join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]` 

  Hierbei ist `join_type` eines der Folgenden:
  +  `[ INNER ] JOIN` 
  +  `LEFT [ OUTER ] JOIN` 
  +  `RIGHT [ OUTER ] JOIN` 
  +  `FULL [ OUTER ] JOIN` 
  +  `CROSS JOIN` 
  +  `ON join_condition | USING (join_column [, ...])` Wobei Sie durch Verwenden von `join_condition` die Spaltennamen für JOIN-Schlüssel in mehreren Tabellen angeben können. Für die Verwendung von `join_column` muss `join_column` in beiden Tabellen vorhanden sein.

**[ WHERE condition ]**  
Filtert Ergebnisse nach dem von Ihnen angegebenen `condition`, wobei `condition` im Allgemeinen die folgende Syntax hat.  

```
{{column_name}} {{operator}} {{value}} [[[AND | OR] {{column_name}} {{operator}} {{value}}] ...]
```
Das {{operator}} kann einer der Komparatoren sein`=`,,`>`,`<`,`>=`, `<=``<>`,`!=`.   
Die folgenden Unterabfrageausdrücke können auch in der `WHERE`-Klausel verwendet werden.  
+ `[NOT] BETWEEN {{integer_A}} AND {{integer_B}}` – Gibt einen Bereich zwischen zwei Ganzzahlen an, wie im folgenden Beispiel. Wenn der Spaltendatentyp `varchar` ist, muss die Spalte zuerst in eine Ganzzahl umgewandelt werden.

  ```
  SELECT DISTINCT processid FROM "webdata"."impressions"
  WHERE cast(processid as int) BETWEEN 1500 and 1800
  ORDER BY processid
  ```
+ `[NOT] LIKE {{value}}` – Sucht nach dem angegebenen Muster. Verwenden Sie das Prozentzeichen (`%`) als Platzhalterzeichen, wie im folgenden Beispiel.

  ```
  SELECT * FROM "webdata"."impressions"
  WHERE referrer LIKE '%.org'
  ```
+ `[NOT] IN ({{value}}[, {{value}}[, ...])` – Gibt eine Liste möglicher Werte für eine Spalte an, wie im folgenden Beispiel gezeigt.

  ```
  SELECT * FROM "webdata"."impressions"
  WHERE referrer IN ('example.com','example.net','example.org')
  ```

**[ GROUP BY [ ALL \| DISTINCT ] grouping\_expressions [, ...] ]**  
Teilt die Ausgabe der `SELECT`-Anweisung in Zeilen mit passenden Werten.  
 Über `ALL` und `DISTINCT` wird festgelegt, ob für Duplikate jeweils eine eigene Ausgabezeile angelegt wird. Wenn nichts angegeben ist, wird von `ALL` ausgegangen.   
`grouping_expressions` ermöglicht Ihnen, komplexe Gruppierungsoperationen auszuführen. Sie können komplexe Gruppierungsvorgänge verwenden, um Analysen durchzuführen, die eine Aggregation mehrerer Spaltengruppen in einer einzigen Abfrage erfordern.  
Das `grouping_expressions`-Element kann eine beliebige Funktion sein, z. B. `SUM`, `AVG` oder `COUNT`, die auf Eingabespalten ausgeführt wird.   
Mithilfe von `GROUP BY`-Ausdrücken kann die Ausgabe nach Eingabespaltennamen gruppiert werden, die nicht in der Ausgabe der `SELECT`-Anweisung auftauchen.   
Alle Ausgabeausdrücke müssen entweder Aggregatfunktionen oder Spalten sein, die in der `GROUP BY`-Klausel vorhanden sind.   
Sie können mit einer einzelnen Abfrage eine Analyse durchführen, für die mehrere Spaltensätze zusammengefasst werden müssen.   
Athena unterstützt komplexe Aggregationen mit `GROUPING SETS`, `CUBE` und `ROLLUP`. `GROUP BY GROUPING SETS` gibt mehrere Spaltenlisten an, nach denen gruppiert werden soll. `GROUP BY CUBE` generiert alle möglichen Gruppierungssätze für einen gegebenen Satz von Spalten. `GROUP BY ROLLUP` generiert alle möglichen Zwischensummen für einen gegebenen Satz von Spalten. Komplexe Gruppierungsoperationen unterstützen keine Gruppierung von Ausdrücken, die aus Eingabespalten bestehen. Es sind nur Spaltennamen zulässig.   
Oft können Sie mit `UNION ALL` dieselben Ergebnisse erzielen wie mit diesen `GROUP BY`-Operationen. Abfragen, in denen `GROUP BY` verwendet wird, haben jedoch den Vorteil, dass die Daten einmalig ausgelesen werden, wohingegen bei `UNION ALL` die zugrunde liegenden Daten dreimal ausgelesen werden, was zu uneinheitlichen Ergebnissen führen kann, wenn die Datenquelle sich geändert hat. 

**[ HAVING condition ]**  
Wird in Aggregatfunktionen und der `GROUP BY`-Klausel verwendet. Kontrolliert, welche Gruppen ausgewählt werden und schließt Gruppen aus, die die `condition` nicht erfüllen. Diese Filterung wird nach der Berechnung der Gruppierungs- und Aggregatfunktionen ausgeführt.

**[ { UNION \| INTERSECT \| EXCEPT } [ ALL \| DISTINCT ] union\_query] ]**  
`UNION`, `INTERSECT` und`EXCEPT` kombinieren die Ergebnisse mehrerer `SELECT`-Anweisungen in eine einzelne Abfrage. `ALL` oder `DISTINCT` steuern die Eindeutigkeit der Zeilen, die in der endgültigen Ergebnismenge enthalten sind.   
`UNION` kombiniert die Zeilen, die sich aus der ersten Abfrage ergeben, mit den Zeilen, die aus der zweiten Abfrage resultieren. Um Duplikate zu eliminieren, erstellt `UNION` eine Hash-Tabelle, die Speicher verbraucht. Ziehen Sie für eine bessere Leistung die Verwendung von `UNION ALL` in Betracht, wenn Ihre Abfrage die Eliminierung von Duplikaten nicht erfordert. Mehrere `UNION`-Klauseln werden von links nach rechts verarbeitet, sofern Sie keine Klammern verwenden, um die Verarbeitungsreihenfolge explizit festzulegen.  
`INTERSECT` gibt nur die Zeilen zurück, die in den Ergebnissen der ersten und der zweiten Abfrage vorhanden sind.  
`EXCEPT` gibt die Zeilen aus den Ergebnissen der ersten Abfrage zurück, ausgenommen die Zeilen, die von der zweiten Abfrage gefunden wurden.  
`ALL` bewirkt, dass alle Zeilen aufgenommen werden, auch wenn die Zeilen identisch sind.  
`DISTINCT` bewirkt, dass nur eindeutige Zeilen in die kombinierte Ergebnismenge aufgenommen werden. 

**[ ORDER BY expression [ ASC \| DESC ] [ NULLS FIRST \| NULLS LAST] [, ...] ]**  
Sortiert eine Ergebnisgruppe nach einem oder mehreren Ausgabe-`expression`.   
Wenn die Klausel mehrere Ausdrücke enthält, wird die Ergebnisgruppe nach dem ersten `expression` sortiert. Danach wird der zweite `expression` auf die Zeilen mit passenden Werten aus dem ersten Ausdruck angewendet usw.   
Jeder `expression` kann Ausgabespalten aus `SELECT` oder eine Ordinalzahl für eine Ausgabespalte nach Position (beginnend mit 1) festlegen.  
`ORDER BY` wird im letzten Schritt nach `GROUP BY`- und `HAVING`-Klauseln ausgewertet. Über `ASC` und `DESC` wird festgelegt, ob die Ergebnisse in auf- oder absteigender Reihenfolge sortiert werden. Standardmäßig ist die Sortierreihenfolge aufsteigend (`ASC`). Die Standardnullsortierung ist `NULLS LAST` unabhängig von auf- oder absteigender Sortierreihenfolge.

**[ OFFSET count [ ROW \| ROWS ] ]**  
Verwenden Sie die `OFFSET`-Klausel, um eine Reihe führender Zeilen aus der Ergebnismenge zu verwerfen. Wenn die `ORDER BY`-Klausel vorhanden ist, wird die `OFFSET`-Klausel über eine sortierte Ergebnismenge ausgewertet und die Menge bleibt sortiert, nachdem die übersprungenen Zeilen verworfen wurden. Wenn die Abfrage keine `ORDER BY`-Klausel hat, ist es willkürlich, welche Zeilen verworfen werden. Wenn die durch `OFFSET` angegebene Anzahl der Größe der Ergebnismenge entspricht oder diese überschreitet, ist das Endergebnis leer. 

**LIMIT [ count \| ALL ]**  
Beschränkt die Anzahl der Zeilen in der Ergebnisgruppe auf `count`. `LIMIT ALL` entspricht dem Weglassen der `LIMIT`-Klausel. Wenn die Abfrage keine `ORDER BY`-Klausel enthält, werden die Ergebnisse zufällig angezeigt.

**TABLESAMPLE [ BERNOULLI \| SYSTEM ] (percentage)**  
Optionaler Operator zur Auswahl von Zeilen aus einer Tabelle basierend auf einer Stichprobenmethode.  
 Mit `BERNOULLI` wird jede Zeile mit einer Wahrscheinlichkeit von `percentage` als Teil der Stichprobe ausgewählt. Alle physischen Blöcke der Tabelle werden gescannt und bestimmte Zeilen werden basierend auf einem Vergleich zwischen dem `percentage` der Stichproben und einem zufälligen, zur Laufzeit berechneten Wert übersprungen.   
Mit `SYSTEM` wird die Tabelle in logische Datensegmente unterteilt. Aus der Tabelle werden Stichproben mit dieser Granularität entnommen.   
Es werden entweder alle Zeilen aus einem bestimmten Segment ausgewählt oder das Segment wird basierend auf einem Vergleich zwischen dem `percentage` der Stichprobe und einem zufälligen, während der Laufzeit berechneten Wert übersprungen. `SYSTEM`-Stichproben sind abhängig vom Connector. Mit dieser Methode kann keine unabhängige Stichprobenwahrscheinlichkeit garantiert werden.

**[ UNNEST (array\_or\_map) [WITH ORDINALITY] ]**  
Erweitert ein Array oder eine Zuordnung in eine Beziehung. Arrays werden in eine einzelne Spalte erweitert. Zuordnungen werden in zwei Spalten (*Schlüssel* und *Wert*) erweitert.   
Sie können `UNNEST` mit mehreren Argumenten verwenden, die in mehrere Spalten mit so vielen Zeilen wie das höchste Kardinalitätsargument erweitert werden.   
Andere Spalten werden mit Nullen aufgefüllt.   
Die `WITH ORDINALITY`-Klausel fügt eine Ordinalitätsspalte am Ende hinzu.  
 `UNNEST` wird normalerweise mit einem `JOIN` verwendet und kann auf Spalten von Beziehungen links des `JOIN` verweisen.

## Abrufen der Dateispeicherorte für Quelldaten in Amazon S3
<a name="select-path"></a>

Um den Speicherort der Amazon-S3-Datei für die Daten in einer Tabellenzeile anzuzeigen, können Sie `"$path"` in einer `SELECT`-Abfrage verwenden, wie im folgenden Beispiel:

```
SELECT "$path" FROM "my_database"."my_table" WHERE year=2019;
```

Dies gibt ein Ergebnis wie das folgende zurück:

```
s3://amzn-s3-demo-bucket/datasets_mytable/year=2019/data_file1.json
```

Um eine sortierte, eindeutige Liste der S3-Dateinamenspfade für die Daten in einer Tabelle zurückzugeben, können Sie wie im folgenden Beispiel `SELECT DISTINCT` und `ORDER BY` verwenden.

```
SELECT DISTINCT "$path" AS data_source_file
FROM sampledb.elb_logs
ORDER By data_source_file ASC
```

Um nur die Dateinamen ohne Pfad zurückzugeben, können Sie `"$path"` wie im folgenden Beispiel als Parameter an eine `regexp_extract`-Funktion übergeben.

```
SELECT DISTINCT regexp_extract("$path", '[^/]+$') AS data_source_file
FROM sampledb.elb_logs
ORDER By data_source_file ASC
```

Um die Daten aus einer bestimmten Datei zurückzugeben, geben Sie die Datei in der `WHERE`-Klausel an, wie im folgenden Beispiel.

```
SELECT *,"$path" FROM my_database.my_table WHERE "$path" = 's3://amzn-s3-demo-bucket/my_table/my_partition/file-01.csv'
```

Weitere Informationen und Beispiele finden Sie im Wissenscenter-Artikel [Wie kann ich die Amazon-S3-Quelldatei für eine Zeile in einer Athena-Tabelle anzeigen?](https://aws.amazon.com/premiumsupport/knowledge-center/find-s3-source-file-athena-table-row/).

**Anmerkung**  
In Athena, Hive oder Iceberg werden die versteckten Metadatenspalten `$bucket`, `$file_modified_time`, `$file_size` und `$partition` für Ansichten nicht unterstützt.

## Maskieren von einfachen Anführungszeichen mit Escape
<a name="select-escaping"></a>

 Um ein einzelnes Anführungszeichen mit Escape zu maskieren, stellen Sie ihm ein weiteres einfaches Anführungszeichen voran, wie im folgenden Beispiel. Verwechseln Sie dies nicht mit einem doppelten Anführungszeichen. 

```
Select 'O''Reilly'
```

**Ergebnisse**  
`O'Reilly`

## Weitere Ressourcen
<a name="select-additional-resources"></a>

Weitere Informationen zur Verwendung von `SELECT`-Anweisungen in Athena finden Sie in den folgenden Ressourcen.


| Weitere Informationen darüber | Sehen Sie dies an | 
| --- | --- | 
| Ausführen von Abfragen in Athena | [Ausführen von SQL-Abfragen in Amazon Athena](querying-athena-tables.md) | 
| Mit SELECT eine Tabelle erstellen | [Erstellen einer Tabelle aus Abfrageergebnissen (CTAS)](ctas.md) | 
| Einfügen von Daten aus einer SELECT-Abfrage in eine andere Tabelle | [INSERT INTO](insert-into.md) | 
| Integrierte Funktionen in SELECT-Anweisungen verwenden | [Funktionen in Amazon Athena](functions.md) | 
| Verwenden von benutzerdefinierten Funktionen in SELECT-Anweisungen | [Abfragen mit benutzerdefinierten Funktionen](querying-udf.md) | 
| Metadaten des Datenkatalogs abfragen | [Fragen Sie die ab AWS Glue Data Catalog](querying-glue-catalog.md) | 