本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
查询
语法
<query> := <select> | <query> <set-operator> [ ALL ] <query> | VALUES <row-constructor> { , <row-constructor> }... | '(' <query> ')' <set-operator> := EXCEPT | INTERSECT | UNION <row-constructor> := [ ROW ] ( <expression> { , <expression> }... )
选择
上图中的选择框代表任何 SELECT 命令;该命令在其自己的页面上有详细描述。
集合运算符(除外、相交、联合)
集合运算符使用集合运算组合查询生成的行:
-
EXCEPT 返回第一个集合中但不在第二个集合中的所有行
-
INTERSECT 返回第一组和第二组中的所有行
-
UNION 返回任一集合中的所有行
在所有情况下,这两个集合的列数必须相同,并且列类型必须与赋值兼容。生成的关系的列名是第一个查询的列名。
使用 ALL 关键字后,运算符将使用数学上的多重集合的语义,这意味着不会消除重复的行。例如,如果特定行在第一个集合中出现 5 次,在第二个集合中出现 2 次,则 UNION ALL 将发出行 3 + 2 = 5 次。
EXCEPT 或 INTERSECT 目前不支持 ALL。
所有运算符都是左关联运算符,INTERSECT 的优先级高于优先级相同的 EXCEPT 或 UNION。要覆盖默认优先级,可以使用括号。例如:
SELECT * FROM a UNION SELECT * FROM b INTERSECT SELECT * FROM c EXCEPT SELECT * FROM d EXCEPT SELECT * FROM E
相当于:
( ( SELECT * FROM a UNION ( SELECT * FROM b INTERSECT SELECT * FROM c) ) EXCEPT SELECT * FROM d ) EXCEPT SELECT * FROM e
该示例等效于命令
UNION ALL 是唯一可以应用于直播的集合运算符。运算符的两端都必须是流;如果一端是流而另一端是关系,则是错误的。
例如,以下查询会生成一系列通过电话或网络接到的订单:
SELECT STREAM * FROM PhoneOrders UNION ALL SELECT STREAM * FROM WebOrders
行效于命令。流式传输 UNION ALL 发出的行的行时间与输入行的时间戳相同。
行时间边界:行时间边界是关于流的未来内容的断言。它指出流中的下一行将具有不早于边界值的 ROWTIME。例如,如果行时间边界是 2018-12-0223:23:07,则这告诉系统下一行将不早于 2018-12-0223:23:07 到达。行时间边界可用于管理数据流中的间隙,例如证券交易所过夜的间隙。
Amazon Kinesis Data Analytics 通过根据时间戳合并传入的行来确保 ROWTIME 列升序。如果第一个集合的行带有时间戳为 10:00 和 10:30,而第二组仅达到 10:15,则 Kinesis Data Analytics 会暂停第一组并等待第二组达到 10:30。在这种情况下,如果第二个集合的生成者发送一个行时间边界,那将是有利的。
值运算符
VALUES 运算符在查询中表示常量关系。(另请参阅本指南 SELECT 主题中对值的讨论。)
VALUES 可以用作顶级查询,如下所示:
VALUES 1 + 2 > 3; EXPR$0 ====== FALSE VALUES (42, 'Fred'), (34, 'Wilma'); EXPR$0 EXPR$1 ====== ====== 42 Fred 34 Wilma
请注意,系统已为匿名表达式生成了任意列名。您可以通过将 VALUES 放入子查询并使用 AS 子句来分配列名:
SELECT * FROM ( VALUES (42, 'Fred'), (34, 'Wilma')) AS t (age, name); AGE NAME === ===== 42 Fred 34 Wilma