diff --git a/docs/zh/openmldb_sql/deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md b/docs/zh/openmldb_sql/deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md
index 7a4a8501490..1bf5ac50f94 100644
--- a/docs/zh/openmldb_sql/deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md
+++ b/docs/zh/openmldb_sql/deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md
@@ -70,6 +70,7 @@ SELECT substr(COL7, 3, 6) FROM t1;
- **OpenMLDB >= 0.8.0** 带 WHERE 条件过滤的简单列筛选 ( 例如 `select * from tb where id > 10`)
- **[ALPHA] OpenMLDB >= 0.8.4** 右表是带 LAST JOIN 的子查询 `subquery`, 要求 `subquery` 最左的表能被 JOIN 条件优化, `subquery`剩余表能被自身 LAST JOIN 的 JOIN 条件优化
- **[ALPHA] OpenMLDB >= 0.8.4** LEFT JOIN. 要求 LEFT JOIN 的右表能被 LEFT JOIN 条件优化, LEFT JOIN 的左表能被上层的 LAST JOIN 条件优化
+ - **[ALPHA] OpenMLDB >= 0.8.5** UNION ALL query. 要求 UNION ALL 内的每一个 query 都可以被 LAST JOIN 的条件优化
**Example: 支持上线的 `LAST JOIN` 语句范例**
创建两张表以供后续`LAST JOIN`。
diff --git a/docs/zh/openmldb_sql/dql/JOIN_CLAUSE.md b/docs/zh/openmldb_sql/dql/JOIN_CLAUSE.md
index 64058ab1917..00324c83af8 100644
--- a/docs/zh/openmldb_sql/dql/JOIN_CLAUSE.md
+++ b/docs/zh/openmldb_sql/dql/JOIN_CLAUSE.md
@@ -48,7 +48,7 @@ SELECT ... FROM t1 LEFT JOIN t2 ON expression;
| SELECT语句元素 | 离线模式 | 在线预览模式 | 在线请求模式 | 说明 |
| :--------------------------------------------- | --------- | ------------ | ------------ |:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| LAST JOIN | **``✓``** | **``x``** | **``✓``** | 表示数据来源多个表JOIN。在线请求模式下,需要遵循[在线请求模式下LAST JOIN的使用规范](../deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md#在线请求模式下-last-join-的使用规范) |
-| LEFT JOIN | **``x``** | **``x``** | **``✓``** | 由于 LEFT JOIN 是一对多 JOIN, 本身不能直接用于在线请求模式. 但是可以作为其他类型查询内部的子查询, 例如作为 LAST JOIN 的右表. 具体参考[在线请求模式下LAST JOIN的使用规范](../deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md#在线请求模式下-last-join-的使用规范) |
+| LEFT JOIN | **``✓``** | **``x``** | **``✓``** | 由于 LEFT JOIN 是一对多 JOIN, 本身不能直接用于在线请求模式. 但是可以作为其他类型查询内部的子查询, 例如作为 LAST JOIN 的右表. 具体参考[在线请求模式下LAST JOIN的使用规范](../deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md#在线请求模式下-last-join-的使用规范) |
### 未排序的LAST JOIN
diff --git a/docs/zh/openmldb_sql/dql/SELECT_STATEMENT.md b/docs/zh/openmldb_sql/dql/SELECT_STATEMENT.md
index d846d567ef3..01b34828382 100644
--- a/docs/zh/openmldb_sql/dql/SELECT_STATEMENT.md
+++ b/docs/zh/openmldb_sql/dql/SELECT_STATEMENT.md
@@ -1,8 +1,6 @@
-# SELECT 概况
+# Query 语句
-## Syntax
-
-### Syntax Notation
+## Syntax Notation
- `[ expr ]`: 中括号,可选部分
- `{}`: 手动分组
@@ -11,7 +9,7 @@
- 大写变量,例如 `WITH`, 表示 SQL 关键词 "WITH"
- 小写变量, 例如 `query`, 可以拓展成特定语法结构
-### Select Statement
+## Syntax
```yacc
query_statement:
@@ -38,7 +36,7 @@ non_recursive_cte:
cte_name AS ( query )
set_operator:
- UNION ALL
+ UNION { ALL | DISTINCT }
from_item:
table_name [ as_alias ]
@@ -100,19 +98,21 @@ select_expression:
expression [ [ AS ] alias ]
```
-## SELECT语句元素
+## Query 语句元素
| SELECT语句元素 | 离线模式 | 在线预览模式 | 在线请求模式 | 说明 |
|:-----------------------------------------------| --------- | ------------ | ------------ |:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| [`SELECT` Clause](#selectexprlist) | **``✓``** | **``✓``** | **``✓``** | 投影操作列表,一般包括列名、表达式,或者是用 `*` 表示全部列 |
-| [`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) |
-| [`JOIN` Clause](../dql/JOIN_CLAUSE.md) | **``✓``** | **``x``** | **``✓``** | 表示数据来源多个表JOIN。OpenMLDB目前仅支持LAST JOIN。在线请求模式下,需要遵循[Online Request下LAST JOIN的使用规范](../deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md#在线请求模式下-last-join-的使用规范) |
-| [`WHERE` Clause](../dql/WHERE_CLAUSE.md) | | **``✓``** | | Where 子句用于设置过滤条件,查询结果中只会包含满足条件的数据。 |
-| [`GROUP BY` Clause](../dql/GROUP_BY_CLAUSE.md) | **``✓``** | **``✓``** | | Group By 子句用于对查询结果集进行分组。分组表达式列表仅支持简单列。 |
-| [`HAVING` Clause](../dql/HAVING_CLAUSE.md) | **``✓``** | **``✓``** | | Having 子句与 Where 子句作用类似.Having 子句过滤 GroupBy 后的各种数据,Where 子句在聚合前进行过滤。 |
+| [`WITH` Clause](./WITH_CLAUSE.md) | **``✓``** | **``✓``** | **``✓``** | |
+| [`SELECT` list](#selectexprlist) | **``✓``** | **``✓``** | **``✓``** | 投影操作列表,一般包括列名、表达式,或者是用 `*` 表示全部列 |
+| [`FROM` Clause](#from-clause) | **``✓``** | **``✓``** | **``✓``** | 表示数据来源 |
+| [`JOIN` Operation](../dql/JOIN_CLAUSE.md) | **``✓``** | **``x``** | **``✓``** | 表示数据来源多个表JOIN。OpenMLDB目前仅支持LAST JOIN。在线请求模式下,需要遵循[Online Request下LAST JOIN的使用规范](../deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md#在线请求模式下-last-join-的使用规范) |
+| [`SET` Operation](./SET_OPERATION.md) | **``✓``** | **``✓``** | **``✓``** | 只支持 UNION, 在线支持 UNION ALL, 离线支持 UNION ALL/DISTINCT |
+| [`WHERE` Clause](../dql/WHERE_CLAUSE.md) | **``x``** | **``✓``** | **``x``** | Where 子句用于设置过滤条件,查询结果中只会包含满足条件的数据。 |
+| [`GROUP BY` Clause](../dql/GROUP_BY_CLAUSE.md) | **``✓``** | **``✓``** | **``x``** | Group By 子句用于对查询结果集进行分组。分组表达式列表仅支持简单列。 |
+| [`HAVING` Clause](../dql/HAVING_CLAUSE.md) | **``✓``** | **``✓``** | **``x``** | Having 子句与 Where 子句作用类似.Having 子句过滤 GroupBy 后的各种数据,Where 子句在聚合前进行过滤。 |
| [`WINDOW` Clause](../dql/WINDOW_CLAUSE.md) | **``✓``** | **``✓``** | **``✓``** | 窗口子句用于定义一个或者若干个窗口。窗口可以是有名或者匿名的。用户可以在窗口上调用聚合函数来进行一些分析型计算的操作(```sql agg_func() over window_name```)。线请求模式下,需要遵循[Online Request下Window的使用规范](../deployment_manage/ONLINE_REQUEST_REQUIREMENTS.md#在线请求模式下window的使用规范) |
-| [`LIMIT` Clause](../dql/LIMIT_CLAUSE.md) | **``✓``** | **``✓``** | | Limit子句用于限制返回的结果条数。目前Limit仅支持接受一个参数,表示返回数据的最大行数。 |
-| `ORDER BY` Clause | | | | 标准SQL还支持Order By子句。OpenMLDB目前尚未支持Order子句。例如,查询语句`SELECT * from t1 ORDER BY col1;`在OpenMLDB中不被支持。 |
+| [`LIMIT` Clause](../dql/LIMIT_CLAUSE.md) | **``✓``** | **``✓``** | **``x``** | Limit子句用于限制返回的结果条数。目前Limit仅支持接受一个参数,表示返回数据的最大行数。 |
+| `ORDER BY` Clause | **``x``** | **``x``** | **``x``** | 标准SQL还支持Order By子句。OpenMLDB目前尚未支持Order子句。例如,查询语句`SELECT * from t1 ORDER BY col1;`在OpenMLDB中不被支持。 |
```{warning}
在线模式或单机版的select,可能无法获取完整数据。
@@ -123,18 +123,28 @@ select_expression:
在线模式或单机版都不适合做大数据的扫描,推荐使用集群版的离线模式。如果一定要调大扫描量,需要对每台tablet配置`--scan_max_bytes_size=xxx`,并重启tablet生效。
```
-## 离线同步模式 SELECT
+## FROM Clause
+
+FROM子句指定了查询的原始数据来源,即我们要在哪些表中查找所需的数据。它也会定义这些数据源间的联系,比如是否通过某些字段建立连接查询,从而将原本分散在多个表中的数据整合在一起,形成一个单一的数据集以供查询操作使用.
+
+FROM 子句的来源可以是:
+
+- 表名或者 Common Table Expression (CTE), 同名情况下 CTE 优先级更高
+- JOIN 操作, OpenMLDB 支持 LEFT JOIN 和 LAST JOIN
+- 任意子查询, 被括在括号中
+
+## 离线同步模式 Query
-设置`SET @@sync_job=true`后的`SELECT`语句,就是离线同步模式下的`SELECT`。在这个状态下的`SELECT`会展示结果到CLI(不建议在SDK中使用这种模式,不会得到正常的ResultSet)。
+设置`SET @@sync_job=true`后的 Query 语句,就是离线同步模式下的 Query。在这个状态下的 Query 会展示结果到CLI(不建议在SDK中使用这种模式,不会得到正常的ResultSet)。
-原理:SELECT执行完成后各worker通过HTTP发送结果到TaskManager,TaskManager收集各个结果分片并保存到本地文件系统中。结果收集完成后,再从本地文件系统读取,读取后删除本地缓存的结果。
+原理:Query 执行完成后各worker通过HTTP发送结果到TaskManager,TaskManager收集各个结果分片并保存到本地文件系统中。结果收集完成后,再从本地文件系统读取,读取后删除本地缓存的结果。
```{attention}
-离线同步模式 SELECT 仅用于展示,不保证结果完整。整个结果收集中可能出现文件写入失败,丢失HTTP包等问题,我们允许结果缺失。
+离线同步模式 Query 仅用于展示,不保证结果完整。整个结果收集中可能出现文件写入失败,丢失HTTP包等问题,我们允许结果缺失。
```
### 相关配置参数
-TaskManager配置`batch.job.result.max.wait.time`,在`SELECT` job完成后,我们会等待所有结果被收集并保存在TaskManager所在主机的文件系统中,超过这一时间将结束等待,返回错误。如果认为整个收集结果的过程没有问题,仅仅是等待时间不够,可以调大这一配置项,单位为ms,默认为10min。
+TaskManager配置`batch.job.result.max.wait.time`,在 Query job完成后,我们会等待所有结果被收集并保存在TaskManager所在主机的文件系统中,超过这一时间将结束等待,返回错误。如果认为整个收集结果的过程没有问题,仅仅是等待时间不够,可以调大这一配置项,单位为ms,默认为10min。
Batch配置(spark.default.conf):
- spark.openmldb.savejobresult.rowperpost: 为了防止HTTP传送过多数据,我们对数据进行切割,默认为16000行。如果单行数据量较大,可以调小该值。
diff --git a/docs/zh/openmldb_sql/dql/SET_OPERATION.md b/docs/zh/openmldb_sql/dql/SET_OPERATION.md
new file mode 100644
index 00000000000..315b91565d0
--- /dev/null
+++ b/docs/zh/openmldb_sql/dql/SET_OPERATION.md
@@ -0,0 +1,53 @@
+# SET Operation
+
+
+
+SET 操作将两个或者更多相同输出 schema 的 query 语句按特定的规则整合成一个结果输出. 共有三种 Set 操作符: `UNION`, `INTERSECT`, `EXCEPT`, OpenMLDB 目前仅支持 `UNION`.
+
+
+
+## Syntax
+
+```yacc
+set_operation:
+ query set_operator query
+
+set_operator:
+ UNION { ALL | DISTINCT }
+```
+
+注意
+
+- `ALL/DISTINCT` 是必填, 不支持单独 UNION 的写法
+- 同一层 Set Operation 里, 多个 UNION 操作必须都是 UNION ALL 或者 UNION DISTINCT. 可以利用子查询将不同 DISTINCT 属性的 query 串联起来
+- 这里的 UNION 语法不同于 [WINDOW clause](./WINDOW_CLAUSE.md) 中的 WINDOW UNION 语法
+
+## 边界说明
+
+| SELECT语句元素 | 离线模式 | 在线预览模式 | 在线请求模式 | 说明 |
+| :------------- | --------- | ------------ | ------------ | :--- |
+| SET Operation | **``✓``** | **``✓``** | **``✓``** | |
+
+- 在线模式下只支持 UNION ALL, 离线模式支持 UNION ALL 和 UNION DISTINCT
+
+
+
+## Example
+
+```sql
+SELECT * FROM t1
+UNION ALL
+SELECT * FROM t2
+UNION ALL
+SELECT * FROM t3
+
+-- differnt DISTINCT field
+SELECT * FROM t1
+UNION ALL
+(
+ SELECT * FROM t2
+ UNION DISTINCT
+ SELECT * FROM t3
+)
+```
+
diff --git a/docs/zh/openmldb_sql/dql/index.rst b/docs/zh/openmldb_sql/dql/index.rst
index 07baf688985..7a10c319e04 100644
--- a/docs/zh/openmldb_sql/dql/index.rst
+++ b/docs/zh/openmldb_sql/dql/index.rst
@@ -8,6 +8,7 @@
SELECT_STATEMENT
JOIN_CLAUSE
+ SET_OPERATION
WHERE_CLAUSE
GROUP_BY_CLAUSE
HAVING_CLAUSE
diff --git a/docs/zh/openmldb_sql/index.rst b/docs/zh/openmldb_sql/index.rst
index 149147f1f55..883425443d5 100644
--- a/docs/zh/openmldb_sql/index.rst
+++ b/docs/zh/openmldb_sql/index.rst
@@ -5,9 +5,9 @@ OpenMLDB SQL
.. toctree::
:maxdepth: 1
-
+
sql_difference
- language_structure/index
+ language_structure/index
data_types/index
functions_and_operators/index
udfs_8h
diff --git a/docs/zh/openmldb_sql/sql_difference.md b/docs/zh/openmldb_sql/sql_difference.md
index 0b521dd2eca..b224db6d567 100644
--- a/docs/zh/openmldb_sql/sql_difference.md
+++ b/docs/zh/openmldb_sql/sql_difference.md
@@ -1,26 +1,26 @@
# 与标准 SQL 的主要差异
-本文将 OpenMLDB SQL 的主要使用方式(SELECT 查询语句)与标准 SQL (以 MySQL 支持的语法为例)进行比较,让有 SQL 使用经验的开发者快速上手 OpenMLDB SQL。
+本文将 OpenMLDB SQL 的主要使用方式(Query 查询语句)与标准 SQL (以 MySQL 支持的语法为例)进行比较,让有 SQL 使用经验的开发者快速上手 OpenMLDB SQL。
以下如无特殊说明,默认均为 OpenMLDB 版本:>= v0.7.1
## 支持总览
-下表根据 SELECT 语句元素对 OpenMLDB SQL 在三种执行模式下(关于执行模式参考[使用流程和执行模式](../quickstart/concepts/modes.md))与标准 SQL 整体性的差异做了汇总。OpenMLDB SQL 目前部分兼容标准 SQL,但考虑实际业务场景需求新增了部分语法,下表加粗部分为新增语法。
+下表根据 Query语句元素对 OpenMLDB SQL 在三种执行模式下(关于执行模式参考[使用流程和执行模式](../quickstart/concepts/modes.md))与标准 SQL 整体性的差异做了汇总。OpenMLDB SQL 目前部分兼容标准 SQL,但考虑实际业务场景需求新增了部分语法,下表加粗部分为 OpenMLDB SQL 特有语法。
注:✓ 表示**支持**该语句,✕ 表示**不支持**。
| | **OpenMLDB SQL**
**离线模式** | **OpenMLDB SQL**
**在线预览模式** | **OpenMLDB SQL**
**在线请求模式** | **标准 SQL** | **备注** |
| -------------- | ---------------------------- | -------------------------------- | -------------------------------- | ------------ | ------------------------------------------------------------ |
+| JOIN Operation | ✓ | ✕ | ✓ | ✓ | OpenMLDB 支持特有的 **LAST JOIN**, 和 LEFT JOIN |
+| SET Operation | ✓ | ✓ | ✓ | ✓ | OpenMLDB 仅支持 UNION |
| WHERE 子句 | ✓ | ✓ | ✕ | ✓ | 部分功能可以通过带有 `_where` 后缀的内置函数实现 |
-| HAVING 子句 | ✓ | ✓ | X | ✓ | |
-| JOIN 子句 | ✓ | ✕ | ✓ | ✓ | OpenMLDB 支持特有的 **LAST JOIN**, 和 **LEFT JOIN** |
-| GROUP BY 分组 | ✓ | ✕ | ✕ | ✓ | |
-| ORDER BY 关键字 | ✓ | ✓ | ✓ | ✓ | 仅支持在 `WINDOW` 和 `LAST JOIN` 子句内部使用,不支持倒排序 `DESC` |
-| LIMIT 限制行数 | ✓ | ✓ | ✕ | ✓ | |
+| GROUP BY / HAVING 分组 | ✓ | ✓ | ✕ | ✓ | OpenMLDB >= 0.6.4 支持 GROUP BY, HAVING |
| WINDOW 子句 | ✓ | ✓ | ✓ | ✓ | OpenMLDB 增加了特有的 **WINDOW ... UNION** 和 **WINDOW ATTRIBUTES** 语法 |
-| WITH 子句 | ✕ | ✕ | ✕ | ✓ | OpenMLDB 从版本 v0.7.2 开始支持 |
-| 聚合函数 | ✓ | ✓ | ✓ | ✓ | OpenMLDB 有较多扩展函数 |
+| ORDER BY 关键字 (不是 SELECT 里的 ORDER BY 子句) | ✓ | ✓ | ✓ | ✓ | 仅支持在 `WINDOW` 和 **`LAST JOIN`** 子句内部使用,不支持倒排序 `DESC` |
+| LIMIT 限制行数 | ✓ | ✓ | ✕ | ✓ | |
+| WITH 子句 | ✓ | ✓ | ✓ | ✓ | OpenMLDB 从版本 v0.7.2 开始支持 |
+| 聚合函数 | ✓ | ✓ | ✓ | ✓ | OpenMLDB 有自己的[拓展函数](https://openmldb.ai/docs/zh/main/openmldb_sql/udfs_8h.html), 部分兼容其他 SQL |
@@ -104,8 +104,9 @@ OpenMLDB 支持 LAST JOIN 和 LEFT JOIN,详细描述参考扩展语法的 JOIN
| LAST JOIN + 左右表均为简单列筛选 | ✓ | ✕ | ✓l |
| LAST JOIN + 右表是带 WHERE 条件过滤的单表查询 | ✓ | ✕ | ✓ |
| LAST JOIN左表或右表为 WINDOW 或 LAST JOIN 操作 | ✓ | ✕ | ✓ |
-| LAST JOIN + 右表是LEFT JOIN 的子查询 | ✕ | ✕ | ✓ |
-| LEFT JOIN | ✕ | ✕ | ✕ |
+| LAST JOIN + 右表是LEFT JOIN 的子查询 | ✓ | ✕ | ✓ |
+| LAST JOIN + 右表是 UNION ALL 子查询 | ✓ | ✓ | ✓ |
+| LEFT JOIN | ✓ | ✕ | ✕ |
特殊限制: