SELECT
适用于: Databricks SQL Databricks Runtime
从一个或多个表格引用组成一个结果集。
SELECT
子句可以是查询的一部分,查询还包含常用表表达式 (CTE)、设置操作和各种其他子句。
语法
SELECT [ hints ] [ ALL | DISTINCT ] { named_expression | star_clause } [, ...]
FROM table_reference [, ...]
[ LATERAL VIEW clause ]
[ WHERE clause ]
[ GROUP BY clause ]
[ HAVING clause]
[ QUALIFY clause ]
named_expression
expression [ column_alias ]
star_clause
[ { table_name | view_name } . ] * [ except_clause ]
except_clause
EXCEPT ( { column_name | field_name } [, ...] )
参数
-
提示可帮助 Azure Databricks 优化器作出更好的计划决策。 Azure Databricks 支持使用会影响联接策略的选择和数据的重新分区的提示。
ALL
选择表格引用中的所有匹配行。 默认情况下启用。
DISTINCT
删除结果中的重复项后,从表格引用中选择所有匹配行。
named_expression
具有可选指定名称的表达式。
-
计算得出值的一个或多个值、运算符和 SQL 函数的组合。
column_alias
为表达式结果命名的可选列标识符。 如果未提供
column_alias
,Databricks SQL 会派生一个。
-
-
一种简略写法,可用于命名
FROM
子句中的所有可引用列,或FROM
子句中特定表引用的列或字段。 -
SELECT
的输入源。 通过使用引用之前的关键字,可以将此输入引用转换为流式STREAM
引用。 -
与生成器函数(例如
EXPLODE
)结合使用,将生成包含一个或多个行的虚拟表。LATERAL VIEW
将行应用于每个原始输出行。在 Databricks SQL 中,以及从 Databricks Runtime 12.2 开始,此子句已弃用。 应以 table_reference 的形式调用表值生成器函数。
-
根据提供的谓词筛选
FROM
子句的结果。 -
用于对行进行分组的表达式。 它与聚合函数(
MIN
、MAX
、COUNT
、SUM
、AVG
)结合使用,基于分组表达式和每个组中的聚合值对行进行分组。 将FILTER
子句附加到聚合函数时,只会将匹配的行传递给该函数。 -
用于筛选由
GROUP BY
生成的行的谓词。HAVING
子句用于在执行分组后对行进行筛选。 如果指定的HAVING
不带GROUP BY
,则表示不带分组表达式的GROUP BY
(全局聚合)。 -
用于筛选窗口函数结果的谓词。 要使用
QUALIFY
,SELECT 列表或 QUALIFY 子句中必须至少有一个窗口函数。
选择 Delta 表
除标准 SELECT
选项外,Delta 表还支持本部分中介绍的按时间顺序查看选项。 有关详细信息,请参阅使用 Delta Lake 表历史记录。
AS OF
语法
table_identifier TIMESTAMP AS OF timestamp_expression
table_identifier VERSION AS OF version
timestamp_expression
可以是下列项中的任意一项:'2018-10-18T22:15:12.013Z'
,即可以强制转换为时间戳的字符串cast('2018-10-18 13:36:32 CEST' as timestamp)
'2018-10-18'
,即日期字符串current_timestamp() - interval 12 hours
date_sub(current_date(), 1)
- 本身就是时间戳或可强制转换为时间戳的任何其他表达式
version
是可以从DESCRIBE HISTORY table_spec
的输出中获取的 long 值。
timestamp_expression
和 version
都不能是子查询。
示例
> SELECT * FROM events TIMESTAMP AS OF '2018-10-18T22:15:12.013Z'
> SELECT * FROM events VERSION AS OF 123
@
语法
使用 @
语法来指定时间戳或版本。 时间戳必须采用 yyyyMMddHHmmssSSS
格式。 你可以通过在版本前附加一个 v
在 @
后指定版本。 例如,若要查询表 events
的版本 123
,请指定 events@v123
。
示例
> SELECT * FROM events@20190101000000000
> SELECT * FROM events@v123
示例
-- select all referencable columns from all tables
> SELECT * FROM VALUES(1, 2) AS t1(c1, c2), VALUES(3, 4) AS t2(c3, c4);
1 2 3 4
-- select all referencable columns from one table
> SELECT t2.* FROM VALUES(1, 2) AS t1(c1, c2), VALUES(3, 4) AS t2(c3, c4);
3 4
-- select all referencable columns from all tables except t2.c4
> SELECT * EXCEPT(c4) FROM VALUES(1, 2) AS t1(c1, c2), VALUES(3, 4) AS t2(c3, c4);
1 2 3
-- select all referencable columns from a table, except a nested field.
> SELECT * EXCEPT(c2.b) FROM VALUES(1, named_struct('a', 2, 'b', 3)) AS t(c1, c2);
1 { "a" : 2 }
-- Removing all fields results in an empty struct
> SELECT * EXCEPT(c2.b, c2.a) FROM VALUES(1, named_struct('a', 2, 'b', 3)) AS t(c1, c2);
1 { }
-- Overlapping names result in an error
> SELECT * EXCEPT(c2, c2.a) FROM VALUES(1, named_struct('a', 2, 'b', 3)) AS t(c1, c2);
Error: EXCEPT_OVERLAPPING_COLUMNS