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

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

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元素可以是任何函数,例如SUMAVG,或者COUNT,对输入列执行。

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

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

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

Athena 支持使用GROUPING SETSCUBEROLLUPGROUP BY GROUPING SETS指定要分组的多个列表。GROUP BY CUBE为给定的列集生成所有可能的分组集。GROUP BY ROLLUP为给定的列集生成所有可能的小计。复杂的分组操作不支持对由输入列组成的表达式进行分组。只允许使用列名。

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

[ HAVING condition ]

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

[{联盟 | 交叉 | 除了} [全部 | 不同] union_query]]]]

UNIONINTERSECT, 和EXCEPT将多个结果结合在一起SELECT语句转换为单个查询。ALL或者DISTINCT控制包含在最终结果集中的行的唯一性。

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

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

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

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

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

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

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

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

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

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

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

LIMIT [ count | ALL ]

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

表样本 [伯努利 | 系统] (百分比)

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

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'

有关更多信息以及示例,请参阅知识中心文章如何在 Amazon S3 源文件中查找 Athena 表中的某行?

转义单引号

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

Select 'O''Reilly'

Results

O'Reilly

其他资源

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

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