1- # SELECT 概况
1+ # Query 语句
22
3- ## Syntax
4-
5- ### Syntax Notation
3+ ## Syntax Notation
64
75- ` [ expr ] ` : 中括号,可选部分
86- ` {} ` : 手动分组
119- 大写变量,例如 ` WITH ` , 表示 SQL 关键词 "WITH"
1210- 小写变量, 例如 ` query ` , 可以拓展成特定语法结构
1311
14- ### Select Statement
12+ ## Syntax
1513
1614``` yacc
1715query_statement:
@@ -38,7 +36,7 @@ non_recursive_cte:
3836 cte_name AS ( query )
3937
4038set_operator:
41- UNION ALL
39+ UNION { ALL | DISTINCT }
4240
4341from_item:
4442 table_name [ as_alias ]
@@ -100,19 +98,21 @@ select_expression:
10098 expression [ [ AS ] alias ]
10199```
102100
103- ## SELECT语句元素
101+ ## Query 语句元素
104102
105103| SELECT语句元素 | 离线模式 | 在线预览模式 | 在线请求模式 | 说明 |
106104| :-----------------------------------------------| --------- | ------------ | ------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
107- | [ ` SELECT ` Clause] ( #selectexprlist ) | ** `` ✓ `` ** | ** `` ✓ `` ** | ** `` ✓ `` ** | 投影操作列表,一般包括列名、表达式,或者是用 ` * ` 表示全部列 |
108- | [ ` FROM ` Clause] ( #tablerefs ) | ** `` ✓ `` ** | ** `` ✓ `` ** | ** `` ✓ `` ** | 表示数据来源,数据来源可以是一个表(` select * from t; ` )或者是多个表 LAST JOIN (见[ JOIN 子句] ( ../dql/JOIN_CLAUSE.md ) ) 或者是0个表 ( ` select 1+1; ` ),详见[ NO_TABLE SELECT] ( ../dql/NO_TABLE_SELECT_CLAUSE.md ) |
109- | [ ` JOIN ` Clause] ( ../dql/JOIN_CLAUSE.md ) | ** `` ✓ `` ** | ** `` x `` ** | ** `` ✓ `` ** | 表示数据来源多个表JOIN。OpenMLDB目前仅支持LAST JOIN。在线请求模式下,需要遵循[ Online Request下LAST JOIN的使用规范] ( ../deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md#在线请求模式下-last-join-的使用规范 ) |
110- | [ ` WHERE ` Clause] ( ../dql/WHERE_CLAUSE.md ) | | ** `` ✓ `` ** | | Where 子句用于设置过滤条件,查询结果中只会包含满足条件的数据。 |
111- | [ ` GROUP BY ` Clause] ( ../dql/GROUP_BY_CLAUSE.md ) | ** `` ✓ `` ** | ** `` ✓ `` ** | | Group By 子句用于对查询结果集进行分组。分组表达式列表仅支持简单列。 |
112- | [ ` HAVING ` Clause] ( ../dql/HAVING_CLAUSE.md ) | ** `` ✓ `` ** | ** `` ✓ `` ** | | Having 子句与 Where 子句作用类似.Having 子句过滤 GroupBy 后的各种数据,Where 子句在聚合前进行过滤。 |
105+ | [ ` WITH ` Clause] ( ./WITH_CLAUSE.md ) | ** `` ✓ `` ** | ** `` ✓ `` ** | ** `` ✓ `` ** | |
106+ | [ ` SELECT ` list] ( #selectexprlist ) | ** `` ✓ `` ** | ** `` ✓ `` ** | ** `` ✓ `` ** | 投影操作列表,一般包括列名、表达式,或者是用 ` * ` 表示全部列 |
107+ | [ ` FROM ` Clause] ( #from-clause ) | ** `` ✓ `` ** | ** `` ✓ `` ** | ** `` ✓ `` ** | 表示数据来源 |
108+ | [ ` JOIN ` Operation] ( ../dql/JOIN_CLAUSE.md ) | ** `` ✓ `` ** | ** `` x `` ** | ** `` ✓ `` ** | 表示数据来源多个表JOIN。OpenMLDB目前仅支持LAST JOIN。在线请求模式下,需要遵循[ Online Request下LAST JOIN的使用规范] ( ../deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md#在线请求模式下-last-join-的使用规范 ) |
109+ | [ ` SET ` Operation] ( ./SET_OPERATION.md ) | ** `` ✓ `` ** | ** `` ✓ `` ** | ** `` ✓ `` ** | 只支持 UNION, 在线支持 UNION ALL, 离线支持 UNION ALL/DISTINCT |
110+ | [ ` WHERE ` Clause] ( ../dql/WHERE_CLAUSE.md ) | ** `` x `` ** | ** `` ✓ `` ** | ** `` x `` ** | Where 子句用于设置过滤条件,查询结果中只会包含满足条件的数据。 |
111+ | [ ` GROUP BY ` Clause] ( ../dql/GROUP_BY_CLAUSE.md ) | ** `` ✓ `` ** | ** `` ✓ `` ** | ** `` x `` ** | Group By 子句用于对查询结果集进行分组。分组表达式列表仅支持简单列。 |
112+ | [ ` HAVING ` Clause] ( ../dql/HAVING_CLAUSE.md ) | ** `` ✓ `` ** | ** `` ✓ `` ** | ** `` x `` ** | Having 子句与 Where 子句作用类似.Having 子句过滤 GroupBy 后的各种数据,Where 子句在聚合前进行过滤。 |
113113| [ ` WINDOW ` Clause] ( ../dql/WINDOW_CLAUSE.md ) | ** `` ✓ `` ** | ** `` ✓ `` ** | ** `` ✓ `` ** | 窗口子句用于定义一个或者若干个窗口。窗口可以是有名或者匿名的。用户可以在窗口上调用聚合函数来进行一些分析型计算的操作(``` sql agg_func() over window_name ``` )。线请求模式下,需要遵循[ Online Request下Window的使用规范] ( ../deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md#在线请求模式下window的使用规范 ) |
114- | [ ` LIMIT ` Clause] ( ../dql/LIMIT_CLAUSE.md ) | ** `` ✓ `` ** | ** `` ✓ `` ** | | Limit子句用于限制返回的结果条数。目前Limit仅支持接受一个参数,表示返回数据的最大行数。 |
115- | ` ORDER BY ` Clause | | | | 标准SQL还支持Order By子句。OpenMLDB目前尚未支持Order子句。例如,查询语句` SELECT * from t1 ORDER BY col1; ` 在OpenMLDB中不被支持。 |
114+ | [ ` LIMIT ` Clause] ( ../dql/LIMIT_CLAUSE.md ) | ** `` ✓ `` ** | ** `` ✓ `` ** | ** `` x `` ** | Limit子句用于限制返回的结果条数。目前Limit仅支持接受一个参数,表示返回数据的最大行数。 |
115+ | ` ORDER BY ` Clause | ** `` x `` ** | ** `` x `` ** | ** `` x `` ** | 标准SQL还支持Order By子句。OpenMLDB目前尚未支持Order子句。例如,查询语句` SELECT * from t1 ORDER BY col1; ` 在OpenMLDB中不被支持。 |
116116
117117``` {warning}
118118在线模式或单机版的select,可能无法获取完整数据。
@@ -123,18 +123,28 @@ select_expression:
123123在线模式或单机版都不适合做大数据的扫描,推荐使用集群版的离线模式。如果一定要调大扫描量,需要对每台tablet配置`--scan_max_bytes_size=xxx`,并重启tablet生效。
124124```
125125
126- ## 离线同步模式 SELECT
126+ ## FROM Clause
127+
128+ FROM子句指定了查询的原始数据来源,即我们要在哪些表中查找所需的数据。它也会定义这些数据源间的联系,比如是否通过某些字段建立连接查询,从而将原本分散在多个表中的数据整合在一起,形成一个单一的数据集以供查询操作使用.
129+
130+ FROM 子句的来源可以是:
131+
132+ - 表名或者 Common Table Expression (CTE), 同名情况下 CTE 优先级更高
133+ - JOIN 操作, OpenMLDB 支持 LEFT JOIN 和 LAST JOIN
134+ - 任意子查询, 被括在括号中
135+
136+ ## 离线同步模式 Query
127137
128- 设置` SET @@sync_job=true ` 后的` SELECT ` 语句,就是离线同步模式下的` SELECT ` 。在这个状态下的` SELECT ` 会展示结果到CLI(不建议在SDK中使用这种模式,不会得到正常的ResultSet)。
138+ 设置` SET @@sync_job=true ` 后的 Query 语句,就是离线同步模式下的 Query 。在这个状态下的 Query 会展示结果到CLI(不建议在SDK中使用这种模式,不会得到正常的ResultSet)。
129139
130- 原理:SELECT执行完成后各worker通过HTTP发送结果到TaskManager ,TaskManager收集各个结果分片并保存到本地文件系统中。结果收集完成后,再从本地文件系统读取,读取后删除本地缓存的结果。
140+ 原理:Query 执行完成后各worker通过HTTP发送结果到TaskManager ,TaskManager收集各个结果分片并保存到本地文件系统中。结果收集完成后,再从本地文件系统读取,读取后删除本地缓存的结果。
131141
132142``` {attention}
133- 离线同步模式 SELECT 仅用于展示,不保证结果完整。整个结果收集中可能出现文件写入失败,丢失HTTP包等问题,我们允许结果缺失。
143+ 离线同步模式 Query 仅用于展示,不保证结果完整。整个结果收集中可能出现文件写入失败,丢失HTTP包等问题,我们允许结果缺失。
134144```
135145### 相关配置参数
136146
137- TaskManager配置` batch.job.result.max.wait.time ` ,在` SELECT ` job完成后,我们会等待所有结果被收集并保存在TaskManager所在主机的文件系统中,超过这一时间将结束等待,返回错误。如果认为整个收集结果的过程没有问题,仅仅是等待时间不够,可以调大这一配置项,单位为ms,默认为10min。
147+ TaskManager配置` batch.job.result.max.wait.time ` ,在 Query job完成后,我们会等待所有结果被收集并保存在TaskManager所在主机的文件系统中,超过这一时间将结束等待,返回错误。如果认为整个收集结果的过程没有问题,仅仅是等待时间不够,可以调大这一配置项,单位为ms,默认为10min。
138148
139149Batch配置(spark.default.conf):
140150- spark.openmldb.savejobresult.rowperpost: 为了防止HTTP传送过多数据,我们对数据进行切割,默认为16000行。如果单行数据量较大,可以调小该值。
0 commit comments