# 查询语言元素 Kuiper 提供了用于构建查询的各种元素。 总结如下。 | 元素 | 总结 | | --------------------- | ------------------------------------------------------------ | | [SELECT](#SELECT) | SELECT 用于从输入流中检索行,并允许从 Kuiper 中的一个或多个输入流中选择一个或多个列。 | | [FROM](#FROM) | FROM 指定输入流。 任何 SELECT 语句始终需要 FROM 子句。 | | [JOIN](#JOIN) | JOIN 用于合并来自两个或更多输入流的记录。 JOIN 包括 LEFT,RIGHT,FULL 和 CROSS。 | | [WHERE](#WHERE) | WHERE 指定查询返回的行的搜索条件。 | | [GROUP BY](#GROUP BY) | GROUP BY 将一组选定的行分组为一组汇总行,这些汇总行按一个或多个列或表达式的值分组。 | | [ORDER BY](#ORDER BY) | 按一列或多列的值对行进行排序。 | | [HAVING](#HAVING) | HAVING 为组或集合指定搜索条件。 HAVING 只能与 SELECT 表达式一起使用。 | | | | ## SELECT 从输入流中检索行,并允许从 Kuiper 中的一个或多个输入流中选择一个或多个列。 ### 句法 ```sql SELECT * | [source_stream.]column_name [AS column_alias] | expression ``` ### 参数 指定应返回 FROM 子句中所有输入流的所有列。 列由输入源返回,如 FROM 子句中指定的那样,并按它们在传入流中存在的顺序或由 ORDER BY 子句指定的顺序返回。 **\*** 从源流中选择所有字段。 **source_stream** 源流名称或别名。 **column_name** 要返回的列的名称。 如果要指定的列是嵌入式嵌套记录类型,则使用[JSON 表达式](json_expr.md)引用嵌入式列。 **column_alias** 用替代名称替换查询结果集中的列名称。 别名还用于指定表达式结果的名称。column_alias 不能在 WHERE、GROUP BY 或 HAVING 子句中使用。 **表达式** 表达式是一个常量、函数、或者由一个或多个运算符连接的列名、常量和函数的任意组合。 ## FROM 指定输入流。 任何 SELECT 语句始终需要 FROM 子句。 ### Syntax ```sql FROM source_stream | source_stream AS source_stream_alias ``` ### 参数 **source_stream | source_stream_alias** 输入流名称或别名。 ## JOIN JOIN 用于合并来自两个或更多输入流的记录。 JOIN 包括 LEFT,RIGHT,FULL 和CROSS。 ### 句法 ```sql LEFT | RIGHT | FULL | CROSS JOIN source_stream | source_stream AS source_stream_alias ON .column_name =.column_name ``` ### 参数 **LEFT** LEFT JOIN 关键字从左流(stream1)返回所有记录,并从右流(stream2)返回匹配的记录。 如果不匹配,则结果从右侧为 NULL。 ```sql SELECT column_name(s) FROM stream1 LEFT JOIN stream2 ON stream1.column_name = stream2.column_name; ``` **RIGHT** JOIN 关键字从右侧流(stream2)返回所有记录,并从左侧流(stream1)返回匹配的记录。 如果没有匹配项,则结果从左侧为 NULL。 ```sql SELECT column_name(s) FROM stream1 RIGHT JOIN stream2 ON stream1.column_name = stream2.column_name; ``` **FULL** 当左(stream1)或右(stream2)表记录匹配时,FULL JOIN 关键字返回所有记录。 **注意:** FULL JOIN 可能返回较大的结果集! ```sql SELECT column_name(s) FROM stream1 FULL JOIN stream2 ON stream1.column_name = stream2.column_name WHERE condition; ``` **CROSS** CROSS JOIN 用于将第一个流(stream1)的每一行与第二个流(stream2)的每一行组合。 这也称为笛卡尔联接,因为它从联接表返回行集的笛卡尔乘积。 假设在 stream1中有 m 行,在stream2 中有 n 行,那么 CROSS JOIN 的结果将返回 m * n 行。 **注意:** CROSS JOIN 可能返回非常大的结果集! ```sql SELECT column_name(s) FROM stream1 CROSS OUTER JOIN stream2 ON stream1.column_name = stream2.column_name WHERE condition; ``` **source_stream | source_stream_alias** 要连接的输入流名称或别名。 **column_name** 要返回的列的名称。 如果要指定的列是嵌入式嵌套记录类型,则使用[JSON 表达式](json_expr.md)引用嵌入式列。 ## WHERE WHERE 指定查询返回的行的搜索条件。 WHERE 子句仅用于提取满足指定条件的那些记录。 ### 句法 ``` WHERE ::= { | ( ) } [ { AND | OR } { | ( ) } ] [ ,...n ] ::= { expression { = | < > | ! = | > | > = | < | < = } expression ``` ### 参数 表达式是一个常量、函数、及由一个或多个运算符连接的列名、常量和函数的任意组合。 **< search_condition >** 为SELECT语句或查询表达式的结果集中返回的行指定条件。搜索条件中可以包含的谓词数量没有限制。 **AND** 组合两个条件,当两个条件都为真时计算为真。 **OR** 组合两个条件,当任一条件为真时计算为真。 **< predicate >** 返回 TRUE 或 FALSE 的表达式。 **表达式** 是列名、常数、函数、变量、标量子查询,或由一个或多个运算符或子查询连接的列名、常数和函数的任意组合。表达式也可以包含 CASE 表达式。 **=** 用于测试两个表达式之间相等性的运算符。 **<>** 用于测试两个表达式不相等的条件的运算符。 **!=** 用于测试两个表达式不相等的条件的运算符。 **>** 用于测试一个表达式大于另一个表达式的条件的运算符。 **>=** 用于测试一个表达式大于或等于另一个表达式的条件的运算符。 **<** 用于测试一个表达式小于另一个表达式的条件的运算符。 **<=** 用于测试一个表达式小于或等于另一个表达式的条件的运算符。 ```sql SELECT column1, column2, ... FROM table_name WHERE condition; ``` ## GROUP BY GROUP BY 将一组选定的行分组为一组汇总行,这些汇总行按一个或多个列或表达式的值分组。 ### 句法 ```sql GROUP BY ::= [ ,...n ] | ::= ``` ## 参数 **** 指定任何支持Kuiper的窗口,有关详细信息,请参阅 [windows](windows.md) 。 **< column_expression >** 执行分组操作的列的表达式或名称。列表达式不能包含在选择列表中定义的列别名。 ```sql SELECT column_name(s) FROM stream1 GROUP BY column_name ``` ### HAVING 指定组或集合的搜索条件。 HAVING 只能与 SELECT 表达式一起使用。 HAVING 通常在 GROUP BY 子句中使用。 如果不使用 GROUP BY,则 HAVING 的行为类似于WHERE 子句。 #### 句法 ```sql [ HAVING ] ``` #### 参数 **< search_condition >** 指定要满足的组或集合的搜索条件。 ```sql SELECT temp AS t, name FROM topic/sensor1 WHERE name = "dname" GROUP BY name HAVING count(name) > 3 ``` ## ORDER BY 按一列或多列的值对行进行排序。 ### 句法 ```sql ORDER BY column1, column2, ... ASC|DESC ``` sql 中的 ORDER BY 语句用于根据一个或多个列对获取的数据进行升序或降序排序。 - 默认情况下,ORDER BY 以**升序对数据进行排序。** - 关键字 DESC 用于按降序排序数据,关键字 ASC 用于按升序排序。 ### 参数 **ASC** 按升序对数据进行排序。 **DESC** 按降对数据进行排序。 ```sql SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|DESC; ``` ## 使用保留字或特殊字符 如果你想在 SQL 或者流管理中使用保留关键字,或者特殊字符,请参考 [Kuiper 词法元素](lexical_elements.md).