SELECT - Amazon Athena

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

Ruft Datenzeilen aus null oder mehr Tabellen ab.

Anmerkung

Dieses Thema enthält zusammenfassende Informationen zur Referenz. Umfassende Informationen zur Verwendung SELECT und zur SQL Sprache würden den Rahmen dieser Dokumentation sprengen. Informationen zur VerwendungSQL, die spezifisch für Athena sind, finden Sie unter Überlegungen und Einschränkungen für SQL Abfragen in Amazon Athena undSQLAbfragen in Amazon Athena ausführen. 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.

Syntax

[ 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 Aussagen müssen in doppelte Anführungszeichen gesetzt werden. Weitere Informationen finden Sie unter Reservierte Schlüsselwörter zur Escape-Funktion in Anweisungen SQL SELECT.

Parameter

[WITHwith_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 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|] Ausdruck_auswählen DISTINCT

select_expression legt die auszuwählenden Zeilen fest. A select_expression kann eines der folgenden Formate verwenden:

expression [ [ AS ] column_alias ] [, ...]
row_expression.* [ AS ( column_alias [, ...] ) ]
relation.*
*
  • Die expression [ [ AS ] column_alias ] Syntax spezifiziert eine Ausgabespalte. Die optionale [AS] column_alias Syntax gibt einen benutzerdefinierten Überschriftennamen an, der für die Spalte in der Ausgabe verwendet werden soll.

  • For row_expression.* [ AS ( column_alias [, ...] ) ] row_expression ist ein beliebiger Ausdruck eines DatentypsROW. Die Felder der Zeile definieren die Ausgabespalten, die im Ergebnis enthalten sein sollen.

  • Denn 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, in der sie durch den Auswahlausdruck spezifiziert wurden. Wenn ein Auswahlausdruck mehrere Spalten zurückgibt, folgt die Spaltenreihenfolge der Reihenfolge, die in der Quellrelation oder im Zeilentypausdruck verwendet wurde.

  • Wenn Spaltenaliase angegeben werden, überschreiben die Aliase bereits vorhandene Spalten- oder Zeilenfeldnamen. Wenn der Auswahlausdruck keine Spaltennamen enthält, werden anonyme Spaltennamen (,,_col2, ...) mit einem Nullindex in der _col0 Ausgabe _col1 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.

FROMfrom_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.

[Zustand] WHERE

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 Tool 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')
[GROUPVON [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.

[Bedingung] HAVING

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 undEXCEPT 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.

[ORDERBY-Ausdruck [ASC|DESC] [NULLSFIRST|] [,... NULLSLAST]]

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. Die Standardsortierreihenfolge ist aufsteigend (ASC). Die Standardnullsortierung ist NULLS LAST unabhängig von auf- oder absteigender Sortierreihenfolge.

[OFFSETzählen [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[zählen |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] (Prozentsatz)

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

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?.

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

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

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 SQLAbfragen in Amazon Athena ausführen
Mit SELECT eine Tabelle erstellen Erstellen Sie eine Tabelle aus Abfrageergebnissen (CTAS)
Einfügen von Daten aus einer SELECT-Abfrage in eine andere Tabelle INSERT INTO
Integrierte Funktionen in SELECT-Anweisungen verwenden Funktionen in Amazon Athena
Verwenden von benutzerdefinierten Funktionen in SELECT-Anweisungen Abfrage mit benutzerdefinierten Funktionen
Metadaten des Datenkatalogs abfragen Fragen Sie die ab AWS Glue Data Catalog