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

    具有可选指定名称的表达式。

    • expression

      计算得出值的一个或多个值、运算符和 SQL 函数的组合。

    • column_alias

      为表达式结果命名的可选列标识符。 如果未提供 column_alias,Databricks SQL 会派生一个。

  • star_clause

    一种简略写法,可用于命名 FROM 子句中的所有可引用列,或 FROM 子句中特定表引用的列或字段。

  • table_reference

    SELECT 的输入源。 通过使用引用之前的关键字,可以将此输入引用转换为流式STREAM引用。

  • LATERAL VIEW

    与生成器函数(例如 EXPLODE)结合使用,将生成包含一个或多个行的虚拟表。 LATERAL VIEW 将行应用于每个原始输出行。

    在 Databricks SQL 中,以及从 Databricks Runtime 12.2 开始,此子句已弃用。 应以 table_reference 的形式调用表值生成器函数。

  • WHERE

    根据提供的谓词筛选 FROM 子句的结果。

  • GROUP BY

    用于对行进行分组的表达式。 它与聚合函数(MINMAXCOUNTSUMAVG)结合使用,基于分组表达式和每个组中的聚合值对行进行分组。 将 FILTER 子句附加到聚合函数时,只会将匹配的行传递给该函数。

  • HAVING

    用于筛选由 GROUP BY 生成的行的谓词。 HAVING 子句用于在执行分组后对行进行筛选。 如果指定的 HAVING 不带 GROUP BY,则表示不带分组表达式的 GROUP BY(全局聚合)。

  • QUALIFY

    用于筛选窗口函数结果的谓词。 要使用 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_expressionversion 都不能是子查询。

示例

> SELECT * FROM events TIMESTAMP AS OF '2018-10-18T22:15:12.013Z'

> SELECT * FROM delta.`/mnt/delta/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