SELECT - Amazon Athena
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

SELECT

从零个或多个表中检索数据行。

注意

本主题提供了摘要信息以供参考。本文档不包含有关使用 SELECT 和 SQL 语言的综合信息。有关使用特定于 Athena 的 SQL 的信息,请参阅 Amazon Athena 中 SQL 查询的注意事项和限制使用 Amazon Athena 运行 SQL 查询. 有关在 Athena 中查询数据的帮助,请参阅入门

Synopsis

[ 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] [, ...] ] [ LIMIT [ count | ALL ] ]
注意

SQL SELECT 语句中的保留字必须用双引号括起来。有关更多信息,请参阅 SQL SELECT 语句中保留关键字的列表.

Parameters

[ WITH with_query [, ....] ]

您可以使用 WITH 来展平嵌套查询或简化子查询。

不支持使用 WITH 子句创建递归查询。

WITH 子句在查询中位于 SELECT 列表之前,定义一个或多个子查询,以便在 SELECT 查询中使用。

每个子查询均定义一个临时表,与可在 FROM 子句中引用的视图定义类似。只有在查询运行时才使用这些表。

with_query 语法为:

subquery_table_name [ ( column_name [, ...] ) ] AS (subquery)

其中:

  • subquery_table_name 是临时表的唯一名称,该临时表用于定义 WITH 子句子查询的结果。每个 subquery 都必须具有一个可在 FROM 子句中引用的表名称。

  • column_name [, ...] 是可选的输出列名称列表。列名称数目必须等于或小于 定义的列数。subquery.

  • subquery 是任意查询语句。

[ ALL | DISTINCT ] select_expr

select_expr 确定要选择的行。

ALL 是默认值。使用 ALL 会被视为与省略它相同;将会选定所有列的所有行,并保留重复项。

当列包含重复值时,请使用 DISTINCT 仅返回不同的值。

FROM from_item [, ...]

指示要查询的输入,其中 from_item 可以是视图、联接构造或如下所述的子查询。

from_item 可以是:

  • table_name [ [ AS ] alias [ (column_alias [, ...]) ] ]

    其中,table_name 是要从中选择行的目标表的名称,alias 是要提供 SELECT 语句输出的名称,column_alias 定义指定 alias 的列。

-OR-

  • join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]

    其中,join_type 为以下值之一:

    • [ INNER ] JOIN

    • LEFT [ OUTER ] JOIN

    • RIGHT [ OUTER ] JOIN

    • FULL [ OUTER ] JOIN

    • CROSS JOIN

    • ON join_condition | USING (join_column [, ...]),其中,如果使用 join_condition,您可以为多个表中的联接键指定列名称;如果使用 join_column,则要求 join_column 在两个表中都存在。

[ WHERE condition ]

根据您指定的 condition 筛选结果。

[ GROUP BY [ ALL | DISTINCT ] grouping_expressions [, ...] ]

SELECT 语句的输出分成多个具有匹配值的行。

ALLDISTINCT 确定重复的分组集是否各自产生不同的输出行。如果省略,则会采用 ALL

grouping_expressions 允许您执行复杂的分组操作。

grouping_expressions 元素可以是对输入列执行的任何函数(如 SUMAVGCOUNT等),或是一个按位置选择输出列的序号(从 1 开始)。

GROUP BY 表达式可以按照不在 SELECT 语句的输出中显示的输入列名称对输出进行分组。

所有输出表达式都必须是存在于 GROUP BY 子句中的聚合函数或列。

您可以使用单个查询来执行需要聚合多个列集的分析。

这些复杂的分组操作不支持包含输入列的表达式。只允许使用列名或序号。

通常,您可以使用 UNION ALL 实现和这些 GROUP BY 操作相同的结果,但使用 GROUP BY 的查询具有一次读取数据的优点,而 UNION ALL 三次读取底层数据,因此可能会在数据源发生变化时造成不一致的结果。

GROUP BY CUBE 为给定的列集生成所有可能的分组集。GROUP BY ROLLUP 为给定的列集生成所有可能的小计。

[ HAVING condition ]

与聚合函数和 GROUP BY 子句一起使用。控制哪些组处于选中状态,从而消除不满足 condition 的组。 此筛选在计算组和聚合之后发生。

[ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] union_query]]

