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

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

SELECT

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

注意

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

Synopsis

[ WITH with_query [, ...] ] SELECT [ ALL | DISTINCT ] select_expression [, ...] [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ] [ HAVING condition ] [ UNION [ ALL | DISTINCT ] union_query ] [ 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 [ ALL | DISTINCT ] union_query] ]

结合多个结果 SELECT 单个查询中的声明。ALLDISTINCT 控制哪些行包含在最终结果集中。

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

DISTINCT 仅导致组合结果集中包含唯一行。默认值为 DISTINCT

将会按从左到右的顺序处理多个 UNION 子句,除非您使用圆括号显式定义处理顺序。

[ 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表中查看AmazonS3源文件?.

转义单引号

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

Select 'O''Reilly'

Results

O'Reilly

其他 资源

有关使用 SELECT 声明 Athena,请参阅以下资源。

有关此信息的信息 查看此项
运行查询 Athena 使用 Amazon Athena 运行 SQL 查询
使用 SELECT 创建表格 从查询结果创建表 (CTAS)
从A插入数据 SELECT 查询其他表格 INSERT INTO
使用内置功能 SELECT 声明 Amazon Athena 中的 Presto 函数
使用用户定义的功能 SELECT 声明 使用用户定义的函数进行查询(预览)
查询 Data Catalog 元数据 查询 AWS Glue 数据目录