View a markdown version of this page

SELECT 子句 - Amazon Kinesis Data Analytics SQL 参考

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

SELECT 子句

<select-clause> 在 STREAM 关键字之后使用以下项目:

 <select-list> :=    <select-item> { , <select-item> }... <select-item> :=    <select-expression> [ [ AS ] <simple-identifier> ] <simple-identifier> :=    <identifier> | <quoted-identifier> <select-expression> :=    <identifier> . *  | *  | <expression>

Expressions

这些表达式中的每一个都可以是:

  • 标量表达式

  • 聚合函数的调用,前提是这是聚合查询(请参阅 GROUP BY 子句

  • 分析函数的调用,前提是这是聚合查询

  • 通配符表达式 * 扩展到 FROM 子句中所有关系的所有列

  • 通配符表达式别名。* 扩展到由关系命名的别名的所有列

  • ROWTIME

  • a CASE 表达式

可以使用 AS column_name 语法为每个表达式都分配一个别名。这是此查询的结果集中的列名称。如果此查询位于封闭查询的 FROM 子句中,则此名称将用于引用该列。在流引用的 AS 子句中指定的列数必须与原始流中定义的列数相匹配。

Amazon Kinesis Data Analytics 有一些简单的规则可以派生没有别名的表达式的别名。列表达式的默认别名是列的名称:例如,默认别名 EMPS.DEPTNO 为 DEPTNO。其他表达式则使用像 EXPR$0 这样的别名。您不应假设系统每次都会生成相同的别名。

在流式查询中,将列的别名设置为 ROWTIME 具有特殊含义:有关更多信息,请参阅 ROWTIME

注意

所有流都有一个名为 ROWTIME 的隐式列。此列可能会影响你对现在支持的语法 “AS t (c1, c2,...)” 的使用。 SQL:2008以前在 FROM 子句中您只能编写

SELECT ... FROM r1 AS t1 JOIN r2 as t2

但是 t1 和 t2 的列将与 r1 和 t2 的列相同。AS 语法允许您通过编写以下内容来重命名 r1 的列:

SELECT ... FROM r1 AS t1(a, b, c)

(r1 必须恰好有 3 列才能使用此语法)。

如果 r1 是流,则隐式包含 ROWTIME,但它不算作一列。因此,如果一个流有 3 列而不包含 ROWTIME,则不能通过指定 4 列来重命名 ROWTIME。例如,如果 Bids 流有三列,则以下代码无效。

SELECT STREAM * FROM Bids (a, b, c, d)

重命名另一列 ROWTIME 也是无效的,如以下示例所示。

SELECT STREAM * FROM Bids (ROWTIME, a, b)

因为这意味着将另一列重命名为 ROWTIME。有关表达式和文字的更多信息,请参阅表达式和文字

CASE 表达式

CASE 表达式允许您为每个此类测试指定一组离散测试表达式和特定的返回值(表达式)。每个测试表达式都在 WHEN 子句中指定;每个返回值表达式都在相应的 THEN 子句中指定。可以指定多个这样的 WHEN-THEN 对。

如果您在第一个 WHEN 子句之前指定比较测试表达式,则会将 WHEN 子句中的每个表达式与该比较测试表达式进行比较。第一个匹配比较测试表达式的值会导致返回其相应的 THEN 子句的返回值。如果没有 WHEN 子句表达式与比较测试表达式匹配,则除非指定了 ELSE 子句,否则返回值为 null,在这种情况下,将返回该 ELSE 子句中的返回值。

如果您没有在第一个 WHEN 子句之前指定比较测试表达式,则会计算 WHEN 子句中的每个表达式(从左到右),而第一个为 true 的表达式会导致返回其对应的 THEN 子句的返回值。如果没有 WHEN 子句表达式为 true,则除非指定了 ELSE 子句,否则返回值为 null,在这种情况下,将返回该 ELSE 子句中的返回值。

VALUES

VALUES 使用表达式来计算一个或多个行值,通常用于较大的命令中。创建多行时,VALUES 子句必须为每行指定相同数量的元素。生成的表列数据类型派生自该列中出现的表达式的显式或推断类型。只要允许 SELECT,语法上都允许使用 VALUES。另请参阅本指南“查询”主题中对 VALUES 作为运算符的讨论。

语法

VALUES ( expression [, ...] ) [, ...]    [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]

VALUES 是一个 SQL 运算符,与 SELECT 和 UNION 相同,支持以下类型的操作:

  • 您可以编写 VALUES (1)、(2) 来返回两行,每行都有一个匿名列。

  • 您可以编写 VALUES (1, 'a')、(2, 'b') 来返回两行,每行都有两列。

  • 您可以使用 AS 命名列,如以下示例所示:

SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(x, y)

VALUES 最重要的用法是在 INSERT 语句中插入一行:

 INSERT INTO emps (empno, name, deptno, gender)    VALUES (107, 'Jane Costa', 22, 'F');

但是,您也可以插入多行:

  INSERT INTO Trades (ticker, price, amount)     VALUES ('MSFT', 30.5, 1000),            ('ORCL', 20.25, 2000);

在 SELECT 语句的 FROM 子句中使用 VALUES 时,必须将整个 VALUES 子句括在圆括号中,这与其作为查询而不是表表达式运行的事实一致。有关其他示例,请参阅 FROM 子句

注意

在流中使用 INSERT 需要考虑行时间、数据泵和 INSERT EXPEDITED 等其他一些注意事项。有关更多信息,请参阅 INSERT