UNIONINTERSECTEXCEPT 将多个 SELECT 语句的结果合并到单个查询中。ALLDISTINCT 控制包含在最终结果集中的行的唯一性。

UNION 将从第一个查询生成的行与从第二个查询生成的行组合起来。为了消除重复项,UNION 会构建一个占用内存的哈希表。为了获得更好的性能,如果您的查询不需要消除重复项,请考虑使用 UNION ALL。将会按从左到右的顺序处理多个 UNION 子句,除非您使用圆括号显式定义处理顺序。

INTERSECT 仅返回第一个和第二个查询的结果中存在的行。

EXCEPT 返回第一个查询的结果中的行,不包括第二个查询找到的行。

ALL 会导致包含所有行,即使这些行是相同的。

DISTINCT 仅导致唯一行包含在组合结果集中。

[ ORDER BY expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST] [, ...] ]

按一个或多个输出 对结果集进行排序。expression.

当子句包含多个表达式时,将根据第一个 expression 对结果集进行排序。 然后,第二个 expression 应用于具有第一个表达式中的匹配值的行,依此类推。

每个 expression 可以指定 SELECT 中的输出列或按位置指定输出列的序号(从 1 开始)。

ORDER BY 将作为任何 GROUP BYHAVING 子句之后的最后一个步骤进行计算。ASCDESC 确定是按升序还是按降序对结果进行排序。

默认 null 排序是 NULLS LAST,无论是按升序还是按降序排序。

LIMIT [ count | ALL ]

将结果集中的行数限制为 countLIMIT ALL 与省略 LIMIT 子句相同。如果查询中没有 ORDER BY 子句,则结果是任意的。

TABLESAMPLE BERNOULLI | SYSTEM (percentage)

可选运算符,用于根据采样方法从表中选择行。

BERNOULLI 选择要位于表示例中的每个行(概率为 percentage)。 将扫描表的所有物理块,并根据样本 percentage 与在运行时计算的随机值之间的比较来跳过某些行。

借助 SYSTEM,表被划分成数据的逻辑段,而且表按此粒度采样。

将会选择特定段中的所有行,或者根据样本 percentage 和在运行时计算的随机值之间的比较来跳过该段。SYSTEM 采样取决于连接器。此方法不保证独立采样概率。

[ UNNEST (array_or_map) [WITH ORDINALITY] ]

展开数组或映射到关系。数组扩展到单个列中。映射将会扩展为两列(keyvalue).

您可以将 UNNEST 与多个参数一起使用,这些参数将扩展到多个列,其中的行数与最高基数参数相同。

其他列将使用空值填补。

WITH ORDINALITY 子句将序数列添加到末尾。

UNNEST 通常和 JOIN 一起使用,可以在 JOIN. 的左侧引用关系中的列。

获取 Amazon S3 中源数据的文件位置

要在表行中查看数据的 Amazon S3 文件位置,您可以在 "$path" 查询中使用 SELECT,如以下示例所示:

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

这将返回类似于下面的结果:

s3://awsexamplebucket/datasets_mytable/year=2019/data_file1.json

要返回表中数据的 S3 文件名路径的唯一排序列表,您可以使用 SELECT DISTINCTORDER BY,如以下示例所示。

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

要仅返回文件名而不指定路径,您可以将 "$path" 作为参数传递给 regexp_extract 函数,如以下示例所示。

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

要从特定文件返回数据,请在 WHERE 子句中指定该文件,如以下示例所示。

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

有关更多信息和示例,请参阅知识中心文章如何查看 Athena 表中的行的 Amazon S3 Amazon S3 。

转义单引号

要转义单引号,请在其前面加上另一个单引号,如以下示例所示。不要将这种情况与双引号混淆。

Select 'O''Reilly'

Results

O'Reilly

其他资源

有关在 SELECT 中使用 Athena 语句的更多信息,请参阅以下资源。

有关此信息 请参阅以下内容
在 Athena 中运行查询 使用 Amazon Athena 运行 SQL 查询
使用 SELECT 创建表 从查询结果创建表 (CTAS)
将数据从 SELECT 查询插入到另一个表 INSERT INTO
SELECT 语句中使用内置函数 中的 Presto 函数Amazon Athena
SELECT 语句中使用用户定义的函数 使用用户定义的函数进行查询(预览)
查询 Data Catalog 元数据 查询 AWS Glue 数据目录