fixed #803 remove useless documents in the code repo
This commit is contained in:
parent
5c77a74307
commit
eb82c66278
@ -1,63 +0,0 @@
|
||||
什么是 OceanBase 数据库
|
||||
======================================
|
||||
|
||||
|
||||
|
||||
OceanBase 数据库是一个金融级分布式关系数据库,提供社区版和企业版:
|
||||
|
||||
* OceanBase 数据库社区版包含 OceanBase 的所有核心功能,源代码完全公开,且使用免费。
|
||||
|
||||
|
||||
|
||||
* OceanBase 数据库企业版在 OceanBase 社区版的基础上,提供更多高级功能,如商业特性兼容、图形化管理工具、操作审计、安全加密、高可用扩展等。如果您想了解 OceanBase 企业版的相关功能,请参考 [OceanBase 企业版文档](https://www.oceanbase.com/docs)。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
本手册仅适用于 OceanBase 数据库社区版。
|
||||
|
||||
特性
|
||||
-----------------------
|
||||
|
||||
OceanBase 数据库具有如下特性:
|
||||
|
||||
* 高可用
|
||||
|
||||
OceanBase 数据库将数据以多副本的方式存储在集群的各个节点,可以轻松实现高可用,保证 RPO=0,甚至异地多活。即使单个节点出现故障也不影响业务。多副本能够满足从节点、机架、机房到城市级别的高可用、容灾要求,并且克服传统数据库的主备模式在主节点出现异常时 RPO\>0 的问题。
|
||||
|
||||
|
||||
* 可扩展
|
||||
|
||||
OceanBase 数据库具有极强的可扩展性,可以在线进行平滑扩容或缩容,在扩容后自动实现系统负载均衡。并且扩容或缩容过程对应用透明。
|
||||
|
||||
|
||||
* 低成本
|
||||
|
||||
OceanBase 数据库可以在通用服务器上运行,不依赖于特定的高端硬件,能够有效降低用户的硬件成本。OceanBase 数据库使用基于 LSM-Tree 的存储引擎,能够有效地对数据进行压缩,并且不影响性能,可以降低用户的存储成本。
|
||||
|
||||
|
||||
* HTAP
|
||||
|
||||
OceanBase 数据库的分布式并行计算引擎对 OLTP 应用和 OLAP 应用都进行了很好的优化,并且支持跨数据库节点的 DQL 和 DML 并发执行,真正实现了一套计算引擎同时支持混合负载。
|
||||
|
||||
|
||||
* 兼容性
|
||||
|
||||
OceanBase 数据库高度兼容 MySQL 数据库生态。OceanBase 数据库支持 MySQL 5.6 版本全部语法,可以与 MySQL 业务无缝切换。
|
||||
|
||||
|
||||
* 多租户
|
||||
|
||||
OceanBase 数据库通过租户实现资源隔离,每个数据库服务的实例不感知其他实例的存在,并通过权限控制确保不同租户数据的安全性。多租户与 OceanBase 数据库强大的可扩展性相结合,能够提供安全、灵活的 DBaaS 服务。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
许可证
|
||||
------------------------
|
||||
|
||||
OceanBase 数据库社区版完全开源,使用 [MulanPubL - 2.0](https://license.coscl.org.cn/MulanPubL-2.0/index.html) 许可证,您可以免费复制和使用源代码。当您修改或分发源代码时,请遵守木兰协议。
|
||||
|
@ -1,22 +0,0 @@
|
||||
名词解释
|
||||
=========================
|
||||
|
||||
本文介绍您在使用 OceanBase 数据库时可能需要了解的名词解释。
|
||||
|
||||
* OceanBase 数据库
|
||||
|
||||
蚂蚁集团完全自主研发的金融级分布式关系数据库。OceanBase 数据库具有高可用、可拓展、高兼容、低成本、强一致及高性能等特点。详细信息参考 [什么是 OceanBase 数据库](../1.about-oceanbase-database/1.what-is-oceanbase.md)。
|
||||
|
||||
|
||||
* OceanBase Database Proxy
|
||||
|
||||
OceanBase 数据库代理,简称为 ODP。ODP 是 OceanBase 数据库专用的连接代理软件。ODP 的核心功能包括:保证最佳路由,避免分布式事务;保护 OceanBase 数据库的高可用能力,单台服务器故障不影响应用。详细信息,参考 ODP 文档。
|
||||
|
||||
|
||||
* OceanBase Deployer
|
||||
|
||||
OceanBase 开源软件的安装部署工具,简称为 OBD。OBD 同时也是包管理器,可以用来管理 OceanBase 所有的开源软件 **。**
|
||||
|
||||
|
||||
|
||||
|
@ -1,187 +0,0 @@
|
||||
数据类型
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
OceanBase支持如下数据类型:
|
||||
|
||||
* 数值类型
|
||||
|
||||
* 日期时间类型
|
||||
|
||||
* 字符类型
|
||||
|
||||
* 大对象类型
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
数值类型
|
||||
-------------
|
||||
|
||||
数值类型可以划分为三类:
|
||||
|
||||
* 整数类型:`BOOL`/`BOOLEAN`、`TINYINT`、`SMALLINT`、`MEDIUMINT`、`INT`/`INTEGER`、`BIGINT`。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 定点类型:`DECIMAL`/`NUMERIC`。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 浮点类型:`FLOAT`、`DOUBLE`。
|
||||
|
||||
* Bit-Value类型:`BIT`
|
||||
|
||||
|
||||
|
||||
|
||||
所有数据类型都可以同时使用`UNSIGNED`关键字声明为无符号类型,这会导致值域发生变化。
|
||||
|
||||
数值类型在定义时可以指定precision和scale,不同类型中precision和scale的含义可能有所不同,详情请见各类型详细说明。
|
||||
|
||||
整数类型
|
||||
-------------
|
||||
|
||||
整数类型为定长、精确数值类型,值域取决于类型长度,以及是否为无符号,precision只表示最小显示宽度,详见"ZEROFILL属性"节。以下为相关信息:
|
||||
|
||||
|
||||
| 类型 | 长度(字节) | 值域(有符号) | 值域(无符号) |
|
||||
|---------------------------------------------|--------|---------------------------|--------------------|
|
||||
| `BOOL`/`BOOLEAN`/ `TINYINT` | 1 | \[-2 \^ 7 , 2 \^ 7 - 1\] | \[0, 2 \^ 8 - 1\] |
|
||||
| `SMALLINT` | 2 | \[-2 \^ 15, 2 \^ 15 - 1\] | \[0, 2 \^ 16 - 1\] |
|
||||
| `MEDIUMINT` | 3 | \[-2 \^ 23, 2 \^ 23 - 1\] | \[0, 2 \^ 24 - 1\] |
|
||||
| `INT`/`INTEGER` | 4 | \[-2 \^ 31, 2 \^ 31 - 1\] | \[0, 2 \^ 32 - 1\] |
|
||||
| `BIGINT` | 8 | \[-2 \^ 63, 2 \^ 63 - 1\] | \[0, 2 \^ 64 - 1\] |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
`BOOL`等价于`BOOLEAN`,这两个类型又等价于`TINYINT(1)`。
|
||||
|
||||
`INT`等价于`INTEGER`。
|
||||
|
||||
定点类型
|
||||
-------------
|
||||
|
||||
定点类型为变长、精确数值类型,值域和精度取决于precision和scale,以及是否为无符号。precision和scale分别表示十进制下的总最大有效位数、小数部分最大有效位数,整数部分最大有效位数等于precision - scale,其中precision和scale的最大值分别为65、30,默认值分别为10、0。例如:
|
||||
|
||||
* `DECIMAL(5, 2)`,整数部分和小数部分最大有效位数分别为3、2,所以值域为\[-999.99, 999.99\]。
|
||||
|
||||
* 如果同时定义为`UNSIGNED`,则值域为\[0, 999.99\]。
|
||||
|
||||
|
||||
|
||||
|
||||
`DECIMAL`等价于`NUMERIC`。
|
||||
|
||||
#### 浮点类型
|
||||
|
||||
浮点类型为定长、非精确数值类型,值域和精度取决于类型长度、precision和scale,以及是否为无符号。precision和scale分别表示十进制下的总最大有效位数、小数部分最大有效位数,整数部分最大有效位数等于precision - scale,其中precision和scale的最大值分别为53、30。
|
||||
|
||||
浮点类型的精度只是IEEE标准中规定的理论值,实际情况可能因硬件或操作系统限制略有不同。
|
||||
|
||||
以下为不指定precision和scale时的默认信息:
|
||||
|
||||
|
||||
| 类型 | 长度(字节) | 值域(有符号) | 值域(无符号) | 精度 |
|
||||
|----------|--------|---------------------------|------------------|-----|
|
||||
| `FLOAT` | 4 | \[-2 \^ 128, 2 \^ 128\] | \[0, 2 \^ 128\] | 7位 |
|
||||
| `DOUBLE` | 8 | \[-2 \^ 1024, 2 \^ 1024\] | \[0, 2 \^ 1024\] | 15位 |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
如果指定precision和scale,则值域确定方法与定点类型相同。
|
||||
|
||||
#### ZEROFILL属性
|
||||
|
||||
数值类型在定义时可以通过ZEROFILL关键字指定最小显示宽度,同时将该类型隐式定义为UNSIGNED。在数据实际显示宽度不足最小显示宽度时,通过先在小数部分补零到scale上限、再在整数部分补零到precision上限的方式,将显示宽度补足到最小显示宽度。例如:
|
||||
|
||||
* `INT(5) ZEROFILL`:当数据值为`123`时,将显示为`00123`。
|
||||
|
||||
* `DECIMAL(10, 5) ZEROFILL`:当数据值为`123.456`时,将显示为`00123.45600`。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#### BIT-Value类型
|
||||
|
||||
BIT数据类型用于存储bit values。一个BIT(M)能够存储M-bit的值,M的范围是1\~64。
|
||||
|
||||
bit value通过b'value'的形式指定, **value** 是用0和1来指定的,例如,b'111'表示7,b'10000000'表示128。
|
||||
|
||||
当向BIT(M)列插入值时,如果插入值的长度小于 **M** ,则会在左侧填充0。例如:将b'101'插入到BIT(6)时,相当于插入了b'000101'。
|
||||
|
||||
日期时间类型
|
||||
---------------
|
||||
|
||||
以下为相关信息:
|
||||
|
||||
|
||||
| 类型 | 格式 | 下界 | 上界 | 含义 |
|
||||
|-------------|----------------------------------|----------------------------|----------------------------|-------------|
|
||||
| `DATETIME` | YYYY-MM-DD HH:MM:SS\[.fraction\] | 0000-01-01 00:00:00.000000 | 9999-12-31 23:59:59.999999 | 日期时间(不考虑时区) |
|
||||
| `TIMESTAMP` | YYYY-MM-DD HH:MM:SS\[.fraction\] | 0000-01-01 00:00:00.000000 | 9999-12-31 23:59:59.999999 | 日期时间(考虑时区) |
|
||||
| `DATE` | YYYY-MM-DD | 0000-01-01 | 9999-12-31 | 日期 |
|
||||
| `TIME` | HH:MM:SS\[.fraction\] | -838:59:59.000000 | 838:59:59.000000 | 时间 |
|
||||
| `YEAR` | YYYY | 1901 | 2155 | 年份 |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
`DATETIME`、`TIMESTAMP`、`TIME`的值域和精度取决于scale。该属性表示小数部分最大有效位数,最大值为6,默认值为0。
|
||||
|
||||
字符类型
|
||||
-------------
|
||||
|
||||
以下为普通字符类型相关信息:
|
||||
|
||||
|
||||
| 类型 | 长度 | 定义长度上限(字符) | 字符集 |
|
||||
|-------------|----|-----------------------------|-----------|
|
||||
| `VARCHAR` | 变长 | 262144 / 256K | `UTF8MB4` |
|
||||
| `VARBINARY` | 变长 | 1048576 / 1M | `BINARY` |
|
||||
| `CHAR` | 定长 | 256 | `UTF8MB4` |
|
||||
| `BINARY` | 定长 | 256 | `BINARY` |
|
||||
| `enum` | 变长 | 最多定义65535个元素,每个元素长度最多255个字符 | `UTF8MB4` |
|
||||
| `set` | 变长 | 最多定义64个元素,每个元素长度最多255个字符 | `UTF8MB4` |
|
||||
|
||||
|
||||
|
||||
大对象类型
|
||||
--------------
|
||||
|
||||
以下为大对象类型相关信息:
|
||||
|
||||
|
||||
| 类型 | 长度 | 存储长度上限(字节) | 字符集 |
|
||||
|--------------|----|----------------|-----------|
|
||||
| `TINYTEXT` | 变长 | 256 | `UTF8MB4` |
|
||||
| `TINYBLOB` | 变长 | 256 | `BINARY` |
|
||||
| `TEXT` | 变长 | 65536 / 64K | `UTF8MB4` |
|
||||
| `BLOB` | 变长 | 65536 / 64K | `BINARY` |
|
||||
| `MEDIUMTEXT` | 变长 | 16777216 / 16M | `UTF8MB4` |
|
||||
| `MEDIUMBLOB` | 变长 | 16777216 / 16M | `BINARY` |
|
||||
| `LONGTEXT` | 变长 | 50331648 / 48M | `UTF8MB4` |
|
||||
| `LONGBLOB` | 变长 | 50331648 / 48M | `BINARY` |
|
||||
|
||||
|
||||
|
@ -1,80 +0,0 @@
|
||||
表达式
|
||||
========================
|
||||
|
||||
|
||||
|
||||
表达式是广义概念,通常有若干个输入参数,并且返回一个输出结果。其中输入参数可能来自于常量或单行数据,也可能来自于多行数据。表达式可以组合,一个表达式的输入可以为另一个表达式的输出。
|
||||
|
||||
根据表达式的来源和形式,可分为如下几类:
|
||||
|
||||
* 列引用
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 常量
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 运算符
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 函数
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
例如:
|
||||
|
||||
```javascript
|
||||
SELECT ABS(a + 1)
|
||||
FROM t1
|
||||
WHERE a > 0;
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* a为列引用。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 0、1为常量。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* `>`、`+`为运算符,以0、1、a表达式为输入。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* `ABS`为函数,以`+`表达式为输入。
|
||||
|
||||
|
||||
|
@ -1,10 +0,0 @@
|
||||
类型转换
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
OceanBase支持显式类型转换和隐式类型转换。
|
||||
|
||||
显示类型转换通过`CAST`函数实现。
|
||||
|
||||
隐式类型转换发生在这样的场景中:一个操作需要一个指定类型的参数,但语句的实际参数值并不是指定类型,这时OceanBase会将实际参数值转为指定类型后,再进行后续操作。
|
@ -1,20 +0,0 @@
|
||||
字符集
|
||||
========================
|
||||
|
||||
|
||||
|
||||
目前只支持如下字符集:
|
||||
|
||||
* `UTF8MB4`:变长编码,字符最大长度4字节。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* `BINARY`:定长编码,字符固定长度1字节。
|
||||
|
||||
|
||||
|
||||
|
||||
`UT8`/`UTF8MB3`是`UTF8MB4`的子集,变长编码,字符最大长度3字节。为支持无缝迁移,OceanBase在语法上将`UTF8`视为`UTF8MB4`的同义词。
|
@ -1,25 +0,0 @@
|
||||
排序规则
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
目前只支持如下排序规则:
|
||||
|
||||
* `UTF8MB4`的`UTF8MB4_GENERAL_CI`。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* `UTF8MB4`的`UTF8MB4_BIN`。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* `BINARY`的`BINARY`。
|
||||
|
||||
|
||||
|
@ -1,29 +0,0 @@
|
||||
数据比较规则
|
||||
===========================
|
||||
|
||||
|
||||
|
||||
OceanBase允许任意两或多个任意类型的数据进行比较,比较结果可能为:
|
||||
|
||||
* 非0 / TRUE
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 0 / FALSE。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* NULL。
|
||||
|
||||
|
||||
|
||||
|
||||
如果参与比较的数据类型不一致,OceanBase会根据相关规则确定一个用于比较的数据类型,逻辑上所有参与比较的数据都需要先转换为该数据类型才能参与比较操作。
|
||||
|
||||
如果比较类型为文本类型,则还需要确定一个用于比较的排序规则。
|
@ -1,64 +0,0 @@
|
||||
字面量
|
||||
========================
|
||||
|
||||
|
||||
|
||||
文本
|
||||
-----------
|
||||
|
||||
文本是使用单引号`'`或双引号`"`引起来的字符序列,如果打开`ANSI_QUOTES`模式,那只有单引号`'`可以用于引用字符串。
|
||||
|
||||
数值
|
||||
-----------
|
||||
|
||||
十进制数值可以分为精确数值(整数和定点数值)和浮点数值。数值可以使用小数点`.`作为十进制分隔符,也可以在前面加一个负号`-`来表示负值。
|
||||
|
||||
十六进制数值只支持整数数值,以前缀`0X`开始,允许出现字母`A`到`F`,所有字母不区分大小写。
|
||||
|
||||
日期时间
|
||||
-------------
|
||||
|
||||
日期时间字面量有文本或数值两种形式。
|
||||
|
||||
* 文本格式可使用全量分隔符:`'2015-07-21 12:34:56.789'`,或完全不使用分隔符:`'20150721'`。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 数值格式只允许使用小数点`.`作为秒和微秒部分的分隔符:`20150721123456.789`。
|
||||
|
||||
* 在需要使用分隔符时,除了秒和微秒部分之间只能使用小数点`.`外,其它分隔符建议只使用`-`、`/`、`:`等常用分隔符。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
转义字符
|
||||
-------------
|
||||
|
||||
转义字符是在字符串中,某些序列前添加反斜线`\`,用于表示特殊含义。转义字符对大小写敏感。例如`\b`表示退格,但`\B`表示`B`。
|
||||
|
||||
以下为所有转义符列表:
|
||||
|
||||
|
||||
| 转义符 | 含义 |
|
||||
|------|---------------------|
|
||||
| `\b` | 退格符。 |
|
||||
| `\f` | 换页符。 |
|
||||
| `\n` | 换行符。 |
|
||||
| `\r` | 回车符。 |
|
||||
| `\t` | tab字符。 |
|
||||
| `\\` | 反斜线字符。 |
|
||||
| `\'` | 单引号。 |
|
||||
| `\"` | 双引号。 |
|
||||
| `\_` | 下划线。 |
|
||||
| `\%` | 百分号。 |
|
||||
| `\0` | NULL。 |
|
||||
| `\Z` | ASCII 26,控制符Ctrl+Z。 |
|
||||
|
||||
|
@ -1,42 +0,0 @@
|
||||
注释
|
||||
=======================
|
||||
|
||||
|
||||
|
||||
SQL 语句
|
||||
---------------
|
||||
|
||||
在普通 SQL 语句中,OceanBase 数据库支持如下 3 种注释方法:
|
||||
|
||||
* 从 `#` 到行尾
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 从 `--` 到行尾
|
||||
|
||||
|
||||
|
||||
* 从 `/*` 到 `*/`
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
数据库对象
|
||||
--------------
|
||||
|
||||
在 DDL 语句中通过 `COMMENT` 子句可以为数据库对象指定注释。例如:
|
||||
|
||||
```unknow
|
||||
create table t(pk INT PRIMARY KEY COMMENT '主键');
|
||||
```
|
||||
|
||||
|
@ -1,54 +0,0 @@
|
||||
算术运算符
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
以下为所有算术运算符列表:
|
||||
|
||||
|
||||
| 运算符 | 操作数 | 含义 |
|
||||
|-----------|-------|----------------|
|
||||
| `+` | 一元/二元 | 一元表示正数,二元表示加法。 |
|
||||
| `-` | 一元/二元 | 一元表示负数,二元表示减法。 |
|
||||
| `*` | 二元 | 乘法。 |
|
||||
| `/` | 二元 | 普通除法。 |
|
||||
| `DIV` | 二元 | 整数除法,返回商数。 |
|
||||
| `MOD`或`%` | 二元 | 整数除法,返回余数。 |
|
||||
|
||||
|
||||
|
||||
整数除法遵循如下原则:
|
||||
|
||||
* 商数不论正负,统一向0取整。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 余数正负与被除数相同。
|
||||
|
||||
|
||||
|
||||
|
||||
例如:
|
||||
|
||||
```javascript
|
||||
OceanBase (root@oceanbase)> SELECT (-7) DIV (3.6), (-7) MOD (3.6);
|
||||
+----------------+----------------+
|
||||
| (-7) DIV (3.6) | (-7) MOD (3.6) |
|
||||
+----------------+----------------+
|
||||
| -1 | -3.4 |
|
||||
+----------------+----------------+
|
||||
1 row in set (0.01 sec)
|
||||
|
||||
OceanBase (root@oceanbase)> SELECT (-7) DIV (-3.4), (-7) % (-3.4);
|
||||
+-----------------+---------------+
|
||||
| (-7) DIV (-3.4) | (-7) % (-3.4) |
|
||||
+-----------------+---------------+
|
||||
| 2 | -0.2 |
|
||||
+-----------------+---------------+
|
||||
1 row in set (0.02 sec)
|
||||
```
|
||||
|
||||
|
@ -1,20 +0,0 @@
|
||||
位运算符
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
位运算使用`BIGINT UNSIGNED`计算,不需考虑符号位。
|
||||
|
||||
以下为所有位运算符列表:
|
||||
|
||||
|
||||
| 运算符 | 操作数 | 含义 |
|
||||
|------------|-----|-------|
|
||||
| `&` | 二元 | 按位与。 |
|
||||
| `|` | 二元 | 按位或。 |
|
||||
| `~` | 一元 | 按位取反。 |
|
||||
| `^` | 二元 | 按位异或。 |
|
||||
| `<<` | 二元 | 逻辑左移。 |
|
||||
| `>>` | 二元 | 逻辑右移。 |
|
||||
|
||||
|
@ -1,78 +0,0 @@
|
||||
比较运算符
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
以下为所有比较运算符列表:
|
||||
|
||||
|
||||
| 运算符 | 操作数 | 含义 | NULL参与运算 |
|
||||
|---------------------|-----|------------|----------------|
|
||||
| `=` | 二元 | 等于。 | 结果为NULL。 |
|
||||
| `<>`/`!=` | 二元 | 不等于。 | 结果为NULL。 |
|
||||
| `>` | 二元 | 大于。 | 结果为NULL。 |
|
||||
| `>=` | 二元 | 大于等于。 | 结果为NULL。 |
|
||||
| `<` | 二元 | 小于。 | 结果为NULL。 |
|
||||
| `<=` | 二元 | 小于等于。 | 结果为NULL。 |
|
||||
| `[NOT] IN` | 二元 | 是否在集合中。 | 详见说明。 |
|
||||
| `[NOT] BETWEEN AND` | 三元 | 是否在区间内。 | 详见说明。 |
|
||||
| `IS [NOT] TRUE` | 一元 | 是否等于TRUE。 | 结果为TRUE或FALSE。 |
|
||||
| `IS [NOT] FALSE` | 一元 | 是否等于FALSE。 | 结果为TRUE或FALSE。 |
|
||||
| `IS [NOT] NULL` | 一元 | 是否等于NULL。 | 结果为TRUE或FALSE。 |
|
||||
| `<=>` | 二元 | 安全等于。 | 结果为TRUE或FALSE。 |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
以下为部分运算符对NULL的特殊处理:
|
||||
|
||||
* `value [NOT] IN ()`:
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* `value [NOT] BETWEEN lower AND upper`:
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
|
||||
例如:
|
||||
|
||||
```javascript
|
||||
OceanBase (root@oceanbase)> SELECT 1 IN (1, NULL), 1 IN (2, NULL);
|
||||
+----------------+----------------+
|
||||
| 1 IN (1, NULL) | 1 IN (2, NULL) |
|
||||
+----------------+----------------+
|
||||
| 1 | NULL |
|
||||
+----------------+----------------+
|
||||
1 row in set (0.01 sec)
|
||||
|
||||
OceanBase (root@oceanbase)> SELECT 1 BETWEEN 0 AND NULL, 1 BETWEEN 2 AND NULL;
|
||||
+----------------------+----------------------+
|
||||
| 1 BETWEEN 0 AND NULL | 1 BETWEEN 2 AND NULL |
|
||||
+----------------------+----------------------+
|
||||
| NULL | 0 |
|
||||
+----------------------+----------------------+
|
||||
1 row in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
@ -1,15 +0,0 @@
|
||||
逻辑运算符
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
以下为所有逻辑运算符列表:
|
||||
|
||||
|
||||
| 运算符 | 操作数 | 含义 |
|
||||
|--------------------|-----|-----|
|
||||
| `AND`/`&&` | 二元 | 逻辑与 |
|
||||
| `OR`/`||` | 二元 | 逻辑或 |
|
||||
| `NOT`/`!` | 一元 | 逻辑非 |
|
||||
|
||||
|
@ -1,28 +0,0 @@
|
||||
日期时间运算符
|
||||
============================
|
||||
|
||||
|
||||
|
||||
以下为所有日期时间运算符列表:
|
||||
|
||||
|
||||
| 运算符 | 操作数 | 含义 |
|
||||
|-----|-----|---------------|
|
||||
| `+` | 二元 | 同`DATE_ADD`函数 |
|
||||
| `-` | 二元 | 同`DATE_SUB`函数 |
|
||||
|
||||
|
||||
|
||||
例如:
|
||||
|
||||
```javascript
|
||||
OceanBase (root@oceanbase)> SELECT '2008-12-31 23:59:59' + INTERVAL 1 SECOND;
|
||||
+-------------------------------------------+
|
||||
| '2008-12-31 23:59:59' + INTERVAL 1 SECOND |
|
||||
+-------------------------------------------+
|
||||
| 2009-01-01 00:00:00 |
|
||||
+-------------------------------------------+
|
||||
1 row in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
@ -1,27 +0,0 @@
|
||||
字符连接运算符
|
||||
============================
|
||||
|
||||
|
||||
|
||||
以下为所有字符连接运算符列表:
|
||||
|
||||
|
||||
| 运算符 | 操作数 | 含义 |
|
||||
|------|-----|-------|
|
||||
| `||` | 二元 | 字符串连接 |
|
||||
|
||||
|
||||
|
||||
如前节所述,`||`也可作为逻辑或运算符,两个不同含义是通过SQL MODE控制的:
|
||||
|
||||
* SQL MODE包含`PIPES_AS_CONCAT`时,`||`为字符连接运算符。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* SQL MODE不包含`PIPES_AS_CONCAT`时,`||`为逻辑与运算符。
|
||||
|
||||
|
||||
|
@ -1,14 +0,0 @@
|
||||
层次查询运算符
|
||||
============================
|
||||
|
||||
|
||||
|
||||
以下为所有层次查询运算符列表:
|
||||
|
||||
|
||||
| 运算符 | 操作数 | 含义 |
|
||||
|-------------------|-----|------------------------|
|
||||
| `PRIOR` | 一元 | 用于指明column来自parent row |
|
||||
| `CONNECT_BY_ROOT` | 一元 | 用于指明顶层祖先 |
|
||||
|
||||
|
@ -1,23 +0,0 @@
|
||||
排序规则运算符
|
||||
============================
|
||||
|
||||
|
||||
|
||||
以下为所有排序规则运算符列表:
|
||||
|
||||
|
||||
| 运算符 | 操作数 | 含义 |
|
||||
|-----------|--------|------|
|
||||
| `COLLATE` | 一元(后缀) | 排序规则 |
|
||||
|
||||
|
||||
|
||||
例如:
|
||||
|
||||
```javascript
|
||||
SELECT last_name
|
||||
FROM employees
|
||||
ORDER BY last_name COLLATE UTF8MB4_GENERAL_CI;
|
||||
```
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,269 +0,0 @@
|
||||
聚集函数
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
聚合函数对一组值执行计算并返回单一的值。聚合函数忽略空值。聚合函数经常与SELECT语句的GROUP BY子句一同使用。
|
||||
|
||||
所有聚合函数都具有确定性。任何时候用一组给定的输入值调用它们时,都返回相同的值。
|
||||
|
||||
在OceanBase的聚合函数中,Value表达式只能出现一个。例如:不支持COUNT(c1, c2),仅支持COUNT(c1)。
|
||||
|
||||
AVG
|
||||
------------
|
||||
|
||||
**声明**
|
||||
|
||||
`AVG(([DISTINCT] expr)`
|
||||
|
||||
**说明**
|
||||
|
||||
返回指定组中的平均值,空值被忽略。DISTINCT选项可用于返回expr的不同值的平均值。若找不到匹配的行,则AVG()返回NULL。
|
||||
|
||||
**例子**
|
||||
|
||||
```javascript
|
||||
Oceanbase>select * from oceanbasetest;
|
||||
+----+------+------+
|
||||
| id | ip | ip2 |
|
||||
+----+------+------+
|
||||
| 1 | 4 | NULL |
|
||||
| 3 | 3 | NULL |
|
||||
| 4 | 3 | NULL |
|
||||
+----+------+------+
|
||||
3 rows in set (0.01 sec)
|
||||
|
||||
Oceanbase>select avg(ip2), avg(ip), avg(distinct(ip)) from oceanbasetest;
|
||||
+----------+---------+-------------------+
|
||||
| avg(ip2) | avg(ip) | avg(distinct(ip)) |
|
||||
+----------+---------+-------------------+
|
||||
| NULL | 3.3333 | 3.5000 |
|
||||
+----------+---------+-------------------+
|
||||
1 row in set (0.00 sec)
|
||||
|
||||
Oceanbase>select avg(distinct(ip)),avg(ip),avg(ip2) from oceanbasetest;
|
||||
+-------------------+---------+----------+
|
||||
| avg(distinct(ip)) | avg(ip) | avg(ip2) |
|
||||
+-------------------+---------+----------+
|
||||
| 3.5000 | 3.3333 | NULL |
|
||||
+-------------------+---------+----------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
COUNT
|
||||
--------------
|
||||
|
||||
**声明**
|
||||
|
||||
`COUNT([DISTINCT] expr)`
|
||||
|
||||
**说明**
|
||||
|
||||
COUNT(\[DISTINCT\] expr )返回SELECT语句检索到的行中非NULL值的数目。若找不到匹配的行,则COUNT()返回0。DISTINCT选项可用于返回 expr 的不同值的数目。
|
||||
|
||||
COUNT(\*)的稍微不同之处在于,它返回检索行的数目,不论其是否包含NULL值。
|
||||
|
||||
**例子**
|
||||
|
||||
```javascript
|
||||
Oceanbase>select * from oceanbasetest;
|
||||
+----+------+------+
|
||||
| id | ip | ip2 |
|
||||
+----+------+------+
|
||||
| 1 | 4 | NULL |
|
||||
| 3 | 3 | NULL |
|
||||
| 4 | 3 | NULL |
|
||||
+----+------+------+
|
||||
3 rows in set (0.00 sec)
|
||||
|
||||
Oceanbase>select count(ip2), count(ip), count(distinct(ip)), count(*) from oceanbasetest;
|
||||
+------------+-----------+---------------------+----------+
|
||||
| count(ip2) | count(ip) | count(distinct(ip)) | count(*) |
|
||||
+------------+-----------+---------------------+----------+
|
||||
| 0 | 3 | 2 | 3 |
|
||||
+------------+-----------+---------------------+----------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
MAX
|
||||
------------
|
||||
|
||||
**声明**
|
||||
|
||||
`MAX([DISTINCT] expr)`
|
||||
|
||||
**说明**
|
||||
|
||||
返回指定数据中的最大值。
|
||||
|
||||
MAX()的取值可以是一个字符串参数;在这些情况下,它们返回最大字符串值。DISTINCT关键字可以被用来查找 expr的不同值的最大值,这产生的结果与省略DISTINCT 的结果相同。
|
||||
|
||||
假设表a有三行数据:id=1,num=10;id=2,num=20;id=3,num=30。
|
||||
|
||||
**例子**
|
||||
|
||||
```javascript
|
||||
Oceanbase>SELECT MAX(num) FROM a;
|
||||
+-----------------+
|
||||
| MAX(num) |
|
||||
+-----------------+
|
||||
| 30 |
|
||||
+-----------------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
MIN
|
||||
------------
|
||||
|
||||
**声明**
|
||||
|
||||
`MIN([DISTINCT] expr)`
|
||||
|
||||
**说明**
|
||||
|
||||
返回指定数据中的最小值。
|
||||
|
||||
MIN()的取值可以是一个字符串参数;在这些情况下,它们返回最小字符串值。DISTINCT关键字可以被用来查找expr 的不同值的最小值,然而,这产生的结果与省略DISTINCT 的结果相同。
|
||||
|
||||
假设表a有三行数据:id=1,num=10;id=2,num=20;id=3,num=30。
|
||||
|
||||
**例子**
|
||||
|
||||
```javascript
|
||||
Oceanbase>SELECT MIN(num) FROM a;
|
||||
+----------------+
|
||||
| MIN(num) |
|
||||
+----------------+
|
||||
| 10 |
|
||||
+----------------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
SUM
|
||||
------------
|
||||
|
||||
**声明**
|
||||
|
||||
`SUM([DISTINCT] expr)`
|
||||
|
||||
**说明**
|
||||
|
||||
返回 expr 的总数。若返回集合中无任何行,则 SUM() 返回NULL。DISTINCT关键字可用于求得 expr 不同值的总和。
|
||||
|
||||
若找不到匹配的行,则SUM()返回NULL。
|
||||
|
||||
**例子**
|
||||
|
||||
```javascript
|
||||
Oceanbase>select * from oceanbasetest;
|
||||
+------+------+------+
|
||||
| id | ip | ip2 |
|
||||
+------+------+------+
|
||||
| 1 | 4 | NULL |
|
||||
| 3 | 3 | NULL |
|
||||
| 4 | 3 | NULL |
|
||||
+------+------+------+
|
||||
3 rows in set (0.00 sec)
|
||||
|
||||
Oceanbase>select sum(ip2),sum(ip),sum(distinct(ip)) from oceanbasetest;
|
||||
+----------+---------+-------------------+
|
||||
| sum(ip2) | sum(ip) | sum(distinct(ip)) |
|
||||
+----------+---------+-------------------+
|
||||
| NULL | 10 | 7 |
|
||||
+----------+---------+-------------------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
GROUP_CONCAT
|
||||
---------------------
|
||||
|
||||
**声明**
|
||||
|
||||
`GROUP_CONCAT([DISTINCT] expr)`
|
||||
|
||||
**说明**
|
||||
|
||||
该函数返回带有来自一个组的连接的非NULL值的字符串结果。
|
||||
|
||||
```javascript
|
||||
GROUP_CONCAT([DISTINCT] expr [,expr ...]
|
||||
[ORDER BY {unsigned_integer | col_name | expr}
|
||||
ASC | DESC]
|
||||
[SEPARATOR str_val])
|
||||
```
|
||||
|
||||
|
||||
|
||||
**例子**
|
||||
|
||||
```javascript
|
||||
Oceanbase>select * from book; //表book(书编号,书名,出版社)
|
||||
+--------+--------------------------------+-----------------------------+
|
||||
| bookid | bookname | publishname |
|
||||
+--------+--------------------------------+-----------------------------+
|
||||
| 1 | git help | alibaba group publisher |
|
||||
| 2 | MySQL性能优化 | 浙江大学图文出版社 |
|
||||
| 3 | JAVA编程指南 | 机械工业出版社 |
|
||||
| 3 | JAVA编程指南 | 机械工业出版社 |
|
||||
| 4 | 大规模分布式存储系统 | 机械工业出版社 |
|
||||
+--------+--------------------------------+-----------------------------+
|
||||
5 rows in set (0.00 sec)
|
||||
|
||||
//查找书名信息
|
||||
Oceanbase>select group_concat(bookname) from book group by bookname;
|
||||
+-----------------------------------+
|
||||
| group_concat(bookname) |
|
||||
+-----------------------------------+
|
||||
| git help |
|
||||
| JAVA编程指南,JAVA编程指南 |
|
||||
| MySQL性能优化 |
|
||||
| 大规模分布式存储系统 |
|
||||
+-----------------------------------+
|
||||
4 rows in set (0.00 sec)
|
||||
|
||||
//查找书名信息,书名唯一
|
||||
Oceanbase>select group_concat(distinct(bookname)) from book group by bookname;
|
||||
+----------------------------------+
|
||||
| group_concat(distinct(bookname)) |
|
||||
+----------------------------------+
|
||||
| git help |
|
||||
| JAVA编程指南 |
|
||||
| MySQL性能优化 |
|
||||
| 大规模分布式存储系统 |
|
||||
+----------------------------------+
|
||||
4 rows in set (0.01 sec)
|
||||
|
||||
//查找书名和出版社信息,以书名分组,出版社信息降序排序显示
|
||||
Oceanbase>select bookname, group_concat(publishname order by publishname desc separator ';' ) from book group by bookname;
|
||||
+--------------------------------+---------------------------------------------------------------------+
|
||||
| bookname | group_concat(publishname order by publishname desc separator ';' ) |
|
||||
+--------------------------------+---------------------------------------------------------------------+
|
||||
| git help | alibaba group publisher |
|
||||
| JAVA编程指南 | 机械工业出版社;机械工业出版社 |
|
||||
| MySQL性能优化 | 浙江大学图文出版社 |
|
||||
| 大规模分布式存储系统 | 机械工业出版社 |
|
||||
+--------------------------------+---------------------------------------------------------------------+
|
||||
4 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
@ -1,425 +0,0 @@
|
||||
分析函数
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
简介
|
||||
-----------
|
||||
|
||||
**分析函数** (某些数据库下也叫做 **窗口函数** )与聚合函数类似,计算总是基于一组行的集合,不同的是,聚合函数一组只能返回一行,而分析函数每组可以返回多行,组内每一行都是基于窗口的逻辑计算的结果。分析函数可以显著优化需要 self-join 的查询。
|
||||
|
||||
### 分析函数语法
|
||||
|
||||
"窗口"也称为 FRAME,OceanBase 数据库同时支持 ROWS 与 RANGE 两种 FRAME 语义,前者是基于物理行偏移的窗口,后者则是基于逻辑值偏移的窗口。
|
||||
|
||||
分析函数语法如下:
|
||||
|
||||
```unknow
|
||||
analytic_function:
|
||||
analytic_function([ arguments ]) OVER (analytic_clause)
|
||||
|
||||
analytic_clause:
|
||||
[ query_partition_clause ] [ order_by_clause [ windowing_clause ] ]
|
||||
|
||||
query_partition_clause:
|
||||
PARTITION BY { expr[, expr ]... | ( expr[, expr ]... ) }
|
||||
|
||||
order_by_clause:
|
||||
ORDER [ SIBLINGS ] BY{ expr | position | c_alias } [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ] [, { expr | position | c_alias } [ ASC | DESC ][ NULLS FIRST | NULLS LAST ]]...
|
||||
|
||||
windowing_clause:
|
||||
{ ROWS | RANGE } { BETWEEN { UNBOUNDED PRECEDING | CURRENT ROW | value_expr {
|
||||
PRECEDING | FOLLOWING } } AND{ UNBOUNDED FOLLOWING | CURRENT ROW | value_expr {
|
||||
PRECEDING | FOLLOWING } } | { UNBOUNDED PRECEDING | CURRENT ROW| value_expr
|
||||
PRECEDING}}
|
||||
```
|
||||
|
||||
|
||||
|
||||
SUM/MIN/MAX/COUNT/AVG
|
||||
------------------------------------------
|
||||
|
||||
**声明**
|
||||
|
||||
SUM 的语法为:`SUM([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]`
|
||||
|
||||
MIN 的语法为:`MIN([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]`
|
||||
|
||||
MAX 的语法为:`MAX([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]`
|
||||
|
||||
COUNT 的语法为:`COUNT({ * | [ DISTINCT | ALL ] expr }) [ OVER (analytic_clause) ]`
|
||||
|
||||
AVG 的语法为:`AVG([ DISTINCT | ALL ] expr) [ OVER(analytic_clause) ]`
|
||||
|
||||
**说明**
|
||||
|
||||
以上分析函数都有对应的聚合函数,其中,`SUM` 返回 `expr` 的和,`MIN`/`MAX` 返回 `expr` 的最小值/最大值,`COUNT` 返回窗口中查询的行数,`AVG` 返回 `expr` 的平均值。
|
||||
|
||||
对于 `COUNT` 函数,如果指定了 `expr`,即返回 `expr` 不为 NULL 的统计个数,如果指定 `COUNT(*)` 返回所有行的统计数目。
|
||||
|
||||
**例子**
|
||||
|
||||
```javascript
|
||||
obclient> create table exployees(last_name char(10), salary decimal, job_id char(32));
|
||||
Query OK, 0 rows affected (0.17 sec)
|
||||
|
||||
obclient> insert into exployees values('jim', 2000, 'cleaner');
|
||||
Query OK, 1 row affected (0.03 sec)
|
||||
|
||||
obclient> insert into exployees values('mike', 12000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> insert into exployees values('lily', 13000, 'engineering');
|
||||
Query OK, 1 row affected (0.01 sec)
|
||||
|
||||
obclient> insert into exployees values('tom', 11000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient>select last_name, sum(salary) over(partition by job_id) totol_s, min(salary) over(partition by job_id) min_s, max(salary) over(partition by job_id) max_s, count(*) over(partition by job_id) count_s from exployees;
|
||||
+-----------+---------+-------+-------+---------+
|
||||
| last_name | totol_s | min_s | max_s | count_s |
|
||||
+-----------+---------+-------+-------+---------+
|
||||
| jim | 2000 | 2000 | 2000 | 1 |
|
||||
| mike | 36000 | 11000 | 13000 | 3 |
|
||||
| lily | 36000 | 11000 | 13000 | 3 |
|
||||
| tom | 36000 | 11000 | 13000 | 3 |
|
||||
+-----------+---------+-------+-------+---------+
|
||||
4 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
NTH_VALUE/FIRST_VALUE/LAST_VALUE
|
||||
-----------------------------------------------------
|
||||
|
||||
**声明**
|
||||
|
||||
NTH_VALUE 的语法为:`NTH_VALUE (measure_expr, n) [ FROM { FIRST | LAST } ] [ { RESPECT | IGNORE } NULLS ] OVER (analytic_clause)`
|
||||
|
||||
FIRST_VALUE 的语法为:`FIRST_VALUE { (expr) [ {RESPECT | IGNORE} NULLS ] | (expr [ {RESPECT | IGNORE} NULLS ])} OVER (analytic_clause)`
|
||||
|
||||
LAST_VALUE 的语法为:`LAST_VALUE { (expr) [ {RESPECT | IGNORE} NULLS ] | (expr [ {RESPECT | IGNORE} NULLS ])} OVER (analytic_clause)`
|
||||
|
||||
**说明**
|
||||
|
||||
NTH_VALUE 函数表示第几个值,方向由 `[ FROM { FIRST | LAST } ]` 确定,默认为 `FROM FIRST`,含有是否忽略 NULL 值的标志。其窗口为统一的 `analytic_clause`。这里 `n` 应该是正数,如果 `n` 是 NULL,函数将返回错误;如果 `n` 大于窗口内所有的行数,此函数将返回 NULL。
|
||||
|
||||
FIRST_VALUE 和 LAST_VALUE 表示从第一个开始计数或者是从最后一个开始计数。
|
||||
|
||||
**例子**
|
||||
|
||||
```javascript
|
||||
obclient> create table exployees(last_name char(10), salary decimal, job_id char(32));
|
||||
Query OK, 0 rows affected (0.08 sec)
|
||||
|
||||
obclient> insert into exployees values('jim', 2000, 'cleaner');
|
||||
Query OK, 1 row affected (0.11 sec)
|
||||
|
||||
obclient> insert into exployees values('mike', 12000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> insert into exployees values('lily', 13000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> insert into exployees values('tom', 11000, 'engineering');
|
||||
Query OK, 1 row affected (0.01 sec)
|
||||
|
||||
obclient> select last_name, first_value(salary) over(partition by job_id) totol_s, last_value(salary) over(partition by job_id) min_s, max(salary) over(partition by job_id) max_s from exployees;
|
||||
+-----------+---------+-------+-------+
|
||||
| last_name | totol_s | min_s | max_s |
|
||||
+-----------+---------+-------+-------+
|
||||
| jim | 2000 | 2000 | 2000 |
|
||||
| mike | 12000 | 11000 | 13000 |
|
||||
| lily | 12000 | 11000 | 13000 |
|
||||
| tom | 12000 | 11000 | 13000 |
|
||||
+-----------+---------+-------+-------+
|
||||
4 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
LEAD/LAG
|
||||
-----------------------------
|
||||
|
||||
**声明**
|
||||
|
||||
LEAD 的语法为:`LEAD { ( value_expr [, offset [, default]]) [ { RESPECT | IGNORE } NULLS ] | ( value_expr [ { RESPECT | IGNORE } NULLS ] [, offset [, default]] )} OVER ([ query_partition_clause ] order_by_clause)`
|
||||
|
||||
LAG 的语法为:`LAG { ( value_expr [, offset [, default]]) [ { RESPECT | IGNORE } NULLS ] | ( value_expr [ { RESPECT | IGNORE } NULLS ] [, offset [, default]] )} OVER ([ query_partition_clause ] order_by_clause)`
|
||||
|
||||
**说明**
|
||||
|
||||
LEAD 和 LAG 含义为可以在一次查询中取出当前行的同一个字段的前面或后面第 N 行的数据,这种操作可以使用相同表的自连接来实现,但 LEAD/LAG 窗口函数有更高的效率。
|
||||
|
||||
其中,`value_expr` 是要做比对的字段,`offset` 是 `value_expr` 的偏移量,`default` 参数的默认值为 NULL,即如果在 LEAD/LAG 没有显示的设置 `default` 值的情况下,返回值为 NULL。例如:对 LAG 来说,当前行为 4,`offset` 值为 6,这时候所要找的数据就是第 -2 行,不存在此行即返回 `default` 的值。
|
||||
|
||||
`[ { RESPECT | IGNORE } NULLS ]` 的语法为是否考虑 NULL 值,默认为 `RESPECT`,考虑 NULL 值。
|
||||
|
||||
注意 LEAD/LAG 两个函数后必须有 `order_by_clause`,数据应该在一个列上排序之后才能有前多少行后多少行的概念。`query_partition_clause` 是可选的,如果没有 `query_partition_clause`,就是全局的数据。
|
||||
|
||||
**例子**
|
||||
|
||||
```unknow
|
||||
obclient> create table exployees(last_name char(10), salary decimal, job_id char(32));
|
||||
Query OK, 0 rows affected (0.08 sec)
|
||||
|
||||
obclient> insert into exployees values('jim', 2000, 'cleaner');
|
||||
Query OK, 1 row affected (0.11 sec)
|
||||
|
||||
obclient> insert into exployees values('mike', 12000, 'engineering');
|
||||
Query OK, 1 row affected (0.01 sec)
|
||||
|
||||
obclient> insert into exployees values('lily', 13000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> insert into exployees values('tom', 11000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> select last_name, lead(salary) over(order by salary) lead, lag(salary) over(order by salary) lag from exployees;
|
||||
+-----------+-------+-------+
|
||||
| last_name | lead | lag |
|
||||
+-----------+-------+-------+
|
||||
| jim | 11000 | NULL |
|
||||
| tom | 12000 | 2000 |
|
||||
| mike | 13000 | 11000 |
|
||||
| lily | NULL | 12000 |
|
||||
+-----------+-------+-------+
|
||||
4 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
STDDEV/VARIANCE/STDDEV_SAMP/STDDEV_POP
|
||||
-----------------------------------------------------------
|
||||
|
||||
**声明**
|
||||
|
||||
VARIANCE 的语法为:`VARIANCE([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]`
|
||||
|
||||
STDDEV 的语法为:`STDDEV([ DISTINCT | ALL ] expr) [ OVER (analytic_clause) ]`
|
||||
|
||||
STDDEV_SAMP 的语法为:`STDDEV_SAMP(expr) [ OVER (analytic_clause) ]`
|
||||
|
||||
STDDEV_POP 的语法为:`STDDEV_POP(expr) [ OVER (analytic_clause) ]`
|
||||
|
||||
**说明**
|
||||
|
||||
VARIANCE 返回的是 `expr` 的方差,`expr` 可能是数值类型或者可以转换成数值类型的类型,方差的类型和输入的值的类型相同。
|
||||
|
||||
STDDEV 返回的是 `expr` 的标准差,参数类型方面和 VARIANCE 的相同。
|
||||
|
||||
STDDEV_SAMP 返回的是样本标准差。
|
||||
|
||||
STDDEV_POP 返回的是总体标准差。
|
||||
|
||||
**例子**
|
||||
|
||||
```javascript
|
||||
obclient> create table exployees(last_name char(10), salary decimal, job_id char(32));
|
||||
Query OK, 0 rows affected (0.08 sec)
|
||||
|
||||
obclient> insert into exployees values('jim', 2000, 'cleaner');
|
||||
Query OK, 1 row affected (0.11 sec)
|
||||
|
||||
obclient> insert into exployees values('mike', 12000, 'engineering');
|
||||
Query OK, 1 row affected (0.01 sec)
|
||||
|
||||
obclient> insert into exployees values('lily', 13000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> insert into exployees values('tom', 11000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> select last_name, stddev(salary) over(order by salary) std, variance(salary) over(order by salary) var, stddev_pop(salary) over() std_pop, stddev_samp(salary) over() from exployees;
|
||||
+-----------+-------------------+--------------------+-------------------+----------------------------+
|
||||
| last_name | std | var | std_pop | stddev_samp(salary) over() |
|
||||
+-----------+-------------------+--------------------+-------------------+----------------------------+
|
||||
| jim | 0 | 0 | 4387.482193696061 | 5066.228051190222 |
|
||||
| tom | 4500 | 20250000 | 4387.482193696061 | 5066.228051190222 |
|
||||
| mike | 4496.912521077347 | 20222222.222222224 | 4387.482193696061 | 5066.228051190222 |
|
||||
| lily | 4387.482193696061 | 19250000 | 4387.482193696061 | 5066.228051190222 |
|
||||
+-----------+-------------------+--------------------+-------------------+----------------------------+
|
||||
4 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
NTILE
|
||||
--------------------------
|
||||
|
||||
**声明**
|
||||
|
||||
`NTILE(expr) OVER ([ query_partition_clause ] order_by_clause)`
|
||||
|
||||
**说明**
|
||||
|
||||
NTILE 函数将分区中已经排序的行划分为大小尽可能相同的指定数量的分组,并返回给每行组号。`expr` 如果是 NULL,则返回 NULL。
|
||||
|
||||
例子
|
||||
|
||||
```javascript
|
||||
obclient> create table exployees(last_name char(10), salary decimal, job_id char(32));
|
||||
Query OK, 0 rows affected (0.08 sec)
|
||||
|
||||
obclient> insert into exployees values('jim', 2000, 'cleaner');
|
||||
Query OK, 1 row affected (0.11 sec)
|
||||
|
||||
obclient> insert into exployees values('mike', 12000, 'engineering');
|
||||
Query OK, 1 row affected (0.01 sec)
|
||||
|
||||
obclient> insert into exployees values('lily', 13000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> insert into exployees values('tom', 11000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> select last_name, ntile(10) over(partition by job_id order by salary) ntl from exployees;
|
||||
+-----------+------+
|
||||
| last_name | ntl |
|
||||
+-----------+------+
|
||||
| jim | 1 |
|
||||
| tom | 1 |
|
||||
| mike | 2 |
|
||||
| lily | 3 |
|
||||
+-----------+------+
|
||||
4 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
ROW_NUMBER
|
||||
-------------------------------
|
||||
|
||||
声明
|
||||
|
||||
`ROW_NUMBER( ) OVER ([ query_partition_clause ] order_by_clause)`
|
||||
|
||||
说明
|
||||
|
||||
ROW_NUMBER 函数按照 `order_by_clause` 子句中指定的行的顺序,为每一行分配一个编号。
|
||||
|
||||
例子
|
||||
|
||||
```javascript
|
||||
obclient> create table exployees(last_name char(10), salary decimal, job_id char(32));
|
||||
Query OK, 0 rows affected (0.08 sec)
|
||||
|
||||
obclient> insert into exployees values('jim', 2000, 'cleaner');
|
||||
Query OK, 1 row affected (0.11 sec)
|
||||
|
||||
obclient> insert into exployees values('mike', 12000, 'engineering');
|
||||
Query OK, 1 row affected (0.01 sec)
|
||||
|
||||
obclient> insert into exployees values('lily', 13000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> insert into exployees values('tom', 11000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> select last_name, row_number() over(partition by job_id order by salary) ntl from exployees;
|
||||
+-----------+------+
|
||||
| last_name | ntl |
|
||||
+-----------+------+
|
||||
| jim | 1 |
|
||||
| tom | 1 |
|
||||
| mike | 2 |
|
||||
| lily | 3 |
|
||||
+-----------+------+
|
||||
4 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
RANK/DENSE_RANK/PERCENT_RANK
|
||||
-------------------------------------------------
|
||||
|
||||
**声** **明**
|
||||
|
||||
RANK 的语法为:`RANK( ) OVER ([ query_partition_clause ] order_by_clause)`
|
||||
|
||||
DENSE_RANK 的语法为:`DENSE_RANK( ) OVER([ query_partition_clause ] order_by_clause)`
|
||||
|
||||
PERCENT_RANK 的语法为:`PERCENT_RANK( ) OVER ([ query_partition_clause ] order_by_clause)`
|
||||
|
||||
**说明**
|
||||
|
||||
RANK 计算每一行数据在某列上的排序,该列由 `order_by_clause` 中的列决定。例如,按照 salary 排序可以看出员工的收入排名。
|
||||
|
||||
DENSE_RANK 的语义基本和 RANK 函数相同,但是 RANK 的排序中间会有'跳过',但是 DENSE_RANK 中不会有。
|
||||
|
||||
PERCENT_RANK 的语义基本和 RANK 函数相同,但是 PERCENT_RANK 排序的结果是百分比,计算的是给定行的百分比。
|
||||
|
||||
**例子**
|
||||
|
||||
```unknow
|
||||
obclient> create table exployees(last_name char(10), salary decimal, job_id char(32));
|
||||
Query OK, 0 rows affected (0.10 sec)
|
||||
|
||||
obclient> insert into exployees values('jim', 2000, 'cleaner');
|
||||
Query OK, 1 row affected (0.11 sec)
|
||||
|
||||
obclient> insert into exployees values('mike', 12000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> insert into exployees values('lily', 13000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> insert into exployees values('tom', 11000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> select last_name, rank() over(partition by job_id order by salary) rank, dense_rank() over(partition by job_id order by salary) dense_rank, percent_rank() over(partition by job_id order by salary) percent_rank from exployees;
|
||||
+-----------+------+------------+----------------------------------+
|
||||
| last_name | rank | dense_rank | percent_rank |
|
||||
+-----------+------+------------+----------------------------------+
|
||||
| jim | 1 | 1 | 0.000000000000000000000000000000 |
|
||||
| tom | 1 | 1 | 0.000000000000000000000000000000 |
|
||||
| mike | 2 | 2 | 0.500000000000000000000000000000 |
|
||||
| lily | 3 | 3 | 1.000000000000000000000000000000 |
|
||||
+-----------+------+------------+----------------------------------+
|
||||
4 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
CUME_DIST
|
||||
------------------------------
|
||||
|
||||
**声明**
|
||||
|
||||
`CUME_DIST() OVER ([ query_partition_clause ] order_by_clause)`
|
||||
|
||||
**说明**
|
||||
|
||||
该函数计算一个值的分布,返回值为大于 0 小于等于 1 的值。作为一个分析函数,CUME_DIST 在升序情况下计算比当前行的特定列小的数据的占比。例如如下例子中,按 job_id 分组并在薪水排序的情况下,每行数据在窗口内的排序列上的占比。
|
||||
|
||||
**例子**
|
||||
|
||||
```unknow
|
||||
obclient> create table exployees(last_name char(10), salary decimal, job_id char(32));
|
||||
Query OK, 0 rows affected (0.10 sec)
|
||||
|
||||
obclient> insert into exployees values('jim', 2000, 'cleaner');
|
||||
Query OK, 1 row affected (0.11 sec)
|
||||
|
||||
obclient> insert into exployees values('mike', 12000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> insert into exployees values('lily', 13000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> insert into exployees values('tom', 11000, 'engineering');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> select last_name, cume_dist() over(partition by job_id order by salary) cume_dist from exployees;
|
||||
+-----------+----------------------------------+
|
||||
| last_name | cume_dist |
|
||||
+-----------+----------------------------------+
|
||||
| jim | 1.000000000000000000000000000000 |
|
||||
| tom | 0.333333333333333333333333333333 |
|
||||
| mike | 0.666666666666666666666666666667 |
|
||||
| lily | 1.000000000000000000000000000000 |
|
||||
+-----------+----------------------------------+
|
||||
4 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
@ -1,94 +0,0 @@
|
||||
信息函数
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
FOUND_ROWS
|
||||
-------------------
|
||||
|
||||
|
||||
|
||||
**声明**
|
||||
|
||||
`found_rows()`
|
||||
|
||||
**说明**
|
||||
|
||||
一个SELECT语句可能包含一个LIMIT子句,用来限制数据库服务器端返回客户端的行数。在某些情况下,我们需要不再次运行该语句而得知在没有LIMIT时到底该语句返回了多少行。我们可以在SELECT语句中选择使用SQL_CALC_FOUND_ROWS, 然后调用FOUND_ROW()函数,获取该语句在没有LIMIT时返回的行数。
|
||||
|
||||
例如:
|
||||
|
||||
```javascript
|
||||
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
|
||||
-> WHERE id > 100 LIMIT 10;
|
||||
mysql> SELECT FOUND_ROWS();
|
||||
```
|
||||
|
||||
|
||||
|
||||
第二个SELECT语句返回一个数字,表示在没有LIMIT子句的情况下,第一个SELECT语句返回了多少行。(若上述的SELECT语句在不使用SQL_CALC_FOUND_ROWS选项时,使用LIMIT和不使用LIMIT时候, FOUND_ROWS()可能会返回不同的结果)。
|
||||
|
||||
通过FOUND_ROWS()函数返回的有效行数是瞬时的,并且不能越过SELECT SQL_CALC_FOUND_ROWS语句后面的语句。如果你后续还需要用到这个值,就需要将其保存。
|
||||
|
||||
例如:
|
||||
|
||||
```javascript
|
||||
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ;
|
||||
mysql> SET @rows = FOUND_ROWS();
|
||||
```
|
||||
|
||||
|
||||
|
||||
假如你正在使用SQL_CALC_FOUND_ROWS,系统必须计算出在全部结果集合中有多少行。尽管如此,这也还是比不用LIMIT而再次运行查询要快,原因是结果集合不需要被发送到客户端。
|
||||
|
||||
SQL_CALC_FOUND_ROWS和FOUND_ROWS()在当你希望限制一个查询返回的行数时是很有用的,同时还能不需要再次运行查询就可以确定全部结果集合中的行数。一个 **例子** 就是提供页式显示的Web脚本,该显示包含显示搜索结果其他部分的页的链接。使用FOUND_ROWS()使你确定剩下的结果需要多少其他的页。
|
||||
|
||||
SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 的应用对于UNION 查询比对于简单SELECT 语句更为复杂,原因是在UNION 中,LIMIT 可能会出现在多个位置。它可能适用于UNION中的独立的SELECT语句,或是整个的UNION 结果。
|
||||
|
||||
SQL_CALC_FOUND_ROWS对于 UNION的期望结果是它返回在没有全局的LIMIT的条件下而应返回的行数。SQL_CALC_FOUND_ROWS 和UNION 一同使用的条件是:
|
||||
|
||||
* SQL_CALC_FOUND_ROWS 关键词必须出现在UNION的第一个 SELECT中。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* FOUND_ROWS()的值只有在使用 UNION ALL时才是精确的。若使用不带ALL的UNION,则会发生两次删除,而FOUND_ROWS() 的指只需近似的。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 假若UNION 中没有出现LIMIT ,则SQL_CALC_FOUND_ROWS 被忽略,返回临时表中的创建的用来处理UNION的行数。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LAST_INSERT_ID()
|
||||
-------------------------
|
||||
|
||||
**声明**
|
||||
|
||||
`last_insert_id()`
|
||||
|
||||
**说明**
|
||||
|
||||
返回本session最后一次插入的自增字段值,如最近一条insert插入多条记录,LAST_INSERT_ID()返回第一条记录的自增字段值。
|
||||
|
||||
**例子**
|
||||
|
||||
```javascript
|
||||
mysql>select LAST_INSERT_ID();
|
||||
+------------------+
|
||||
| LAST_INSERT_ID() |
|
||||
+------------------+
|
||||
| 5 |
|
||||
+------------------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
@ -1,185 +0,0 @@
|
||||
其它函数
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
COALESCE
|
||||
-----------------
|
||||
|
||||
**声明**
|
||||
|
||||
`COALESCE(expr, expr, expr,...)`
|
||||
|
||||
**说明**
|
||||
|
||||
依次参考各参数表达式,遇到非NULL值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。
|
||||
|
||||
所有表达式必须是相同类型,或者可以隐性转换为相同的类型。
|
||||
|
||||
**例子**
|
||||
|
||||
```javascript
|
||||
Oceanbase>SELECT COALESCE(NULL,NULL,3,4,5), COALESCE(NULL,NULL,NULL);
|
||||
+---------------------------+--------------------------+
|
||||
| COALESCE(NULL,NULL,3,4,5) | COALESCE(NULL,NULL,NULL) |
|
||||
+---------------------------+--------------------------+
|
||||
| 3 | NULL |
|
||||
+---------------------------+--------------------------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
NVL
|
||||
------------
|
||||
|
||||
**声明**
|
||||
|
||||
`NVL(str1,replace_with)`
|
||||
|
||||
**说明**
|
||||
|
||||
如果 str1 为 NULL,则替换成 replace_with。
|
||||
|
||||
任何时候给它一个空值,它都返回一个你所选择的值。这种能够自动替换空值的能力有助于提供看上去更为完善的输出。其中 str1 一般是一个列名。replace_with 可以是任何值:直接值(即硬编码)、对其他列的引用或者表达式。
|
||||
|
||||
**例子**
|
||||
|
||||
```javascript
|
||||
Oceanbase>SELECT NVL(NULL, 0), NVL(NULL, 'a');
|
||||
+--------------+----------------+
|
||||
| NVL(NULL, 0) | NVL(NULL, 'a') |
|
||||
+--------------+----------------+
|
||||
| 0 | a |
|
||||
+--------------+----------------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
SLEEP
|
||||
--------------
|
||||
|
||||
**声明**
|
||||
|
||||
`SLEEP(duration)`
|
||||
|
||||
**说明**
|
||||
|
||||
SLEEP函数根据duration指定的数值暂停相应的时间(单位为秒),并在暂停结束后返回0。
|
||||
|
||||
如果SLEEP单独执行且没有被中断,返回结果0;
|
||||
|
||||
如果SLEEP单独执行期间被中断,返回结果1,但不会返回任何错误码;
|
||||
|
||||
如果SLEEP是查询的一部分,且暂停期间被中断,将会返回错误码1317;
|
||||
|
||||
**例子**
|
||||
|
||||
```javascript
|
||||
mysql> SELECT SLEEP(1000);
|
||||
+------------------+
|
||||
| SLEEP(1000) |
|
||||
+------------------+
|
||||
| 0 |
|
||||
+------------------+
|
||||
|
||||
mysql> SELECT SLEEP(1000);
|
||||
+------------------+
|
||||
| SLEEP(1000) |
|
||||
+------------------+
|
||||
| 1 |
|
||||
+------------------+
|
||||
|
||||
mysql> SELECT 1 FROM t1 WHERE SLEEP(1000);
|
||||
ERROR 1317 (70100): Query execution was interrupted
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
全文查找函数
|
||||
---------------
|
||||
|
||||
**声明**
|
||||
|
||||
```javascript
|
||||
MATCH (col1,col2,...) AGAINST (expr [search_modifier])
|
||||
search_modifier:
|
||||
{
|
||||
IN NATURAL LANGUAGE MODE
|
||||
| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
|
||||
| IN BOOLEAN MODE
|
||||
| WITH QUERY EXPANSION
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
**说明**
|
||||
|
||||
OceanBase1.0已经支持使用全文查找函数来对全文索引进行查找,并且使用全文查找函数有以下要求:
|
||||
|
||||
* 全文查找函数MATCH(col1,col2,...)中指定的列上必须有全文索引(OB目前只支持FULLTEXT CTXCAT索引)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 在FULLTEXT CTXCAT索引中,全文查找函数MATCH(col1,col2,...)中指定的列必须完整的覆盖索引中的全文列,例如FULLTEXT INDEX(c1, c2, c3), CTXCAT(c2, c3) 必须是 MATCH(c2,c3) 才能完全的匹配
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 全文查找函数可以通过上述的关键字来指定查找模式(OB目前只支持NATURAL LANGUAGE MODE和BOOLEAN MODE两种模式),缺省是NATURAL LANGUAGE MODE
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
默认情况下或者指定IN NATURAL LANGUAGE MODE标示符,MATCH...AGAINST将使用NATURAL LANGUAGE模式来进行全文查找,在NATURAL LANGUAGE模式下,AGAINST接受一个查找字符串,并且按照字符集的比较方式在索引中进行查找,对于表中的每一行数据,MATCH的返回值代表了查找字符串和行中数据的相关度,也就是查找字符串中的文本和数据表中的文本相似度。在默认情况下,OB创建的字符串相关的列是大小写不敏感的,因此,全文查找的关键字是不区分大小写的。如果需要区分大小写,可以为创建全文索引的列指定大小写敏感的数据类型,例如UTF8MB4_BIN。如果MATCH...AGAINST函数被用在WHERE子句中,MATCH被用来过滤跟关键字相关度不匹配的数据,MATCH...AGAINST=0表示没有和关键字相似的数据,目前OB只支持MATCH...AGAINST=0和MATCH...AGAINST\>0两种形式,即完全不相关或者有任意一个关键字相关即可。AGAINST参数中可以接受多个关键字,关键字之间使用' '隔开,表示OR关系,只要有任意一个关键字匹配,即认为符合查找的要求。
|
||||
|
||||
OB可以通过使用IN BOOLEAN MODE关键字来进行BOOLEAN模式的全文查找。在这种模式中,关键字前面一些特殊的操作符含有特殊的语义。例如:
|
||||
|
||||
```javascript
|
||||
SELECT * FROM t1 WHERE MATCH (a, b) AGAINST ('菊花 茉莉花' IN BOOLEAN MODE);
|
||||
+----+------------+------------+
|
||||
| id | a | b |
|
||||
+----+------------+------------+
|
||||
| 1 | 支付宝 | 菊花茶 |
|
||||
| 2 | 淘宝 | 茉莉花 |
|
||||
+----+------------+------------+
|
||||
|
||||
SELECT * FROM t1 WHERE MATCH (a, b)
|
||||
AGAINST ('+菊花 -茉莉花' IN BOOLEAN MODE);
|
||||
+----+------------+------------+
|
||||
| id | a | b |
|
||||
+----+------------+------------+
|
||||
| 1 | 支付宝 | 菊花茶 |
|
||||
+----+------------+------------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
OB的BOOLEAN全文查找目前支持以下几种操作符:+ 代表AND关系,表示查找结果中同时要包含被+修饰的关键字- 代表NOT关系,表示查找结果中不能包含被-修饰的关键字。
|
||||
|
||||
```javascript
|
||||
(no operator) 代表OR关系,表示查找结果中只要包含任意一个没有操作符修饰的关键字即可
|
||||
```
|
||||
|
||||
|
||||
|
||||
在BOOLEAN全文查找模式中有以下几点需要注意:操作符必须位于关键字的前面,关键字后面的操作符没有修饰意义,例如+菊花是有意义的操作符修饰,而菊花+中的操作符没有修饰意义。操作符和关键字必须紧密相连,不能被其它符号分割开,否者没有修饰意义,例如:+ 菊花前面的操作符没有修饰意义。
|
@ -1,60 +0,0 @@
|
||||
概述
|
||||
=======================
|
||||
|
||||
|
||||
|
||||
查询(SQL)是指数据库中用来获取数据的方式,它可搭配条件限制的子句(如where),排列顺序的子句(如order by)等语句来获取查询结果。子查询是指嵌套在一个上层查询中的查询。上层的查询一般被称为父查询或外层查询。子查询的结果作为输入传递回"父查询"或"外部查询"。父查询将这个值结合到计算中,以便确定最后的输出。SQL语言允许多层嵌套查询,即一个子查询中还可以嵌套其他子查询。同时,子查询可以出现在SQL语句中的各种子句中,比如select语句,from语句,where语句等。
|
||||
|
||||
子查询
|
||||
------------
|
||||
|
||||
在数据库中,子查询可以分成有依赖关系的子查询和没有依赖关系的子查询。有依赖关系的子查询是指该子查询的执行依赖了外部查询的'变量',所以这种子查询通常会被计算多次。没有依赖关系的子查询是指该子查询的执行不依赖外部查询的'变量', 这种子查询一般只需要计算一次。下图分别展示了一个没有依赖关系的子查询和一个有依赖关系的子查询。
|
||||
|
||||
```javascript
|
||||
OceanBase (root@test)> create table t1(a int primary key, b int, c int);
|
||||
Query OK, 0 rows affected (0.70 sec)
|
||||
OceanBase (root@test)> create table t2(a int primary key, b int, c int);
|
||||
Query OK, 0 rows affected (0.92 sec)
|
||||
-- 没有依赖关系的子查询
|
||||
OceanBase (root@test)> select * from t1 where t1.a in (select t2.a from t2);
|
||||
Empty set (0.22 sec)
|
||||
-- 有依赖关系的子查询,子查询中用到了外层查询变量t1.b
|
||||
OceanBase (root@test)> select * from t1 where t1.a in (select t2.a from t2 where t2.b = t1.b);
|
||||
Empty set (0.05 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
子查询展开(subquery unnesting)
|
||||
----------------------------------
|
||||
|
||||
子查询展开是数据库的一种优化策略,它把一些子查询置于外层的父查询中,其实质是把某些子查询转化为等价的多表连接操作。这种策略带来的一个明显的好处就是,有写访问路径,连接方法和连接顺序可能被有效的利用,使得查询语句的层次尽可能的减少。下图展示了一个子查询展开的例子,既子查询被改写成了连接语句。
|
||||
|
||||
```javascript
|
||||
OceanBase (root@test)> create table t1(a int primary key, b int, c int);
|
||||
Query OK, 0 rows affected (0.70 sec)
|
||||
OceanBase (root@test)> create table t2(a int primary key, b int, c int);
|
||||
Query OK, 0 rows affected (0.92 sec)
|
||||
--- 有依赖关系的子查询被展开改写成连接
|
||||
OceanBase (root@test)> explain select * from t1 where t1.a in (select t2.b from t2 where t2.c = t1.c);
|
||||
| =======================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
---------------------------------------
|
||||
|0 |HASH SEMI JOIN| |1 |2924|
|
||||
|1 | TABLE SCAN |t1 |1000 |455 |
|
||||
|2 | TABLE SCAN |t2 |1000 |455 |
|
||||
=======================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([t1.a], [t1.b], [t1.c]), filter(nil),
|
||||
equal_conds([t1.a = t2.b], [t2.c = t1.c]), other_conds(nil)
|
||||
1 - output([t1.c], [t1.a], [t1.b]), filter(nil),
|
||||
access([t1.c], [t1.a], [t1.b]), partitions(p0)
|
||||
2 - output([t2.c], [t2.b]), filter(nil),
|
||||
access([t2.c], [t2.b]), partitions(p0)
|
||||
```
|
||||
|
||||
|
@ -1,103 +0,0 @@
|
||||
连接
|
||||
=======================
|
||||
|
||||
|
||||
|
||||
数据库中的连接语句用于将数据库中的两个或多个表根据连接条件组合起来。由"连接"生成的集合, 可以被保存为表, 或者当成表来使用。连接语句的含义是把两张表的属性通过它们的值组合在一起。数据库中的连接类型一般包括inner join,outer join,semi-join和anti-join。其中Semi-join和Anti-join都是通过子查询改写得到,SQL本身并没有表述Anti-join和Semi-join的语法
|
||||
|
||||
连接条件
|
||||
-------------
|
||||
|
||||
连接条件可以分为等值连接(比如t1.a = t2.b)和非等值连接(t1.a \< t2.b)。相比于非等值连接条件, 等值连接条件的一个好处是允许数据库中使用高效的连接算法,比如Hash Join和Merge-Sort join。
|
||||
|
||||
Self-join
|
||||
------------------
|
||||
|
||||
Self-Join是指跟跟自己表做连接的join。下图展示了一个self join的例子。
|
||||
|
||||
```javascript
|
||||
OceanBase (root@test)> create table t1(a int primary key, b int, c int);
|
||||
Query OK, 0 rows affected (0.70 sec)
|
||||
---一个self join的例子
|
||||
OceanBase (root@test)> select * from t1 as ta, t1 as tb where ta.b = tb.b
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
内连接(inner join)
|
||||
------------------------
|
||||
|
||||
Inner Join(内连接)是数据库中最基本的连接操作。内连接基于连接条件将两张表(如 A 和 B)的列组合在一起,产生新的结果表。查询会将 A 表的每一行和 B 表的每一行进行比较,并找出满足连接条件的组合。当连接条件被满足,A 和 B 中匹配的行会按列组合(并排组合)成结果集中的一行。连接产生的结果集,可以定义为首先对两张表做笛卡尔积(交叉连接) -- 将 A 中的每一行和 B 中的每一行组合,然后返回满足连接条件的记录。
|
||||
|
||||
外连接(outer join)
|
||||
------------------------
|
||||
|
||||
Outer Join(外连接)并不要求连接的两表的每一条记录在对方表中都一条匹配的记录。要保留所有记录(甚至这条记录没有匹配的记录也要保留)的表称为保留表 **。** 外连接可依据连接表保留左表, 右表或全部表的行而进一步分为左外连接, 右外连接和全连接。其中左外连接中左表的一行未在右表中找到的时候,就在右表自动填充NULL。右外连接中右表的一行未在左表中找到的时候,就在左表自动填充NULL。全连接就是左表或者右表找不匹配行的时候都会自动填充。
|
||||
|
||||
Semi连接 (semi-join)
|
||||
---------------------------
|
||||
|
||||
当A表和B表进行left/right semi-join的时候,它只返回A/B表中所有能够在B/A中找到匹配的行。Semi-join只能通过子查询展开得到,如下图所示。
|
||||
|
||||
```javascript
|
||||
OceanBase (root@test)> create table t1(a int primary key, b int, c int);
|
||||
Query OK, 0 rows affected (0.70 sec)
|
||||
OceanBase (root@test)> create table t2(a int primary key, b int, c int);
|
||||
Query OK, 0 rows affected (0.92 sec)
|
||||
--- 有依赖关系的子查询被展开改写成Semi-join
|
||||
OceanBase (root@test)> explain select * from t1 where t1.a in (select t2.b from t2 where t2.c = t1.c);
|
||||
| =======================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
---------------------------------------
|
||||
|0 |HASH SEMI JOIN| |1 |2924|
|
||||
|1 | TABLE SCAN |t1 |1000 |455 |
|
||||
|2 | TABLE SCAN |t2 |1000 |455 |
|
||||
=======================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([t1.a], [t1.b], [t1.c]), filter(nil),
|
||||
equal_conds([t1.a = t2.b], [t2.c = t1.c]), other_conds(nil)
|
||||
1 - output([t1.c], [t1.a], [t1.b]), filter(nil),
|
||||
access([t1.c], [t1.a], [t1.b]), partitions(p0)
|
||||
2 - output([t2.c], [t2.b]), filter(nil),
|
||||
access([t2.c], [t2.b]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Anti-连接(anti-join)
|
||||
---------------------------
|
||||
|
||||
当A表和B表进行left/right anti-join的时候,它只返回A/B中所有不能再B/A中找到匹配的行。类似于Semi-join, anti-join也只能通过子查询展开得到,如下图所示。
|
||||
|
||||
```javascript
|
||||
OceanBase (root@test)> create table t1(a int primary key, b int, c int);
|
||||
Query OK, 0 rows affected (0.70 sec)
|
||||
OceanBase (root@test)> create table t2(a int primary key, b int, c int);
|
||||
Query OK, 0 rows affected (0.92 sec)
|
||||
---有依赖关系的子查询被改写成Anti-join
|
||||
OceanBase (root@test)> explain select * from t1 where t1.a not in (select t2.b from t2 where t2.c = t1.c);
|
||||
| =======================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
---------------------------------------
|
||||
|0 |HASH ANTI JOIN| |995 |3262|
|
||||
|1 | TABLE SCAN |t1 |1000 |455 |
|
||||
|2 | TABLE SCAN |t2 |1000 |455 |
|
||||
=======================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([t1.a], [t1.b], [t1.c]), filter(nil),
|
||||
equal_conds([t2.c = t1.c]), other_conds([t1.a = t2.b OR (T_OP_IS, t2.b, NULL, 0)])
|
||||
1 - output([t1.c], [t1.a], [t1.b]), filter(nil),
|
||||
access([t1.c], [t1.a], [t1.b]), partitions(p0)
|
||||
2 - output([t2.c], [t2.b]), filter(nil),
|
||||
access([t2.c], [t2.b]), partitions(p0)
|
||||
```
|
||||
|
||||
|
@ -1,165 +0,0 @@
|
||||
集合
|
||||
=======================
|
||||
|
||||
|
||||
|
||||
数据库中的集合操作可以把多个查询的结果组合成一个结果集。集合操作主要包含:
|
||||
|
||||
* UNION
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* INTERSECT
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* EXCEPT/MINUS在OceanBase中,我们同时支持EXCEPT与MINUS,这两者的语义是相同的。这里需要注意的是参加集合操作的各查询结果的列数必须相同,对应的数据类型也必须兼容。对与UNION来说用户可以指定UNION的属性为ALL和DISTINCT/UNIQUE。分别代表集合可重复,和集合不可重复。而其它几种集合操作是不能指定ALL属性的(它们只有DISTINCT属性)。所有的集合操作默认的属性是DISTINCT。在Oceanbase中,集合操作中可以指定order by和 limit子句,但是不允许其他子句的出现,如下图所示
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase (root@test)> create table t1(a int primary key, b int, c int);
|
||||
Query OK, 0 rows affected (0.16 sec)
|
||||
OceanBase (root@test)> create table t2(a int primary key, b int, c int);
|
||||
Query OK, 0 rows affected (0.10 sec)
|
||||
--支持union语句中出现order by和limit子句
|
||||
OceanBase (root@test)> (select * from t1 union all select * from t2) order by a limit 10;
|
||||
Empty set (0.02 sec)
|
||||
--不支持union语句中出现除order by和limit子句的其他子句,比如group by
|
||||
OceanBase (root@test)> OceanBase (root@test)> (select * from t1 union all select * from t2) group by a limit 10;
|
||||
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'OceanBase (root@test)> (select * from t1 union all select * from t2) group by a ' at line 1
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
UNION 例子
|
||||
-----------------
|
||||
|
||||
该例子获取t1和t2中所有不重复的行。
|
||||
|
||||
```javascript
|
||||
OceanBase (root@test)> create table t1(a int, b int, c int);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
OceanBase (root@test)> create table t2(a int, b int, c int);
|
||||
Query OK, 0 rows affected (0.11 sec)
|
||||
OceanBase (root@test)> insert into t1 values (1,1,1),(2,2,2),(3,3,3);
|
||||
Query OK, 3 rows affected (0.07 sec)
|
||||
Records: 3 Duplicates: 0 Warnings: 0
|
||||
OceanBase (root@test)> insert into t2 values (2,2,2),(3,3,3),(4,4,4);
|
||||
Query OK, 3 rows affected (0.02 sec)
|
||||
Records: 3 Duplicates: 0 Warnings: 0
|
||||
OceanBase (root@test)> select * from t1 union select * from t2;
|
||||
+------+------+------+
|
||||
| a | b | c |
|
||||
+------+------+------+
|
||||
| 1 | 1 | 1 |
|
||||
| 2 | 2 | 2 |
|
||||
| 3 | 3 | 3 |
|
||||
| 4 | 4 | 4 |
|
||||
+------+------+------+
|
||||
4 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
UNION All 例子
|
||||
---------------------
|
||||
|
||||
该例子获取t1和t2中的所有行,不进行去重。
|
||||
|
||||
```javascript
|
||||
OceanBase (root@test)> create table t1(a int, b int, c int);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
OceanBase (root@test)> create table t2(a int, b int, c int);
|
||||
Query OK, 0 rows affected (0.11 sec)
|
||||
OceanBase (root@test)> insert into t1 values (1,1,1),(2,2,2),(3,3,3);
|
||||
Query OK, 3 rows affected (0.07 sec)
|
||||
Records: 3 Duplicates: 0 Warnings: 0
|
||||
OceanBase (root@test)> insert into t1 values (2,2,2),(3,3,3),(4,4,4);
|
||||
Query OK, 3 rows affected (0.02 sec)
|
||||
Records: 3 Duplicates: 0 Warnings: 0
|
||||
OceanBase (root@test)> select * from t1 union all select * from t2;
|
||||
+------+------+------+
|
||||
| a | b | c |
|
||||
+------+------+------+
|
||||
| 1 | 1 | 1 |
|
||||
| 2 | 2 | 2 |
|
||||
| 3 | 3 | 3 |
|
||||
| 2 | 2 | 2 |
|
||||
| 3 | 3 | 3 |
|
||||
| 4 | 4 | 4 |
|
||||
+------+------+------+
|
||||
6 rows in set (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
INTERSECT 例子
|
||||
---------------------
|
||||
|
||||
该例子获取同时出现在t1和t2中行,并且去重。
|
||||
|
||||
```javascript
|
||||
OceanBase (root@test)> create table t1(a int, b int, c int);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
OceanBase (root@test)> create table t2(a int, b int, c int);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
OceanBase (root@test)> insert into t1 values (1,1,1),(2,2,2),(3,3,3);
|
||||
Query OK, 3 rows affected (0.02 sec)
|
||||
Records: 3 Duplicates: 0 Warnings: 0
|
||||
OceanBase (root@test)> insert into t2 values (2,2,2),(3,3,3),(3,3,3),(4,4,4);
|
||||
Query OK, 4 rows affected (0.01 sec)
|
||||
Records: 4 Duplicates: 0 Warnings: 0
|
||||
OceanBase (root@test)> select * from t1 intersect select * from t2;
|
||||
+------+------+------+
|
||||
| a | b | c |
|
||||
+------+------+------+
|
||||
| 2 | 2 | 2 |
|
||||
| 3 | 3 | 3 |
|
||||
+------+------+------+
|
||||
2 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
EXCEPT/MINUS 例子
|
||||
------------------------
|
||||
|
||||
该例子获取出现在t1中,但是不出现在t2中的行,并且去重。
|
||||
|
||||
```javascript
|
||||
OceanBase (root@test)> create table t1(a int, b int, c int);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
OceanBase (root@test)> create table t2(a int, b int, c int);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
OceanBase (root@test)> insert into t1 values (1,1,1),(2,2,2),(3,3,3);
|
||||
Query OK, 3 rows affected (0.02 sec)
|
||||
Records: 3 Duplicates: 0 Warnings: 0
|
||||
OceanBase (root@test)> insert into t2 values (2,2,2),(3,3,3),(3,3,3),(4,4,4);
|
||||
Query OK, 4 rows affected (0.01 sec)
|
||||
Records: 4 Duplicates: 0 Warnings: 0
|
||||
OceanBase (root@test)> select * from t1 except select * from t2;
|
||||
+------+------+------+
|
||||
| a | b | c |
|
||||
+------+------+------+
|
||||
| 1 | 1 | 1 |
|
||||
+------+------+------+
|
||||
1 row in set (0.02 sec)
|
||||
```
|
||||
|
||||
|
@ -1,329 +0,0 @@
|
||||
通用语法
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
常量
|
||||
-----------
|
||||
|
||||
* `INT_VALUE`:匹配整数类型常量,如`123`。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* `DECIMAL_VALUE`:匹配定点类型常量,如`123.456`。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* `STR_VALUE`:匹配字符串常量,如`abc`。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* `NULL`:匹配NULL常量。
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* `STORAGE_SIZE`:匹配存储长度常量,整数形式默认单位为字节,字符串形式可指定单位为M或G,如`1024`或`'500M'`。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
const_value:
|
||||
INT_VALUE
|
||||
| DECIMAL_VALUE
|
||||
| STR_VALUE
|
||||
| NULL
|
||||
| STORAGE_SIZE
|
||||
|
||||
STORAGE_SIZE:
|
||||
INT_VALUE
|
||||
| 'INT_VALUE[M|G]'
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
字符集
|
||||
------------
|
||||
|
||||
```javascript
|
||||
charset:
|
||||
default_charset
|
||||
| column_charset
|
||||
|
||||
default_charset:
|
||||
[DEFAULT] {CHARSET | CHARACTER SET} [=] {UTF8 | UTF8MB4 | BINARY}
|
||||
|
||||
column_charset:
|
||||
{CHARSET | CHARACTER SET} {UTF8 | UTF8MB4 | BINARY}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
排序规则
|
||||
-------------
|
||||
|
||||
```javascript
|
||||
collate:
|
||||
default_collate
|
||||
| column_collate
|
||||
|
||||
default_collate:
|
||||
[DEFAULT] COLLATE [=] {UTF8MB4_GENERAL_CI | UTF8MB4_BIN | BINARY}
|
||||
|
||||
column_collate:
|
||||
COLLATE {UTF8MB4_GENERAL_CI | UTF8MB4_BIN | BINARY}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
数据类型
|
||||
-------------
|
||||
|
||||
```javascript
|
||||
data_type:
|
||||
TINYINT[(precision)] [UNSIGNED] [ZEROFILL]
|
||||
| SMALLINT[(precision)] [UNSIGNED] [ZEROFILL]
|
||||
| MEDIUMINT[(precision)] [UNSIGNED] [ZEROFILL]
|
||||
| INT[(precision)] [UNSIGNED] [ZEROFILL]
|
||||
| INTEGER[(precision)] [UNSIGNED] [ZEROFILL]
|
||||
| BIGINT[(precision)] [UNSIGNED] [ZEROFILL]
|
||||
| FLOAT[(precision, scale)] [UNSIGNED] [ZEROFILL]
|
||||
| DOUBLE[(precision, scale)] [UNSIGNED] [ZEROFILL]
|
||||
| DECIMAL[(precision [, scale])] [UNSIGNED] [ZEROFILL]
|
||||
| NUMERIC[(precision [, scale])] [UNSIGNED] [ZEROFILL]
|
||||
| DATETIME[(scale)]
|
||||
| TIMESTAMP[(scale)]
|
||||
| DATE
|
||||
| TIME[(scale)]
|
||||
| YEAR
|
||||
| VARCHAR(length) column_charset column_collate
|
||||
| VARBINARY(length)
|
||||
| CHAR[(length)] column_charset column_collate
|
||||
| BINARY[(length)]
|
||||
| TINYTEXT column_charset column_collate
|
||||
| TINYLOB
|
||||
| TEXT[(length)] column_charset column_collate
|
||||
| BLOB[(length)]
|
||||
| MEDIUMTEXT column_charset column_collate
|
||||
| MEDIUMBLOB
|
||||
| LONGTEXT column_charset column_collate
|
||||
| LONGBLOB
|
||||
|
||||
precision | scale | length:
|
||||
INT_VALUE
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
SQL属性
|
||||
--------------
|
||||
|
||||
* 对象名
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
tenant_name | pool_name | unit_name | zone_name | region_name:
|
||||
STR_VALUE
|
||||
|
||||
database_name | table_name | table_alias_name | column_name| column_alias_name | partition_name | subpartition_name:
|
||||
STR_VALUE
|
||||
|
||||
index_name | view_name | object_name | constraint_name | tablegroup_name:
|
||||
STR_VALUE
|
||||
|
||||
outline_name | user_name:
|
||||
STR_VALUE
|
||||
|
||||
table_factor:
|
||||
[[database_name].] table_name
|
||||
|
||||
column_factor:
|
||||
[table_factor.] column_name
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* 表达式
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
expression:
|
||||
const_value
|
||||
| column_factor
|
||||
| operator_expression
|
||||
| function_expression
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* 注释
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
comment:
|
||||
COMMENT 'comment_text'
|
||||
|
||||
comment_text:
|
||||
STR_VALUE
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
分布式属性
|
||||
--------------
|
||||
|
||||
|
||||
|
||||
* `PRIMARY_ZONE`:指定数据的主副本分布策略。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
primary_zone:
|
||||
PRIMARY_ZONE [=] zone_name
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* `ZONE_LIST`:指定租户的资源分布策略。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
zone_list:
|
||||
ZONE_LIST [=] (zone_name [, zone_name ...])
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* `REPLICA_NUM`:指定数据的副本份数。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
replica_num:
|
||||
REPLICA_NUM [=] INT_VALUE
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* `TABLEGROUP`:指定多份数据的主副本分布策略。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
tablegroup:
|
||||
default_tablegroup
|
||||
| table_tablegroup
|
||||
|
||||
default_tablegroup:
|
||||
DEFAULT TABLEGROUP [=] {tablegroup_name | NULL}
|
||||
|
||||
table_tablegroup:
|
||||
TABLEGROUP [=] {tablegroup_name | NULL}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
存储属性
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
* `BLOCK_SIZE`:指定对象存储的微块长度。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
block_size:
|
||||
BLOCK_SIZE [=] INT_VALUE
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* `COMPRESSION`:指定对象存储的压缩算法。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
compression:
|
||||
COMPRESSION [=] {NONE | LZ4_1.0 | LZ0_1.0 | SNAPPY_1.0 | ZLIB_1.0}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* `PCTFREE`:指定对象存储的宏块预留百分比。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
pctfree:
|
||||
PCTFREE [=] INT_VALUE
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* `TABLET_SIZE`:指定并行合并时单个任务的最小分片。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
tablet_size:
|
||||
TABLET_SIZE [=] INT_VALUE
|
||||
```
|
||||
|
||||
|
@ -1,109 +0,0 @@
|
||||
ALTER USER
|
||||
===============================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句主要用于执行以下操作:
|
||||
|
||||
* 修改 OceanBase 用户的密码。
|
||||
|
||||
* 锁定或者解锁用户,且被锁定的用户不允许登录。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
必须拥有全局 UPDATE USER 的权限,才可以执行本命令。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
* 修改用户密码
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
ALTER USER 'username' IDENTIFIED BY 'password';
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 锁定用户
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
ALTER USER user [lock_option]
|
||||
|
||||
lock_option:{
|
||||
ACCOUNT LOCK
|
||||
| ACCOUNT UNLOCK}
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|----------------|--------|
|
||||
| ACCOUNT UNLOCK | 锁定用户。 |
|
||||
| ACCOUNT UNLOCK | 解锁用户。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 修改密码
|
||||
|
||||
|
||||
|
||||
|
||||
执行以下命令将用户 sqluser01 的密码修改为 abc123。
|
||||
|
||||
```javascript
|
||||
ALTER USER 'sqluser01' IDENTIFIED BY 'abc123';
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 锁定用户
|
||||
|
||||
|
||||
|
||||
|
||||
锁定用户 obsqluser01。
|
||||
|
||||
```javascript
|
||||
ALTER USER 'obsqluser01' ACCOUNT LOCK;
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 解锁用户
|
||||
|
||||
|
||||
|
||||
|
||||
解锁用户 obsqluser01。
|
||||
|
||||
```javascript
|
||||
ALTER USER 'obsqluser01' ACCOUNT UNLOCK;
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,73 +0,0 @@
|
||||
CREATE DATABASE
|
||||
====================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------------------
|
||||
|
||||
该语句用于创建数据库,并可以指定数据库的默认属性(如数据库默认字符集,校验规则等)。
|
||||
|
||||
`CREATE DATABASE` 与 `CREATE SCHEMA` 是等价的。
|
||||
|
||||
语法
|
||||
-----------------------
|
||||
|
||||
```javascript
|
||||
create_database_stmt:
|
||||
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] database_name [database_option_list]
|
||||
|
||||
database_option_list:
|
||||
database_option [database_option ...]
|
||||
|
||||
database_option:
|
||||
[DEFAULT] {CHARACTER SET | CHARSET} [=] charset_name
|
||||
| [DEFAULT] COLLATE [=] collation_name
|
||||
| REPLICA_NUM [=] int_num
|
||||
| PRIMARY_ZONE [=] zone_name
|
||||
| {READ ONLY | READ WRITE}
|
||||
| DEFAULT TABLEGROUP [=] {NULL | table_group_name}
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-----------------------------------------------------|-----------------------------------------------------|
|
||||
| database_name | 指定要修改属性的数据库名称。 |
|
||||
| \[DEFAULT\] {CHARACTER SET \| CHARSET} charset_name | 指定要修改的字符集。 `DEFAULT` 关键字是可选的,不影响语义。 |
|
||||
| \[DEFAULT\] COLLATE collation_name | 指定校对规则。 `DEFAULT` 关键字是可选的,不影响语义。 |
|
||||
| REPLICA_NUM int_num | 指定副本数。 |
|
||||
| PRIMARY_ZONE zone_name | 指定数据库的 Primary Zone。 |
|
||||
| READ ONLY \| READ WRITE | 设置数据库级只读或读写属性。 |
|
||||
| DEFAULT TABLEGROUP table_group_name | 设置数据库默认表组信息,`NULL` 表示取消数据库默认表组。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------------------
|
||||
|
||||
* 创建数据库 `test2`,并指定字符集为 `UTF8`。
|
||||
|
||||
```javascript
|
||||
obclient> CREATE DATABASE test2 DEFAULT CHARACTER SET UTF8;
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 创建读写属性的数据库 `test3`。
|
||||
|
||||
```javascript
|
||||
obclient> CREATE DATABASE test3 READ WRITE;
|
||||
Query OK, 1 row affected (0.03 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,102 +0,0 @@
|
||||
CREATE INDEX
|
||||
=================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来创建索引。索引是创建在表上的,对数据库表中一列或多列的值进行排序的一种结构。其作用主要在于提高查询的速度,降低数据库系统的性能开销。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
CREATE [UNIQUE] INDEX indexname
|
||||
ON tblname (index_col_name,...)
|
||||
[index_type] [index_options]
|
||||
index_type:
|
||||
USING BTREE
|
||||
|
||||
index_options:
|
||||
index_option [index_option...]
|
||||
|
||||
index_option:
|
||||
GLOBAL | LOCAL
|
||||
| COMMENT 'string'
|
||||
| COMPRESSION [=] {NONE | LZ4_1.0 | LZO_1.0 | SNAPPY_1.0 | ZLIB_1.0}
|
||||
| BLOCK_SIZE [=] size
|
||||
| STORING(columname_list)
|
||||
| VISIBLE | INVISIBLE
|
||||
|
||||
index_col_name:
|
||||
colname [(length)] [ASC | DESC]
|
||||
|
||||
columname_list:
|
||||
colname [, colname...]
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-----------------|---------------------------------------------------------------------------------------------------------------------------|
|
||||
| indexname | 指定要创建的索引名称。 |
|
||||
| tblname | 指过索引所属的表名。 |
|
||||
| index_col_name | 指定索引的列名,每个列名后都支持ASC(升序),不支持DESC(降序)。默认为升序。 建立索引的排序方式为:首先以index_col_name中第一个列的值排序;该列值相同的记录,按下一列名的值排序;以此类推。 |
|
||||
| index_type | 索引类型,只支持USING BTREE,以B树为索引。 |
|
||||
| UNIQUE | 指定为唯一索引。 |
|
||||
| index_option | 指定索引选项,多个index_option以空格分隔。 |
|
||||
| GLOBAL \| LOCAL | 指定该索引是全局索引或局部索引,默认是GLOBAL。 |
|
||||
| COMMENT | 指定注释。 |
|
||||
| COMPRESSION | 指定压缩算法。 |
|
||||
| BLOCK_SIZE | 指定微块大小。 |
|
||||
| STORING | 表示索引表中冗余存储某些列,以提高系统查询性能。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
1. 执行以下命令,创建表test。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE TABLE test (c1 int primary key, c2 VARCHAR(10));
|
||||
```
|
||||
|
||||
|
||||
|
||||
2. 执行以下命令,创建表test的索引。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE INDEX test_index ON test (c1, c2 DESC);
|
||||
```
|
||||
|
||||
|
||||
|
||||
3. 执行以下命令,查看表test的索引。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SHOW INDEX FROM test;
|
||||
```
|
||||
|
||||
|
@ -1,92 +0,0 @@
|
||||
CREATE OUTLINE
|
||||
===================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来创建 OUTLINE。可以通过两种方式创建,一种是通过 SQL_TEXT(用户执行的带参数的原始语句),另一种是通过 SQL_ID 创建。
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
创建 OUTLINE 需要进入对应的 DataBase 下执行。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
* **使用** **SQL_TEXT 创建** **OUTLINE**
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE [OR REPLACE] OUTLINE outline_name ON stmt [ TO target_stmt ]
|
||||
```
|
||||
|
||||
|
||||
|
||||
* **使用** **SQL_ID 创建** **OUTLINE**
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE OUTLINE outline_name ON sql_id USING HINT hint;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| outline_name | 指定要创建的 OUTLINE 名称。 |
|
||||
| OR REPLACE | 指定 OR REPLACE 后,如果要创建的 OUTLINE 已存在,则会替换原有的 OUTLINE。 |
|
||||
| stmt | 一般为一个带有 hint 和原始参数的 DML 语句。 |
|
||||
| TO target_stmt | 如果不指定 TO target_stmt, 则表示如果数据库接受的SQL参数化后与stmt去掉hint参数化文本相同,则将该SQL绑定stmt中hint生成执行计划;如果期望对含有hint的语句进行固定计划,则需要 TO target_stmt 来指明原始的SQL。 **注意** 在使用target_stmt时,严格要求stmt与target_stmt在去掉hint后完全匹配。 |
|
||||
| sql_id | 如果sql_id对应的SQL语句已经有hint,则创建OUTLINE指定的hint会覆盖原始语句中所有hint。 |
|
||||
| hint | 格式为 /\*+ xxx \*/ 。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 使用 SQL_TEXT 创建 OUTLINE
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE OUTLINE otl_idx_c2
|
||||
ON SELECT/*+ index(t1 idx_c2)*/ * FROM t1 WHERE c2 = 1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* 使用 SQL_ID 创建 OUTLINE
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE OUTLINE otl_idx_c2
|
||||
ON "ED570339F2C856BA96008A29EDF04C74"
|
||||
USING HINT /*+ index(t1 idx_c2)*/ ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
注意事项
|
||||
-------------
|
||||
|
||||
使用 SQL_TEXT 方式创建的 OUTLINE 会覆盖 SQL_ID 方式创建的 OUTLINE,SQL_TEXT 方式创建的优先级高。
|
@ -1,50 +0,0 @@
|
||||
CREATE RESOURCE POOL
|
||||
=========================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------------------
|
||||
|
||||
该语句用来创建资源池,用于描述可以分配给租户的资源单元集合。
|
||||
|
||||
格式
|
||||
-----------------------
|
||||
|
||||
```javascript
|
||||
CREATE RESOURCE POOL poolname
|
||||
UNIT [=] unitname,
|
||||
UNIT_NUM [=] unitnum,
|
||||
ZONE_LIST [=] ('zone' [, 'zone' ...]);
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-----------|---------------------------------------------------|
|
||||
| poolname | 指定要创建的资源池的名称。 |
|
||||
| UNIT | 指定资源单元的名称。 |
|
||||
| UNIT_NUM | 指定要创建的单个 Zone 下的单元个数,取值要小于单个 Zone 中的 OBServer 个数。 |
|
||||
| ZONE_LIST | 指定要创建的资源池所属的集群。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------------------
|
||||
|
||||
* 创建资源池 `pool1`,属于集群 `zone1`。
|
||||
|
||||
```javascript
|
||||
obclient> CREATE RESOURCE POOL pool1 UNIT='unit1', UNIT_NUM=1, ZONE_LIST=('zone1');
|
||||
Query OK, 0 rows affected (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,72 +0,0 @@
|
||||
CREATE RESOURCE UNIT
|
||||
=========================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来创建资源单元配置,描述了分配硬件资源的规格,用于给租户分配硬件资源。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
CREATE RESOURCE UNIT unitname
|
||||
MAX_CPU [=] cpunum,
|
||||
MAX_MEMORY [=] memsize,
|
||||
MAX_IOPS [=] iopsnum,
|
||||
MAX_DISK_SIZE [=] disksize,
|
||||
MAX_SESSION_NUM [=] sessionnum,
|
||||
[MIN_CPU [=] cpunum,]
|
||||
[MIN_MEMORY [=] memsize,]
|
||||
[MIN_IOPS [=] iopsnum] ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-----------------|---------------------------------------------------|
|
||||
| MAX_CPU | 指定要修改的 CPU 最多数量 |
|
||||
| MAX_MEMORY | 指定要修改的最大内存容量,取值范围为\[1073741824, +∞) 单位为字节,即最小值为1G |
|
||||
| MAX_IOPS | 指定要修改的 IOPS 最多数量,取值范围为\[128,+∞) |
|
||||
| MAX_DISK_SIZE | 指定要修改的最大硬盘容量,取值范围为[536870912,+∞]单位为字节,即最小值为512M |
|
||||
| MAX_SESSION_NUM | 指定要修改的 session 最多数量,取值范围为\[64,+∞) |
|
||||
| MIN_CPU | 指定要修改的 CPU 最少数量 |
|
||||
| MIN_MEMORY | 指定要修改的最小内存容量 |
|
||||
| MIN_IOPS | 指定要修改的 IOPS 最少数量 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 创建资源单元 unit1 配置为1 个 CPU,1G 内存,128 个 IOPS,10G 硬盘容量,运行64个 session。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> CREATE RESOURCE UNIT unit1 max_cpu 1, max_memory '1G', max_iops 128,max_disk_size '10G', max_session_num 64, MIN_CPU=1, MIN_MEMORY= '1G', MIN_IOPS=128;
|
||||
Query OK, 0 rows affected (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 创建资源单元 unit1 配置为1 个 CPU,1G 内存,128个 IOPS,10G 硬盘容量,运行64个 session。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> CREATE RESOURCE UNIT unit1 max_cpu 1, max_memory 1073741824, max_iops 128, max_disk_size 10737418240, max_session_num 64, MIN_CPU=1, MIN_MEMORY=1073741824, MIN_IOPS=128;
|
||||
Query OK, 0 rows affected (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,52 +0,0 @@
|
||||
CREATE RESTORE POINT
|
||||
=========================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------------------
|
||||
|
||||
该语句用来创建还原点(Restore Point)。使用该功能可以保留当前时刻的数据快照,并在之后指定在这个数据快照上进行查询。目前还不支持将数据回滚到该还原点。
|
||||
|
||||
创建还原点后,可以在 V$RESTORE_POINT 视图中查询到该还原点的 SNAPSHOT 值,然后通过 `SELECT * FROM table_name AS OF SNAPSHOT snapshot;` 查询数据快照中的值。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
系统租户不支持创建还原点。
|
||||
|
||||
格式
|
||||
-----------------------
|
||||
|
||||
```unknow
|
||||
CREATE RESTORE POINT restore_point;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 描述 |
|
||||
|---------------|----------|
|
||||
| restore_point | 指定还原点名称。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------------------
|
||||
|
||||
* 创建一个还原点 rp1。
|
||||
|
||||
```unknow
|
||||
obclient> CREATE RESTORE POINT rp1;
|
||||
Query OK, 0 rows affected (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,134 +0,0 @@
|
||||
CREATE SYNONYM
|
||||
===================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来创建一个同义词。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
CREATE [ OR REPLACE ] [ PUBLIC ]
|
||||
SYNONYM [ DATABASE. ]synonym
|
||||
FOR [ DATABASE. ]object;
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
参数说明
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| OR REPLACE | 表示如果要创建的同义词名称已存在,则使用新的定义重新创建同义词。 |
|
||||
| PUBLIC | 指定PUBLIC来创建公共同义词,所有用户都可以使用。用户必须对基础对象具有相应的权限才能使用该同义词。 在解析对象的引用时,仅当对象没有指定DataBase时,才会使用公共同义词。 如果不指定PUBLIC,则同义词是私有的,只能当前DataBase访问,并且同义词名称在当前DataBase中必须唯一。 |
|
||||
| \[ DataBase. \]synonym | DataBase指定当前同义词属于哪个DataBase,如果指定了PUBLIC,则对同义词不需要指定DataBase;synonym表示同义词的名称。 |
|
||||
| \[ DataBase. \]object | 表示同义词对应对象的名称。 |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
举例
|
||||
-----------
|
||||
|
||||
* 创建一个同义词。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>create table t1(c1 int);
|
||||
Query OK, 0 rows affected (0.18 sec)
|
||||
|
||||
OceanBase(admin@test)>create synonym s1 for t1;
|
||||
Query OK, 0 rows affected (0.05 sec)
|
||||
|
||||
OceanBase(admin@test)>insert into s1 values(1);
|
||||
Query OK, 1 row affected (0.02 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from s1;
|
||||
+------+
|
||||
| c1 |
|
||||
+------+
|
||||
| 1 |
|
||||
+------+
|
||||
1 row in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 创建一个PUBLIC同义词
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>create public synonym syn_pub for t1;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from syn_pub;
|
||||
+------+
|
||||
| c1 |
|
||||
+------+
|
||||
| 1 |
|
||||
+------+
|
||||
1 row in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
注意事项
|
||||
-------------
|
||||
|
||||
创建同义词时,需要满足如下权限要求:
|
||||
|
||||
* 在当前的DataBase下创建私有的synonym,需要CREATE SYNONYM权限
|
||||
|
||||
* 在非当前DataBase下创建私有的synonym,需要CREATE ANY SYNONYM权限
|
||||
|
||||
* 创建PUBLIC的synonym,需要CREATE PUBLIC SYNONYM权限
|
||||
|
||||
* 对于需要创建synonym的对象不需要存在,也不需要具有访问权限
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
连接sys用户:
|
||||
OceanBase(ADMIN@TEST)>CREATE USER syn_user IDENTIFIED BY syn_user;
|
||||
Query OK, 0 rows affected (0.06 sec)
|
||||
|
||||
OceanBase(ADMIN@TEST)>grant CREATE on syn_user.* to syn_user;
|
||||
Query OK, 0 rows affected (0.02 sec)
|
||||
|
||||
OceanBase(ADMIN@TEST)>grant SELECT on syn_user.* to syn_user;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
|
||||
|
||||
连接syn_user
|
||||
//创建同义词失败
|
||||
OceanBase(SYN_USER@(none))>create synonym syn_1 for t1;
|
||||
ERROR-00600: internal error code, arguments: -5036, Access denied; you need (at least one of) the CREATE SYNONYM privilege(s) for this operation
|
||||
|
||||
连接sys用户,给定CREATE SYNONYM权限
|
||||
OceanBase(ADMIN@TEST)>grant CREATE SYNONYM on *.* to syn_user;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
|
||||
连接syn_user
|
||||
OceanBase(SYN_USER@(none))>create synonym syn_1 for t1;
|
||||
Query OK, 0 rows affected (0.05 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,289 +0,0 @@
|
||||
CREATE TABLE
|
||||
=================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来在数据库中创建一张新表。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
|
||||
(table_definition_list) [table_option_list] [partition_option] [AS] select;
|
||||
|
||||
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
|
||||
LIKE table_name;
|
||||
|
||||
table_definition_list:
|
||||
table_definition [, table_definition ...]
|
||||
|
||||
table_definition:
|
||||
column_definition
|
||||
| [CONSTRAINT [constraint_name]] PRIMARY KEY index_desc
|
||||
| [CONSTRAINT [constraint_name]] UNIQUE {INDEX | KEY} [index_name] index_desc
|
||||
| {INDEX | KEY} [index_name] index_desc
|
||||
| FULLTEXT [INDEX | KEY] [index_name] fulltext_index_desc
|
||||
|
||||
column_definition_list:
|
||||
column_definition [, column_definition ...]
|
||||
|
||||
column_definition:
|
||||
column_name data_type
|
||||
[DEFAULT const_value] [AUTO_INCREMENT]
|
||||
[NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] comment
|
||||
|
||||
index_desc:
|
||||
(column_desc_list) [index_type] [index_option_list]
|
||||
|
||||
fulltext_index_desc:
|
||||
(column_desc_list) CTXCAT(column_desc_list) [index_option_list]
|
||||
|
||||
column_desc_list:
|
||||
column_desc [, column_desc ...]
|
||||
|
||||
column_desc:
|
||||
column_name [(length)] [ASC | DESC]
|
||||
|
||||
index_type:
|
||||
USING BTREE
|
||||
|
||||
index_option_list:
|
||||
index_option [ index_option ...]
|
||||
|
||||
index_option:
|
||||
[GLOBAL | LOCAL]
|
||||
| block_size
|
||||
| compression
|
||||
| STORING(column_name_list)
|
||||
| comment
|
||||
|
||||
table_option_list:
|
||||
table_option [ table_option ...]
|
||||
|
||||
table_option:
|
||||
[DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name
|
||||
| [DEFAULT] COLLATE [=] collation_name
|
||||
| primary_zone
|
||||
| replica_num
|
||||
| table_tablegroup
|
||||
| block_size
|
||||
| compression
|
||||
| AUTO_INCREMENT [=] INT_VALUE
|
||||
| comment
|
||||
| DUPLICATE_SCOPE [=] "none|cluster"
|
||||
| LOCALITY [=] "locality description"
|
||||
| ROW_FORMAT [=] REDUNDANT|COMPACT|DYNAMIC|COMPRESSED|DEFAULT
|
||||
| PCTFREE [=] num
|
||||
| parallel_clause
|
||||
|
||||
parallel_clause:
|
||||
{NOPARALLEL | PARALLEL integer}
|
||||
|
||||
partition_option:
|
||||
PARTITION BY HASH(expression)
|
||||
[subpartition_option] PARTITIONS partition_count
|
||||
| PARTITION BY KEY([column_name_list])
|
||||
[subpartition_option] PARTITIONS partition_count
|
||||
| PARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
|
||||
[subpartition_option] (range_partition_list)
|
||||
| PARTITION BY LIST {(expression) | COLUMNS (column_name_list)}
|
||||
[subpartition_option] PARTITIONS partition_count
|
||||
|
||||
subpartition_option:
|
||||
SUBPARTITION BY HASH(expression)
|
||||
SUBPARTITIONS subpartition_count
|
||||
| SUBPARTITION BY KEY(column_name_list)
|
||||
SUBPARTITIONS subpartition_count
|
||||
| SUBPARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
|
||||
(range_subpartition_list)
|
||||
| SUBPARTITION BY LIST(expression)
|
||||
|
||||
range_partition_list:
|
||||
range_partition [, range_partition ...]
|
||||
|
||||
range_partition:
|
||||
PARTITION partition_name
|
||||
VALUES LESS THAN {(expression_list) | MAXVALUE}
|
||||
|
||||
range_subpartition_list:
|
||||
range_subpartition [, range_subpartition ...]
|
||||
|
||||
range_subpartition:
|
||||
SUBPARTITION subpartition_name
|
||||
VALUES LESS THAN {(expression_list) | MAXVALUE}
|
||||
|
||||
expression_list:
|
||||
expression [, expression ...]
|
||||
|
||||
column_name_list:
|
||||
column_name [, column_name ...]
|
||||
|
||||
partition_name_list:
|
||||
partition_name [, partition_name ...]
|
||||
|
||||
partition_count | subpartition_count:
|
||||
INT_VALUE
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数说明
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| DUPLICATE_SCOPE | 用来指定复制表属性,取值如下: * none:表示该表是一个普通表 * zone:表示该表是一个复制表,leader需要将事务复制到本zone的所有F副本及R副本 * region:表示该表是一个复制表,leader需要将事务复制到本region的所有F副本及R副本 * cluster:表示该表是一个复制表,leader需要将事务复掉到cluster的所有F副本及R副本 不指定DUPLICATE_SCOPE的情况下,默认值为none。 |
|
||||
| ROW_FORMAT | 指定表是否开启encoding存储格式 * redundant <!-- --> <!-- --> * compact <!-- --> <!-- --> * dynamic <!-- --> <!-- --> * compressed <!-- --> <!-- --> * default <!-- --> |
|
||||
| BLOCK_SIZE | 指定表的微块大小 |
|
||||
| COMPRESSION | 指定表的压缩算法,取值如下: 1. none:不使用压缩算法 2. lz4_1.0: 使用lz4压缩算法 3. zstd_1.0: 使用zstd压缩算法 4. snappy_1.0: 使用snappy压缩算法 |
|
||||
| CHARSET \| CHARACTER SET | 指定表中列的默认字符集,可使用:utf8, utf8mb4, gbk, utf16, gb18030 |
|
||||
| COLLATE | 指定表中列的默认比较规则,可使用: utf8_bin, utf8_general_ci, utf8_unicode_ci, gbk_bin, gbk_chinese_ci, utf8mb4_general_ci, utf8mb4__general_cs, utf8mb4_bin, utf8mb4_unicode_ci, utf16_general_ci, utf16_bin, utf16_unicode_ci, gb18030_chinese_ci, gb18030_bin |
|
||||
| primary_zone | 指定主Zone(副本Leader所在 Zone)。 |
|
||||
| replica_num | 指定副本数。 |
|
||||
| table_tablegroup | 指定表所属的talegroup。 |
|
||||
| AUTO_INCREMENT | 指定表中自增列的初始值。 |
|
||||
| comment | 注释。 |
|
||||
| LOCALITY | 描述副本在Zone间的分布情况,如:F@z1,F@z2,F@z3,R@z4 表示z1, z2, z3为全功能副本,z4为只读副本。 |
|
||||
| PCTFREE | 指定宏块保留空间百分比。 |
|
||||
| parallel_clause | 指定表级别的并行度: * NOPARALLEL:并行度为1,默认配置 * PARALLEL integer:指定并行度,integer 取值大于等于 1。 |
|
||||
|
||||
|
||||
|
||||
举例
|
||||
-----------
|
||||
|
||||
* 创建数据库表。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE TABLE test (c1 int primary key, c2 VARCHAR(50)) REPLICA_NUM = 3, PRIMARY_ZONE = 'zone1';
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 创建表,并指定垂直分区。其中第一个分区只有列 c3,第二个分区包含列 c1、c2,没有列出的 c4、c5 列为第三个分区。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE TABLE t1(c1 int,
|
||||
c2 int,
|
||||
c3 int,
|
||||
c4 int,
|
||||
c5 int)
|
||||
PARTITION BY CLOUMN ( c3, (c1, c2));
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 创建一个复制表。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE TABLE item() locality = 'F,R{all_server}@hz1, F,R{all_server}@hz2,
|
||||
F,R{all_server}@hz3' DUPLICATE_SCOPE="cluster"
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 创建带索引的表。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
create table t1 (c1 int primary key, c2 int, c3 int, index i1 (c2));
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 创建 hash 分区,分区数为 8 的表。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
create table t1 (c1 int primary key, c2 int) partition by hash(c1) partitions 8;
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 创建一级分区为 range 分区,二级分区为 key 分区的表。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
create table t1 (c1 int, c2 int, c3 int)
|
||||
partition by range(c1) subpartition by key(c2, c3) subpartitions 5
|
||||
(partition p0 values less than(0), partition p1 values less than(100));
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 创建一列为 gbk, 一列为 utf8 的表。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
create table t1 (c1 varchar(10),
|
||||
c2 varchar(10) charset gbk collate gbk_bin)
|
||||
default charset utf8 collate utf8mb4_general_ci;
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 开启 encoding 并使用 zstd 压缩,宏块保留空间为 5%。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
create table t1 (c1 int, c2 int, c3 varchar(64))
|
||||
compression 'zstd_1.0'
|
||||
ROW_FORMAT dynamic
|
||||
pctfree 5;
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 创建表 t1,并设置并行度为 3。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```unknow
|
||||
create table t1(c1 int primary key, c2 int) parallel 3;
|
||||
```
|
||||
|
||||
|
@ -1,101 +0,0 @@
|
||||
CREATE TABLEGROUP
|
||||
======================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来创建表组。
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
只有租户下的管理员权限才可以创建表组。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
CREATE TABLEGROUP [IF NOT EXISTS] tablegroupname [opt_tablegroup_option_list] [opt_tg_partition_option]
|
||||
|
||||
opt_tablegroup_option_list:
|
||||
tablegroup_option [tablegroup_option]
|
||||
|
||||
tablegroup_option:
|
||||
LOCALITY [=] locality_name
|
||||
| PRIMARY_ZONE [=] primary_zone_name
|
||||
|
||||
opt_tg_partition_option:
|
||||
PARTITION BY
|
||||
KEY COLUMN_NUM [tg_subpartition_option] PARTITIONS INTNUM
|
||||
| HASH [tg_subpartition_option] PARTITIONS INTNUM
|
||||
| RANGE [tg_subpartition_option] {PARTITION partition_name VALUES LESS THAN range_partition_expr, ...}
|
||||
| RANGE COLUMNS COLUMN_NUM [tg_subpartition_option] {PARTITION partition_name VALUES LESS THAN range_partition_expr, ...}
|
||||
| LIST [tg_subpartition_option] {PARTITION partition_name VALUES in list_partition_expr, ...}
|
||||
| LIST COLUMNS COLUMN_NUM [tg_subpartition_option] {PARTITION partition_name VALUES in list_partition_expr, ...}
|
||||
|
||||
tg_subpartition_option:
|
||||
SUBPARTITION BY
|
||||
RANGE SUBPARTITION TEMPLATE {SUBPARTITION partition_name VALUES LESS THAN range_partition_expr, ...}
|
||||
| RANGE COLUMNS COLUMN_NUM SUBPARTITION TEMPLATE {SUBPARTITION partition_name VALUES LESS THAN range_partition_expr, ...}
|
||||
| HASH [SUBPARTITIONS INTNUM]
|
||||
| KEY COLUMN_NUM [SUBPARTITIONS INTNUM]
|
||||
| LIST SUBPARTITION TEMPLATE {SUBPARTITION partition_name VALUES in list_partition_expr, ...}
|
||||
| LIST COLUMNS COLUMN_NUM SUBPARTITION TEMPLATE {SUBPARTITION partition_name VALUES in list_partition_expr, ...}
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| tablegroupname | 表组名称,最长64个字符,字符只能有大小写英文字母,数字和下划线,而且必须以字母或下划线开头,并且不能OceanBase的关键字。 如果要创建的表组名称已存在,并且没有指定IF NOT EXISTS,则会出现错误。 |
|
||||
| opt_tablegroup_option_list | 表组的分区方式、locality、primary zone必须和组内的表完全一致。 组内的表信息不能独立变更某一项,只可以通过操作表组进行批量操作。 相同的locality:副本类型、个数、位置要完全一致 相同的primary zone:leader位置及其优先级要完全一致 相同的分区方式: * 分区类型相同(例如,都是hash+range分区)。 * 如果是key分区,要求引用的列数相同,且分区个数相同。 * 如果是hash分区,要求分区个数相同。 * 如果是range columns分区,要求引用的列数相同,且分区数相同,且range分割点相同。 * 如果是range分区,且分区数相同,且range分割点相同。 * 对于二级分区,根据分区类型,要求和1)\~4)一致 |
|
||||
| opt_tg_partition_option | 表组的分区规则定义,与CREATE TABLE使用同样的分区方式。 表组没有具体的列定义,所以KEY、RANGE COLUMNS、LIST COLUMNS不需要写出具体的列,只需要指定列个数(COLUMN_NUM)。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 创建名为 myTableGroup1 的表组。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> CREATE TABLEGROUP myTableGroup1;
|
||||
Query OK, 0 rows affected (0.07 sec)
|
||||
|
||||
OceanBase(admin@test)> create table myt1 (c1 int, c2 int ) tablegroup = myTableGroup1;
|
||||
Query OK, 0 rows affected (0.28 sec)
|
||||
|
||||
OceanBase(admin@test)> create table myt2 (c1 int, c2 int ) tablegroup = myTableGroup1;
|
||||
Query OK, 0 rows affected (0.26 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 创建 hash 分区的表组 tgh,同时创建 hash 分区的表ttgh,且分区个数相同。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> create tablegroup tgh locality='F,R{ALL_SERVER}@z1' partition by hash partitions 10;
|
||||
Query OK, 0 rows affected (0.09 sec)
|
||||
|
||||
OceanBase(admin@test)> create table ttgh(c1 int, c2 int) locality='F,R{ALL_SERVER}@z1' partition by hash(c1) partitions 10;
|
||||
Query OK, 0 rows affected (0.55 sec)
|
||||
|
||||
OceanBase(admin@test)> create table ttgh2(c1 int, c2 int) locality='F,R{ALL_SERVER}@z1' partition by hash(c2) partitions 10;
|
||||
Query OK, 0 rows affected (0.39 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,69 +0,0 @@
|
||||
ALTER DATABASE
|
||||
===================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来修改 DataBase 的属性。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
alter_database_stmt:
|
||||
ALTER DATABASE [database_name] [SET] alter_specification_list;
|
||||
|
||||
alter_specification_list:
|
||||
alter_specification [alter_specification ...]
|
||||
|
||||
alter_specification:
|
||||
[DEFAULT] {CHARACTER SET | CHARSET} [=] charset_name
|
||||
| [DEFAULT] COLLATE [=] collation_name
|
||||
| REPLICA_NUM [=] int_num
|
||||
| PRIMARY_ZONE [=] zone_name
|
||||
| {READ ONLY | READ WRITE}
|
||||
| DEFAULT TABLEGROUP [=] {NULL | table_group_name}
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-------------------------------------|------------------------------------|
|
||||
| database_name | 指定要修改属性的数据库名称。如果不指定,会对当前默认数据库进行修改。 |
|
||||
| CHARSET charset_name | 指定要修改的字符集。 |
|
||||
| COLLATE collation_name | 指定校对规则。 |
|
||||
| REPLICA_NUM int_num | 指定副本数。 |
|
||||
| PRIMARY_ZONE zone_name | 指定主 Zone。 |
|
||||
| READ ONLY \| READ WRITE | 设置数据库级只读或读写属性。 |
|
||||
| DEFAULT TABLEGROUP table_group_name | 设置数据库默认表组信息,NULL 表示取消数据库默认表组。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 修改数据库 test2 的字符集为 UTF8MB4,校对规则为 UTF8MB4_BIN,且为读写属性。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>alter database test2 DEFAULT CHARACTER SET UTF8MB4;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
|
||||
OceanBase(admin@test)>alter database test2 DEFAULT COLLATE UTF8MB4_BIN;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
|
||||
OceanBase(admin@test)>alter database test2 READ WRITE;
|
||||
Query OK, 0 rows affected (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,92 +0,0 @@
|
||||
CREATE TENANT
|
||||
==================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来创建租户。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
CREATE TENANT [IF NOT EXISTS] tenantname
|
||||
[tenant_characteristic_list] [opt_set_sys_var]
|
||||
|
||||
tenant_characteristic_list:
|
||||
tenant_characteristic [, tenant_characteristic...]
|
||||
|
||||
tenant_characteristic:
|
||||
COMMENT 'string'
|
||||
|{CHARACTER SET | CHARSET} [=] charsetname
|
||||
|COLLATE [=] collationname
|
||||
|REPLICA_NUM [=] num
|
||||
|ZONE_LIST [=] (zone [, zone...])
|
||||
|PRIMARY_ZONE [=] zone
|
||||
|DEFAULT TABLEGROUP [=] {NULL | tablegroup}
|
||||
|RESOURCE_POOL_LIST [=](poolname [, poolname...])
|
||||
|LOGONLY_REPLICA_NUM [=] num
|
||||
|LOCALITY [=] 'locality description'
|
||||
|
||||
opt_set_sys_var:
|
||||
{ SET | SET VARIABLES | VARIABLES } system_var_name = expr [,system_var_name = expr] ...
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|--------------------------|----------------------------------------------------------------------------------------------------------------------|
|
||||
| tenant_name | 指定租户名。最长64个字节,只能有大小写英文字母,数字和下划线,而且必须以字母或下划线开头,并且不能是OceanBase的关键字。 |
|
||||
| IF NOT EXISTS | 如果要创建的租户名已存在,并且没有指定IF NOT EXISTS,则会报错。 |
|
||||
| RESOURCE_POOL_LIST | 资源池列表,为创建租户时的必填项,暂时只支持一个 RESOURCE POOL。 |
|
||||
| DEFAULT TABLEGROUP | 设置租户默认表组信息,NULL 表示取消默认表组。如果不指定,默认为 NULL。 |
|
||||
| COMMENT | 修改注释。 |
|
||||
| CHARACTER SET \| CHARSET | 修改租户的字符集。 |
|
||||
| COLLATE | 指定校对规则。 |
|
||||
| REPLICA_NUM | 指定副本数。 |
|
||||
| ZONE_LIST | 指定要修改的Zone列表。 |
|
||||
| PRIMARY_ZONE | 指定主Zone。 |
|
||||
| LOGONLY_REPLICA_NUM | 指定日志副本数。 |
|
||||
| LOCALITY | 描述副本在Zone间的分布情况,如:F@z1,F@z2,F@z3,R@z4 表示z1, z2, z3为全功能副本,z4为只读副本。 |
|
||||
| system_var_name | 指定租户系统变量值。其中 ob_compatibility_mode 系统变量用于指定租户的兼容模式(MySQL/Oracle),只能在创建时指定;如果不指定 ob_compatibility_mode ,默认兼容模式为MySQL。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 创建租户。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE TENANT IF NOT EXISTS t1 charset='utf8mb4', replica_num=1, zone_list=('zone1'), primary_zone='zone1', resource_pool_list=('pool1');
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 创建oracle兼容模式租户
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE TENANT IF NOT EXISTS t1 zone_list=('zone1'), primary_zone='zone1', resource_pool_list=('pool1') SET ob_compatibility_mode='oracle';
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
注意事项
|
||||
-------------
|
||||
|
||||
只有用root用户连接到根租户(root@ROOT)才能执行 CREATE TENANT 去创建租户。
|
@ -1,114 +0,0 @@
|
||||
CREATE USER
|
||||
================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于创建新的 OceanBase 用户。创建新用户后,可以使用该用户连接 OceanBase。
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
必须拥有全局的CREATE USER权限,才可以使用CREATE USER命令。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
create_user_stmt:
|
||||
CREATE USER [IF NOT EXISTS] user_name [IDENTIFIED BY 'password'];
|
||||
|
||||
alter_user_stmt:
|
||||
ALTER USER user_name ACCOUNT {LOCK | UNLOCK};
|
||||
| ALTER USER user_name IDENTIFIED BY 'password';
|
||||
| SET PASSWORD [FOR user_name] = PASSWORD('password');
|
||||
| RENAME USER rename_user_action_list;
|
||||
|
||||
drop_user_stmt:
|
||||
DROP USER user_name_list;
|
||||
|
||||
rename_user_action_list:
|
||||
rename_user_action [, rename_user_action ...]
|
||||
|
||||
rename_user_action:
|
||||
user_name TO user_name
|
||||
|
||||
user_name_list:
|
||||
user_name [, user_name ...]
|
||||
|
||||
password:
|
||||
STR_VALUE
|
||||
|
||||
CREATE USER [IF NOT EXISTS] user_specification_list;
|
||||
|
||||
user_specification_list:
|
||||
user_specification [, user_specification ...]
|
||||
|
||||
user_specification:
|
||||
user IDENTIFIED BY 'authstring'
|
||||
| user IDENTIFIED BY PASSWORD 'hashstring'
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|------------------------------------------|----------------------------------------------------|
|
||||
| user_name | 用户名,新建用户后,"mysql.user"表会新增一行该用户的表项。如果同名用户已经存在,则报错。 |
|
||||
| IDENTIFIED BY | 使用自选的 IDENTIFIED BY 子句,可以为账户给定一个密码。 |
|
||||
| user_name \[, user_name ...\] | 同时创建多个用户时,用","隔开。 |
|
||||
| user IDENTIFIED BY 'authstring' | 此处密码为明文,存入"mysql.user"表后,服务器端会变为密文存储下来。 |
|
||||
| user IDENTIFIED BY PASSWORD 'hashstring' | 此处密码为密文。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
1. 执行以下命令创建名为 sqluser01 和 sqluser02 的用户,密码均为 123456。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
CREATE USER 'sqluser01' IDENTIFIED BY '123456', 'sqluser02' IDENTIFIED BY '123456';
|
||||
```
|
||||
|
||||
|
||||
|
||||
2. 执行以下命令查看创建的用户。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT user FROM mysql.user;
|
||||
```
|
||||
|
||||
|
||||
|
||||
执行结果如下所示。
|
||||
|
||||
```javascript
|
||||
mysql> CREATE USER 'sqluser01' IDENTIFIED BY '123456', 'sqluser02' IDENTIFIED BY '123456';
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
mysql> select user from mysql.user;
|
||||
+-----------+
|
||||
| user |
|
||||
+-----------+
|
||||
| root |
|
||||
| admin |
|
||||
| sqluser01 |
|
||||
| sqluser02 |
|
||||
+-----------+
|
||||
4 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,54 +0,0 @@
|
||||
CREATE VIEW
|
||||
================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于创建视图语句,如果指定了 OR REPLACE 子句,该语句能够替换已有的视图。
|
||||
|
||||
视图在数据库中实际上并不是以表的形式存在,每次使用时他们就会派生。视图是作为在 CREATE VIEW 语句中指定的 SELECT 语句的结果而派生出来的。
|
||||
|
||||
OceanBase 2.2.50 支持可更新视图。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
create_view_stmt:
|
||||
CREATE [OR REPLACE] VIEW view_name [(column_name_list)] AS select_stmt;
|
||||
|
||||
column_name_list:
|
||||
column_name [, column_name ...]
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| OR REPLACE | 表示如果要创建的同义词名称已存在,则使用新的定义重新创建同义词。 |
|
||||
| view_name | 视图名。 |
|
||||
| select_stmt | 是一种 SELECT 语句。它给出了视图的定义。该语句可以从基表或其他视图进行选择。 |
|
||||
| column_name_list | 视图必须具有唯一的列名,不得有重复,就像基表那样。默认情况下,由 SELECT 语句检索的列名将用作视图列名。 要想为视图列定义明确的名称,可使用可选的 column_name_list 子句,列出由逗号隔开的 ID。column_name_list 中的名称数目必须等于SELECT语句检索的列数。 SELECT 语句检索的列可以是对表列的简单引用。也可以是使用函数、常量值、操作符等的表达式。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
选择表 t 中的 c1、c2 列来创建视图 v。
|
||||
|
||||
```javascript
|
||||
create or replace view v(vc1, vc2) as select c1, c2 from t;
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,267 +0,0 @@
|
||||
DELETE
|
||||
===========================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来删除表中符合条件的行,包括单表删除及多表删除两种方式。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
Single-Table-Delete Syntax:
|
||||
DELETE [hint_options] FROM tbl_name
|
||||
[PARTITION (partition_name,...)]
|
||||
[WHERE where_condition]
|
||||
[ORDER BY order_expression_list]
|
||||
[LIMIT row_count]
|
||||
|
||||
Multiple-Table-Delete Syntax:
|
||||
DELETE [hint_options] tbl_name[.*] [, tbl_name[.*]] ...
|
||||
FROM table_references
|
||||
[WHERE where_condition]
|
||||
Or:
|
||||
DELETE [hint_options] FROM tbl_name[.*] [, tbl_name[.*]] ...
|
||||
USING table_references
|
||||
[WHERE where_condition]
|
||||
|
||||
where_condition:
|
||||
expression
|
||||
|
||||
order_expression_list:
|
||||
order_expression [, order_expression ...]
|
||||
|
||||
order_expression:
|
||||
expression [ASC | DESC]
|
||||
|
||||
limit_row_count:
|
||||
INT_VALUE
|
||||
|
||||
table_references:
|
||||
{tbl_name | joined_table | table_subquery | select_with_parens} [, ...]
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-----------------------|----------------------|
|
||||
| hint_options | 指定hint选项。 |
|
||||
| tbl_name | 指定需要删除的表名。 |
|
||||
| partition_name | 需要删除表的对应分区名。 |
|
||||
| where_condition | 删除的表需要满足的过滤条件。 |
|
||||
| order_expression_list | 删除的表的排序键列表。 |
|
||||
| row_count | 删除的表的行数指定,指定的值只能为整数。 |
|
||||
| table_references | 多表删除时指定的待选择的表序列。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
示例表及数据基于以下定义:
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>create table t1(c1 int primary key, c2 int);
|
||||
Query OK, 0 rows affected (0.16 sec)
|
||||
OceanBase(admin@test)>select * from t1;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 1 | 1 |
|
||||
| 2 | 2 |
|
||||
| 3 | 3 |
|
||||
| 4 | 4 |
|
||||
+----+------+
|
||||
4 rows in set (0.06 sec)
|
||||
|
||||
OceanBase(admin@test)>create table t2(c1 int primary key, c2 int) partition by key(c1) partitions 4;
|
||||
Query OK, 0 rows affected (0.19 sec)
|
||||
OceanBase(admin@test)>select * from t2;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 5 | 5 |
|
||||
| 1 | 1 |
|
||||
| 2 | 2 |
|
||||
| 3 | 3 |
|
||||
+----+------+
|
||||
4 rows in set (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 单表删除:删除 "c1=2" 的行,其中 c1 列为表 t1 中的 Primary Key。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>DELETE FROM t1 WHERE c1 = 2;
|
||||
Query OK, 1 row affected (0.02 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from t1;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 1 | 1 |
|
||||
| 3 | 3 |
|
||||
| 4 | 4 |
|
||||
+----+------+
|
||||
3 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 单表删除:删除表 t2 的按照 c2 列排序之后的第一行数据。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>DELETE FROM t1 ORDER BY c2 LIMIT 1;
|
||||
Query OK, 1 row affected (0.01 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from t1;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 2 | 2 |
|
||||
| 3 | 3 |
|
||||
| 4 | 4 |
|
||||
+----+------+
|
||||
3 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 单表删除:执行删除表 t2 的 p2 分区的数据。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>DELETE FROM t2 PARTITION(p2);
|
||||
Query OK, 3 rows affected (0.02 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from t2;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 5 | 5 |
|
||||
+----+------+
|
||||
1 row in set (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 多表删除:删除 t1,t2 表中 "t1.c1 = t2.c1" 的数据。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>DELETE t1, t2 FROM t1, t2 WHERE t1.c1 = t2.c1;
|
||||
Query OK, 3 rows affected (0.02 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from t1;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 4 | 4 |
|
||||
+----+------+
|
||||
1 row in set (0.01 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from t2;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 5 | 5 |
|
||||
+----+------+
|
||||
1 row in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 多表删除:删除 t1,t2 表中 "t1.c1 = t2.c1" 的数据。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>DELETE FROM t1, t2 USING t1, t2 WHERE t1.c1 = t2.c1;
|
||||
Query OK, 4 rows affected (0.02 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from t1;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 4 | 4 |
|
||||
+----+------+
|
||||
1 row in set (0.01 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from t2;
|
||||
Empty set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 多表删除:删除 t2 表中的 p2 分区中和 t1 表中 "t1.c1 = t2.c1" 的数据。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>DELETE t2 FROM t1,t2 PARTITION(p2) WHERE t1.c1 = t2.c1;
|
||||
Query OK, 3 rows affected (0.02 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from t2;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 5 | 5 |
|
||||
+----+------+
|
||||
1 row in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 对可更新视图v进行删除操作
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>create view v as select * from t1;
|
||||
Query OK, 0 rows affected (0.07 sec)
|
||||
|
||||
OceanBase(admin@test)>delete from v where v.c1 = 1;
|
||||
Query OK, 1 row affected (0.02 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from v;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 2 | 2 |
|
||||
| 3 | 3 |
|
||||
| 4 | 4 |
|
||||
+----+------+
|
||||
3 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
注意事项
|
||||
-------------
|
||||
|
||||
不管是多表删除还是单表删除都不支持直接对子查询进行删除操作,比如:
|
||||
|
||||
`delete from (select * from t1);`
|
@ -1,70 +0,0 @@
|
||||
DROP DATABASE
|
||||
==================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
DROP DATABASE 用于删除数据库。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
drop_database_stmt:
|
||||
DROP DATABASE [IF EXISTS] database_name;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|---------------|-------------------|
|
||||
| IF EXISTS | 用于防止当数据库不存在时发生错误。 |
|
||||
| database_name | 指定待删除的数据库名。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 删除数据库 test2。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>drop database test2;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 删除不存在的数据库 notest。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>drop database notest;
|
||||
ERROR 1008 (HY000): Can't drop database 'notest'; database doesn't exist
|
||||
|
||||
OceanBase(admin@test)>drop database if exists notest;
|
||||
Query OK, 0 rows affected, 1 warning (0.00 sec)
|
||||
|
||||
OceanBase(admin@test)>show warnings;
|
||||
+-------+------+------------------------------------------------------+
|
||||
| Level | Code | Message |
|
||||
+-------+------+------------------------------------------------------+
|
||||
| Note | 1008 | Can't drop database 'notest'; database doesn't exist |
|
||||
+-------+------+------------------------------------------------------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,48 +0,0 @@
|
||||
DROP INDEX
|
||||
===============================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来删除索引。当索引过多时,维护开销增大,因此,需要删除不必要的索引。
|
||||
|
||||
删除索引的时候需要等待一段时间才能完全删除。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
DROP INDEX indexname
|
||||
ON tblname;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-----------|---------|
|
||||
| indexname | 指定索引名称。 |
|
||||
| tblname | 指定表名。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 删除索引test_index。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
DROP INDEX test_index ON test;
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,44 +0,0 @@
|
||||
DROP OUTLINE
|
||||
=================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于删除 OceanBase 数据库中的 OUTLINE。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
DROP OUTLINE outline_name;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|--------------|--------------------|
|
||||
| outline_name | 指定要删除的 OUTLINE 名称。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 删除 OUTLINE ol_1
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
DROP OUTLINE ol_1;
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,45 +0,0 @@
|
||||
DROP RESOURCE POOL
|
||||
=======================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来删除资源池。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
DROP RESOURCE POOL poolname;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|----------|-----------|
|
||||
| poolname | 要删除的资源池名称 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 删除资源池 pool1。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> DROP RESOURCE POOL pool1;
|
||||
Query OK, 0 rows affected (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,47 +0,0 @@
|
||||
DROP RESOURCE UNIT
|
||||
=======================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来删除资源单元配置。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
DROP RESOURCE UNIT unitname
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|----------|---------------|
|
||||
| unitname | 要删除的资源单元配置的名称 |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 删除资源单元配置unit1。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> DROP RESOURCE UNIT unit1;
|
||||
Query OK, 0 rows affected (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,50 +0,0 @@
|
||||
DROP RESTORE POINT
|
||||
=======================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------------------
|
||||
|
||||
该语句用来删除还原点(Restore Point)。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
系统租户不支持删除还原点。
|
||||
|
||||
格式
|
||||
-----------------------
|
||||
|
||||
```unknow
|
||||
DROP RESTORE POINT restore_point;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 描述 |
|
||||
|---------------|----------|
|
||||
| restore_point | 指定还原点名称。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------------------
|
||||
|
||||
* 删除一个还原点 rp1。
|
||||
|
||||
```unknow
|
||||
obclient> DROP RESTORE POINT rp1;
|
||||
Query OK, 0 rows affected (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,70 +0,0 @@
|
||||
ALTER OUTLINE
|
||||
==================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句仅支持使用SQL_TEXT创建的 OUTLINE,可用于添加绑定OUTLINE和限流规则。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
ALTER OUTLINE outline_name ADD stmt [ TO target_stmt ]
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| outline_name | 指定要创建的 OUTLINE 名称。 |
|
||||
| stmt | 一般为一个带有 hint 和原始参数的 DML 语句。 |
|
||||
| TO target_stmt | 如果不指定 TO target_stmt, 则表示如果数据库接受的SQL参数化后与stmt去掉hint参数化文本相同,则将该SQL绑定stmt中hint生成执行计划;如果期望对含有hint的语句进行固定计划,则需要 TO target_stmt 来指明原始的SQL。 **注意** 在使用target_stmt时,严格要求stmt与target_stmt在去掉hint后完全匹配。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 通过ALTER OUTLINE来添加限流规则。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase (root@oceanbase)> alter outline ol_1 add select /*+max_concurrent(1)*/ * from t1 where c1 = 1 and c2 = ?;
|
||||
OceanBase (root@oceanbase)> alter outline ol_1 add select /*+max_concurrent(1)*/ * from t1 where c1 = ? and c2 = 1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 通过ALTER OUTLINE来添加执行计划。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase (root@oceanbase)> create outline ol_2 on select /*+max_concurrent(1)*/ * from t1,t2 where t1.c1 = 1;
|
||||
OceanBase (root@oceanbase)> alter outline ol_2 add select /*+use_nl(t2)*/ * from t1,t2 where t1.c1 = 1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
注意事项
|
||||
-------------
|
||||
|
||||
* 同一个outline_name 只能指定一个执行计划。如果通过create outline语句指定了执行计划,则无法通过执行alter outline时再添加。
|
||||
|
||||
* 同create outline类似,在alter outline时不能同时指定限流规则和执行计划。
|
||||
|
||||
* 执行alter outline时,需要outline_name和signature同时匹配。
|
||||
|
||||
|
||||
|
@ -1,49 +0,0 @@
|
||||
DROP TABLE
|
||||
===============================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于删除 OceanBase 数据库中的表。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
DROP [TEMPORARY] {TABLE | TABLES} [IF EXISTS]
|
||||
table_name [,table_name]...
|
||||
[RESTRICT | CASCADE]
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|---------------------|--------------------------------------------|
|
||||
| table_name | 指定要删除的表名,同时删除多个表时,用","隔开。 |
|
||||
| IF EXISTS | 如果指定IF EXISTS,即使要删除的表不存在,也不会报错;如果不指定,则会报错。 |
|
||||
| TEMPORARY | 删除临时表。 |
|
||||
| RESTRICT \| CASCADE | 用于其它数据库迁移至OceanBase的场景。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 删除表 test
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
DROP TABLE IF EXISTS test;
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,41 +0,0 @@
|
||||
DROP TABLEGROUP
|
||||
====================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来删除表组。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
DROP TABLEGROUP [IF EXISTS] tablegroupname
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|----------------|--------------------------------------------|
|
||||
| tablegroupname | 表组名称。如果要删除的表组名称不存在,并且没有指定IF EXISTS,则会出现错误。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
删除名为 myTableGroup1 的表组。
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> DROP TABLEGROUP myTableGroup1;
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,49 +0,0 @@
|
||||
DROP TENANT
|
||||
================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于删除一个 OceanBase 租户。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
drop_tenant_stmt:
|
||||
DROP TENANT [IF EXISTS] tenant_name;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-------------|---------------------------------------------------------------------|
|
||||
| tenant_name | 指定要删除的租户名。 只能删除处于"锁定"状态下的租户,对非锁定状态下的租户执行 DROP 时会报错。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 删除租户 TENANT1:
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
DROP TENANT TENANT1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
注意事项
|
||||
-------------
|
||||
|
||||
只有用root用户连接到根租户(root@ROOT)才能执行 DROP TENANT 去删除租户。
|
@ -1,100 +0,0 @@
|
||||
DROP SYNONYM
|
||||
=================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来删除一个同义词。
|
||||
|
||||
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
DROP [PUBLIC] SYNONYM [ DATABASE. ]synonym;
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
参数说明
|
||||
-------------
|
||||
|
||||
* PUBLIC
|
||||
|
||||
指定PUBLIC来删除公共同义词;如果不指定PUBLIC,则删除私有同义词。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* \[ DATABASE. \]synonym
|
||||
|
||||
DATABASE指定当前同义词属于哪个DataBase,如果指定了PUBLIC,则对同义词不需要指定DataBase;synonym表示同义词的名称。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
举例
|
||||
-----------
|
||||
|
||||
* 删除一个同义词。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>drop synonym test.s1;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 删除一个PUBLIC同义词
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>drop public synonym syn_pub;
|
||||
Query OK, 0 rows affected (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### 注意事项
|
||||
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
* 删除私有同义词时,需要满足要删除的synonym在对应DataBase下并要有DROP ANY SYNONYM权限。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 删除公共同义词时,需要有DROP PUBLIC SYNONYM权限 。
|
||||
|
||||
|
||||
|
||||
* 删除public synonym时,必须指定PUBLIC关键字,且不能指定DataBase。
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,60 +0,0 @@
|
||||
DROP USER
|
||||
==============================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于删除一个或多个OceanBase用户。
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
* 必须拥有全局的 CREATE USER 权限,才可以使用 DROP USER 命令。
|
||||
|
||||
|
||||
|
||||
* 不能对 mysql.user 表通过 DELETE 方式进行权限管理。
|
||||
|
||||
|
||||
|
||||
* 成功删除用户后,该用户的所有权限也会被一同删除。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
DROP USER username [, username...];
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 描述 |
|
||||
|----------|-----------------------|
|
||||
| username | 用户名。同时删除多个用户时,用","隔开。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
执行以下命令,删除名为 sqluser02 的用户。
|
||||
|
||||
```javascript
|
||||
oceanBase(admin@TEST)>drop user sqluser02;
|
||||
Query OK, 0 rows affected (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,60 +0,0 @@
|
||||
DROP VIEW
|
||||
==============================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于删除一个或多个视图。
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
当前用户必须在每个视图上有 DROP 权限。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
drop_view_stmt:
|
||||
DROP VIEW [IF EXISTS] view_name_list [CASCADE | RESTRICT];
|
||||
|
||||
view_name_list:
|
||||
view_name [, view_name_list]
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|------------------|-------------------------------------------------------------------------|
|
||||
| IF EXISTS | 使用IF EXISTS关键字可以防止因不存在的视图而出错。 |
|
||||
| view_name_list | 如果view_name_list中包含一部分存在和一部分不存在的视图,执行可能报错但是存在的视图依然会被删除。 |
|
||||
| CASCADE、RESTRICT | CASCADE 和 RESTRICT 会被解析和忽略。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
分别执行以下命令,删除 v1 和 v2 两个视图。如果 v1或 v2 至少有一个视图不存在,则第一条命令会报错。
|
||||
|
||||
```javascript
|
||||
drop view v1, v2;
|
||||
|
||||
drop view if exists v1, v2;
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,195 +0,0 @@
|
||||
EXPLAIN
|
||||
============================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于解释 SQL 语句的执行计划,可以是SELECT、DELETE、INSERT、REPLACE或UPDATE语句。提供正则过滤功能,通过session变量explain_regex对输出行/JSON进行过滤。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
获取表或列的信息:
|
||||
{EXPLAIN | DESCRIBE | DESC} tbl_name [col_name | wild]
|
||||
|
||||
获取SQL计划信息:
|
||||
{EXPLAIN | DESCRIBE | DESC}
|
||||
[BASIC | OUTLINE | EXTENDED | EXTENDED_NOADDR | PARTITIONS | FORMAT = {TRADITIONAL| JSON}]
|
||||
{SELECT statement | DELETE statement | INSERT statement | REPLACE statement| UPDATE statement}
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| tbl_name | 指定表名。 |
|
||||
| col_name | 指定表的列名。 |
|
||||
| BASIC | 指定输出计划的基础信息,如算子ID、算子名称、所引用的表名。 |
|
||||
| OUTLINE | 指定输出的计划信息包含outline信息。 |
|
||||
| EXTENDED | EXPLAIN产生附加信息,包括:每个算子的输入列和输出列,访问表的分区信息,当前使用的filter信息,如果当前算子使用了索引,显示所使用的索引列及抽取的query range。 |
|
||||
| EXTENDED_NOADDR | 以简约的方式展示附加信息。 |
|
||||
| PARTITIONS | 显示分区相关信息。 |
|
||||
| FORMAT = {TRADITIONAL\| JSON} | 指定EXPALIN的输出格式: * TRADITIONAL:表格输出格式 * JSON:KEY:VALUE输出格式, JSON显示为JSON字符串,包括EXTENDED和PARTITIONS信息。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* **省略explain_type**
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>explain select * from t1,t2 where t1.c2=t2.c2 and t2.c1 > 4\G
|
||||
*************************** 1. row ***************************
|
||||
Query Plan: =======================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST |
|
||||
---------------------------------------
|
||||
|0 |HASH JOIN | |9801000 |5933109|
|
||||
|1 | TABLE SCAN|t2 |10000 |6219 |
|
||||
|2 | TABLE SCAN|t1 |100000 |68478 |
|
||||
=======================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil),
|
||||
equal_conds([t1.c2 = t2.c2]), other_conds(nil)
|
||||
1 - output([t2.c2], [t2.c1]), filter(nil),
|
||||
access([t2.c2], [t2.c1]), partitions(p0)
|
||||
2 - output([t1.c2], [t1.c1]), filter(nil),
|
||||
access([t1.c2], [t1.c1]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* **EXTENDED**
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>explain extended_noaddr select * from t1,t2 where t1.c2=t2.c2 and t2.c1 > 4\G
|
||||
*************************** 1. row ***************************
|
||||
Query Plan: =======================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST |
|
||||
---------------------------------------
|
||||
|0 |HASH JOIN | |9801000 |5933109|
|
||||
|1 | TABLE SCAN|t2 |10000 |6219 |
|
||||
|2 | TABLE SCAN|t1 |100000 |68478 |
|
||||
=======================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil),
|
||||
equal_conds([t1.c2 = t2.c2]), other_conds(nil)
|
||||
1 - output([t2.c2], [t2.c1]), filter(nil),
|
||||
access([t2.c2], [t2.c1]), partitions(p0),
|
||||
is_index_back=false,
|
||||
range_key([t2.c1]), range(4 ; MAX),
|
||||
range_cond([t2.c1 > 4])
|
||||
2 - output([t1.c2], [t1.c1]), filter(nil),
|
||||
access([t1.c2], [t1.c1]), partitions(p0),
|
||||
is_index_back=false,
|
||||
range_key([t1.__pk_increment], [t1.__pk_cluster_id], [t1.__pk_partition_id]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
|
||||
```
|
||||
|
||||
|
||||
|
||||
* **TRADITIONAL** **格式**
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>explain format=TRADITIONAL select * from t1,t2 where t1.c2=t2.c2 and t2.c1 > 4\G
|
||||
*************************** 1. row ***************************
|
||||
Query Plan: =======================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST |
|
||||
---------------------------------------
|
||||
|0 |HASH JOIN | |9801000 |5933109|
|
||||
|1 | TABLE SCAN|t2 |10000 |6219 |
|
||||
|2 | TABLE SCAN|t1 |100000 |68478 |
|
||||
=======================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil),
|
||||
equal_conds([t1.c2 = t2.c2]), other_conds(nil)
|
||||
1 - output([t2.c2], [t2.c1]), filter(nil),
|
||||
access([t2.c2], [t2.c1]), partitions(p0)
|
||||
2 - output([t1.c2], [t1.c1]), filter(nil),
|
||||
access([t1.c2], [t1.c1]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* **JSON格式**
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>explain format=JSON select * from t1,t2 where t1.c2=t2.c2 and t2.c1 > 4\G
|
||||
*************************** 1. row ***************************
|
||||
Query Plan: {
|
||||
"ID":2,
|
||||
"OPERATOR":"JOIN",
|
||||
"NAME":"JOIN",
|
||||
"EST.ROWS":9800999,
|
||||
"COST":5933108,
|
||||
"output": [
|
||||
"t1.c1",
|
||||
"t1.c2",
|
||||
"t2.c1",
|
||||
"t2.c2"
|
||||
],
|
||||
"TABLE SCAN": {
|
||||
"ID":0,
|
||||
"OPERATOR":"TABLE SCAN",
|
||||
"NAME":"TABLE SCAN",
|
||||
"EST.ROWS":10000,
|
||||
"COST":6218,
|
||||
"output": [
|
||||
"t2.c2",
|
||||
"t2.c1"
|
||||
]
|
||||
},
|
||||
"TABLE SCAN": {
|
||||
"ID":1,
|
||||
"OPERATOR":"TABLE SCAN",
|
||||
"NAME":"TABLE SCAN",
|
||||
"EST.ROWS":100000,
|
||||
"COST":68477,
|
||||
"output": [
|
||||
"t1.c2",
|
||||
"t1.c1"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
EXPLAIN 的每个输出行提供一个表的相关信息,并且每个行包括下面的列:
|
||||
|
||||
|
||||
| **列名** | **说明** |
|
||||
|----------|-----------------|
|
||||
| ID | 计划执行序列号。 |
|
||||
| OPERATOR | 执行算子。 |
|
||||
| NAME | 算子所引用的表。 |
|
||||
| EST.ROWS | 估计执行到当前算子输出的行数。 |
|
||||
| COST | 执行到当前算子的CPU时间。 |
|
||||
|
||||
|
||||
|
@ -1,89 +0,0 @@
|
||||
FLASHBACK DATABASE
|
||||
=======================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
用于从回收站中恢复被删除的DATABASE。
|
||||
|
||||
前置条件
|
||||
-------------
|
||||
|
||||
回收站需要处于开启状态,可以通过
|
||||
|
||||
`show variables like 'recyclebin';`
|
||||
|
||||
来查看回收站是否开启。
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> show variables like 'recyclebin';
|
||||
+---------------+-------+
|
||||
| Variable_name | Value |
|
||||
+---------------+-------+
|
||||
| recyclebin | ON |
|
||||
+---------------+-------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
果回收站处于关闭状态,可以通过
|
||||
|
||||
`set recyclebin = on;`
|
||||
|
||||
来开启。回收站中的表没有被实际删除,仍然会占用资源,如果需要彻底删除,可以执行
|
||||
|
||||
`purge recyclebin;`
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
FLASHBACK DATABASE object_name TO BEFORE DROP [RENAME TO db_name];
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **解释** |
|
||||
|-------------|----------------------------------------------------------------------|
|
||||
| object_name | 指定要恢复的object名称,不支持指定DATABASE名称。恢复DATABASE时,也会将DATABASE下面的表、索引等都恢复出来。 |
|
||||
| RENAME to | 恢复时将DATABASE重命名。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 从回收站中恢复删除的DATABASE。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> create database da;
|
||||
Query OK, 1 row affected (0.03 sec)
|
||||
|
||||
OceanBase(admin@test)> drop database da;
|
||||
Query OK, 0 rows affected (0.04 sec)
|
||||
|
||||
OceanBase(admin@test)> show recyclebin;
|
||||
+--------------------------------------------------+---------------+----------+----------------------------+
|
||||
| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |
|
||||
+--------------------------------------------------+---------------+----------+----------------------------+
|
||||
| __recycle_$_1_1099511628829_18446744073709551615 | da | DATABASE | 2017-10-20 17:36:15.838771 |
|
||||
+--------------------------------------------------+---------------+----------+----------------------------+
|
||||
1 row in set (0.02 sec)
|
||||
|
||||
OceanBase(admin@test)> flashback database __recycle_$_1_1099511628829_18446744073709551615 to before drop;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,110 +0,0 @@
|
||||
FLASHBACK TABLE
|
||||
====================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
用于从回收站中恢复被删除的TABLE。
|
||||
|
||||
前置条件
|
||||
-------------
|
||||
|
||||
回收站需要处于开启状态,可以通过
|
||||
|
||||
`show variables like 'recyclebin';`
|
||||
|
||||
来查看回收站是否开启。
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> show variables like 'recyclebin';
|
||||
+---------------+-------+
|
||||
| Variable_name | Value |
|
||||
+---------------+-------+
|
||||
| recyclebin | ON |
|
||||
+---------------+-------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
如果回收站处于关闭状态,可以通过
|
||||
|
||||
`set recyclebin = on;`
|
||||
|
||||
来开启。回收站中的表没有被实际删除,仍然会占用资源,如果需要彻底删除,可以执行
|
||||
|
||||
`purge recyclebin;`
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
FLASHBACK TABLE object_name TO BEFORE DROP [RENAME to db_name.table_name];
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **解释** |
|
||||
|-------------|-------------------------------------------------------------------------|
|
||||
| object_name | 指定要恢复的object名称或表名,只有在表所在的database中才能执行。恢复TABLE时,也会将和TABLE相关的INDEX也恢复出来。 |
|
||||
| RENAME to | 修改表名和表所属的库。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 从回收站中恢复被删除的表t。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> create table t(id int primary key, k int);
|
||||
Query OK, 0 rows affected (0.04 sec)
|
||||
|
||||
OceanBase(admin@test)> insert into t values(1,1);
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
OceanBase(admin@test)> select * from t;
|
||||
+----+------+
|
||||
| id | k |
|
||||
+----+------+
|
||||
| 1 | 1 |
|
||||
+----+------+
|
||||
1 row in set (0.00 sec)
|
||||
|
||||
OceanBase(admin@test)> drop table t;
|
||||
Query OK, 0 rows affected (0.01 sec)
|
||||
|
||||
OceanBase(admin@test)> select * from t;
|
||||
ERROR 1146 (42S02): Table 'test.t' does not exist
|
||||
OceanBase(admin@test)> show recyclebin;
|
||||
+--------------------------------+---------------+-------+----------------------------+
|
||||
| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |
|
||||
+--------------------------------+---------------+-------+----------------------------+
|
||||
| __recycle_$_1_1597028971700936 | t | TABLE | 2020-08-10 11:09:31.701033 |
|
||||
+--------------------------------+---------------+-------+----------------------------+
|
||||
1 row in set (0.00 sec)
|
||||
|
||||
OceanBase(admin@test)> flashback table t to before drop;
|
||||
Query OK, 0 rows affected (0.01 sec)
|
||||
|
||||
OceanBase(admin@test)> select * from t;
|
||||
+----+------+
|
||||
| id | k |
|
||||
+----+------+
|
||||
| 1 | 1 |
|
||||
+----+------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,67 +0,0 @@
|
||||
FLASHBACK TENANT
|
||||
=====================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------------------
|
||||
|
||||
该语句用于从回收站中恢复被删除的租户。
|
||||
|
||||
前置条件
|
||||
-------------------------
|
||||
|
||||
回收站需要处于开启状态,可以通过`show variables like 'recyclebin';`来查看回收站是否开启。
|
||||
|
||||
```unknow
|
||||
OceanBase(admin@test)> show variables like 'recyclebin';
|
||||
+---------------+-------+
|
||||
| Variable_name | Value |
|
||||
+---------------+-------+
|
||||
| recyclebin | ON |
|
||||
+---------------+-------+
|
||||
1 row in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
如果回收站处于关闭状态,可以通过`set recyclebin = on;`来开启。回收站中的表没有被实际删除,仍然会占用资源,如果需要彻底删除,可以执行`purge recyclebin;`
|
||||
|
||||
格式
|
||||
-----------------------
|
||||
|
||||
```unknow
|
||||
FLASHBACK TENANT tenant_name TO BEFORE DROP [RENAME to new_tenant_name];
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
--------------------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 解释 |
|
||||
|-----------------|---------------------------------------------------------------------------------------|
|
||||
| tenant_name | 指定要恢复的租户名。可以使用原始租户名,也可以使用在回收站中的名字。回收站中的名字具有唯一性,可以指定确定的租户;原始租户名可能会重复,此时恢复的是最晚进入回收站的租户。 |
|
||||
| new_tenant_name | 将恢复后的租户重新命名。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------------------
|
||||
|
||||
* 从回收站中恢复被删除的租户tenant1。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```unknow
|
||||
obclient> flashback tenant tenant1 to before drop;
|
||||
Query OK, 0 rows affected (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,64 +0,0 @@
|
||||
ALTER RESOURCE POOL
|
||||
========================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来修改资源池。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
ALTER RESOURCE POOL poolname
|
||||
UNIT [=] unitname,
|
||||
UNIT_NUM [=] unitnum,
|
||||
ZONE [=] ('zone' [, 'zone' ...]);
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-----------|-----------------------------------------------------|
|
||||
| UNIT | 指定要使用的资源单元配置的名称 |
|
||||
| UNIT_NUM | 指定要创建的一个 ZONE 下的资源单元个数,取值要小于对应 ZONE 中的 OBServer 个数。 |
|
||||
| ZONE_LIST | 指定要创建的资源单元的 ZONE 列表 |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 不能同时修改 RESOURCE POOL 的 unit, unit_num, zone_list 多个属性,执行将报错。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> ALTER RESOURCE POOL pool1 unit='unit2', unit_num=1, zone_list=('zone1');
|
||||
ERROR 1235 (0A000): alter unit_num, resource_unit, zone_list in one cmd not supported
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 修改 RESOURCE POOL 的单条 unit 属性。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> ALTER RESOURCE POOL pool1 unit='unit2';
|
||||
Query OK, 0 rows affected (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,138 +0,0 @@
|
||||
GRANT
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于系统管理员授予 User 某些权限。
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
* 当前用户必须拥有被授予的权限(例如,user1 把表 t1 的 SELECT 权限授予 user2,则 user1 必须拥有表 t1 的 SELECT 的权限),并且拥有 GRANT OPTION 权限,才能授予成功。
|
||||
|
||||
|
||||
|
||||
* 用户授权后,该用户只有重新连接OceanBase,权限才能生效。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
GRANT priv_type
|
||||
ON priv_level
|
||||
TO user_specification [, user_specification]...
|
||||
[WITH with_option ...]
|
||||
|
||||
privilege_type:
|
||||
ALTER
|
||||
| CREATE
|
||||
| CREATE USER
|
||||
| CREATE VIEW
|
||||
| DELETE
|
||||
| DROP
|
||||
| GRANT OPTION
|
||||
| INDEX
|
||||
| INSERT
|
||||
| PROCESS
|
||||
| SELECT
|
||||
| SHOW DATABASES
|
||||
| SHOW VIEW
|
||||
| SUPER
|
||||
| UPDATE
|
||||
| USAGE
|
||||
| CREATE SYNONYM
|
||||
|
||||
priv_level:
|
||||
*
|
||||
| *.*
|
||||
| db_name.*
|
||||
| db_name.tbl_name
|
||||
| tbl_name
|
||||
| db_name.routine_name
|
||||
|
||||
user_specification:
|
||||
user [IDENTIFIED BY [PASSWORD] 'password']
|
||||
|
||||
with_option:
|
||||
GRANT OPTION
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| priv_type | 指定授予的权限类型。具体的权限类型及其说明请参见下方权限类型说明表。 同时把多个权限赋予用户时,权限类型用","隔开。 |
|
||||
| priv_level | 指定授予权限的层级。权限可以分为以下几个层级: * 全局层级:适用于所有的数据库。使用 GRANT ALL ON \*.\*授予全局权限。 * 数据库层级:适用于一个给定数据库中的所有目标。使用 GRANT ALL ON db_name.\* 授予数据库权限。 * 表层级:表权限适用于一个给定表中的所有列。使用 GRANT ALL ON db_name.tbl_name 授予表权限。 用"\*"代替table_name,表示赋予全局权限,即对数据库中的所有表赋权。 |
|
||||
| user_specification | 给特定用户授予权限。如果用户不存在,可以直接创建用户。 sql_mode='no_auto_create_user',同时没有identified by 指定密码时,不可以直接创建用户。 同时给多个用户授权时,用户名用","隔开。 |
|
||||
| user IDENTIFIED BY 'password' | 此处密码为明文。 |
|
||||
| user IDENTIFIED BY PASSWORD 'password' | 此处密码为密文。 |
|
||||
| with_option | 指定权限是否允许转授 |
|
||||
|
||||
|
||||
|
||||
可以授予的权限类型如下表所示。
|
||||
|
||||
**权限类型说明表**
|
||||
|
||||
|
||||
| **权限** | **说明** |
|
||||
|-------------------|-----------------------------------------------------------------|
|
||||
| ALL PRIVILEGES | 除GRANT OPTION以外所有权限。 |
|
||||
| ALTER | ALTER TABLE的权限。 |
|
||||
| CREATE | CREATE TABLE的权限。 |
|
||||
| CREATE USER | CREATE USER,DROP USER,RENAME USER和REVOKE ALL PRIVILEGES的权限。 |
|
||||
| CREATE TABLEGROUP | 全局CREATE TABLEGROUP的权限。 |
|
||||
| DELETE | DELETE的权限。 |
|
||||
| DROP | DROP的权限。 |
|
||||
| GRANT OPTION | GRANT OPTION的权限。 |
|
||||
| INSERT | INSERT的权限。 |
|
||||
| SELECT | SELECT的权限。 |
|
||||
| UPDATE | UPDATE的权限。 |
|
||||
| SUPER | SET GLOBAL修改全局系统参数的权限。 |
|
||||
| SHOW DATABASES | 全局 SHOW DATABASES的权限。 |
|
||||
| INDEX | CREATE INDEX, DROP INDEX的权限 |
|
||||
| CREATE VIEW | 创建、删除视图的权限。 |
|
||||
| SHOW VIEW | SHOW CREATE VIEW权限。 |
|
||||
| CREATE SYNONYM | 创建同义词的权限。 |
|
||||
|
||||
|
||||
|
||||
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
目前没有 change effective tenant 的权限控制,故 sys 租户下的用户都可以进行授权。
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 执行以下命令给用户 obsqluser01 赋予所有权限。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@TEST)>GRANT ALL PRIVILEGES ON *.* TO obsqluser01 with grant option;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,245 +0,0 @@
|
||||
INSERT
|
||||
===========================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于添加一个或多个记录到表中。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
INSERT [IGNORE] [INTO]
|
||||
single_table_insert
|
||||
[ON DUPLICATE KEY UPDATE update_asgn_list]
|
||||
|
||||
single_table_insert:
|
||||
{dml_table_name values_clause
|
||||
| dml_table_name '(' ')' values_clause
|
||||
| dml_table_name '(' column_list ')' values_clause
|
||||
| dml_table_name SET update_asgn_list}
|
||||
|
||||
dml_table_name:
|
||||
tbl_name [PARTITION (partition_name,...)]
|
||||
|
||||
values_clause:
|
||||
{{VALUES | VALUE} ({expr | DEFAULT},...) [, ...]
|
||||
| select_stmt}
|
||||
|
||||
column_list
|
||||
column_name [, ...]
|
||||
|
||||
update_asgn_list:
|
||||
column_name = expr [, ...]
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
**INSERT...ON DUPLICATE KEY UPDATE...** **语句执行,affect row的计算:**
|
||||
|
||||
* 在没有设置client_capabilities中CLIENT_FOUND_ROWS的情况下:
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* 如果设置了CLIENT_FOUND_ROWS:
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* CLIENT_FOUND_ROWS的影响在于:不设置CLIENT_FOUND_ROWS的情况下,计算affected_row的值,只计算实际更新了行数,而设置了CLIENT_FOUND_ROWS的话,会把所有touched行数(满足冲突条件的行)都记上,而不管其是否发生了真正的数据修改。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-------------------------|-----------------------------------------------------------------------------------------------------------------------------|
|
||||
| IGNORE | 在INSERT语句执行过程中发生的错误将会被忽略。 |
|
||||
| column_list | 用于指定插入数据的列,同时插入多列时,用","隔开。 |
|
||||
| tbl_name | 指定要插入的表名。 |
|
||||
| partition_name | 插入表指定的分区名。 |
|
||||
| update_asgn_list | 赋值语句,例如:"c1 = 2" |
|
||||
| ON DUPLICATE KEY UPDATE | 指定对重复主键或唯一键的处理。如果指定了ON DUPLICATE KEY UPDATE,当要插入的主键或唯一键有重复时,会用配置值替换待插入的值;如果不指定ON DUPLICATE KEY UPDATE,当要插入的主键或唯一键有重复时,插入报错。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
示例表及数据基于以下定义:
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>create table t1(c1 int primary key, c2 int) partition by key(c1) partitions 4;
|
||||
Query OK, 0 rows affected (0.16 sec)
|
||||
|
||||
OceanBase(admin@test)>create table t2(c1 int primary key, c2 int);
|
||||
Query OK, 0 rows affected (0.16 sec)
|
||||
OceanBase(admin@test)>select * from t2;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 1 | 1 |
|
||||
| 2 | 2 |
|
||||
| 3 | 3 |
|
||||
| 4 | 4 |
|
||||
+----+------+
|
||||
4 rows in set (0.06 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 向表 t1 中插入一行数数据。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>insert into t1 values(1,1);
|
||||
Query OK, 1 row affected (0.01 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from t1;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 1 | 1 |
|
||||
+----+------+
|
||||
1 row in set (0.04 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 向表 t1 中插入多行数据。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>insert t1 values(1,1),(2,default),(2+2,3*4);
|
||||
Query OK, 3 rows affected (0.02 sec)
|
||||
Records: 3 Duplicates: 0 Warnings: 0
|
||||
|
||||
OceanBase(admin@test)>select * from t1;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 1 | 1 |
|
||||
| 2 | NULL |
|
||||
| 4 | 12 |
|
||||
+----+------+
|
||||
3 rows in set (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 向表 t1 指定的 p0 分区插入单行数据。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>insert into t1 partition(p0) (c1) values(5);
|
||||
Query OK, 1 row affected (0.02 sec)
|
||||
OceanBase(admin@test)>select * from t1 partition(p0);
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 5 | NULL |
|
||||
+----+------+
|
||||
1 row in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 将表 t2 的查询结果作为数据插入表 t1。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>insert into t1 select * from t2;
|
||||
Query OK, 4 rows affected (0.02 sec)
|
||||
Records: 4 Duplicates: 0 Warnings: 0
|
||||
|
||||
OceanBase(admin@test)>select * from t1;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 1 | 1 |
|
||||
| 2 | 2 |
|
||||
| 3 | 3 |
|
||||
| 4 | 4 |
|
||||
+----+------+
|
||||
4 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 向表 t1 中插入重复主键值时利用 ON DUPLICATE KEY UPDATE 功能进行值更新
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>insert into t1 values(1,1),(1,2) ON DUPLICATE KEY UPDATE c1=100;
|
||||
Query OK, 3 rows affected (0.01 sec)
|
||||
Records: 2 Duplicates: 1 Warnings: 0
|
||||
|
||||
OceanBase(admin@test)>select * from t1;
|
||||
+-----+------+
|
||||
| c1 | c2 |
|
||||
+-----+------+
|
||||
| 100 | 1 |
|
||||
+-----+------+
|
||||
1 row in set (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 对可更新视图v的插入值
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>create view v as select * from t1;
|
||||
Query OK, 0 rows affected (0.07 sec)
|
||||
OceanBase(admin@test)>insert into v values(1,1);
|
||||
Query OK, 1 row affected (0.01 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from v;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 1 | 1 |
|
||||
+----+------+
|
||||
1 row in set (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
注意事项
|
||||
-------------
|
||||
|
||||
INSERT语句不支持直接对子查询进行插入操作,比如:
|
||||
|
||||
`insert into (select * from t1) values(1, 1);`
|
||||
|
@ -1,60 +0,0 @@
|
||||
KILL
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来终止一个会话。
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
如果您拥有 PROCESS 权限,则您可以查看所有会话。如果您拥有 SUPER 权限,您可以终止所有会话和语句。否则,您只能查看和终止您自己的会话和语句。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
KILL [CONNECTION | QUERY] 'sessionid'
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-----------------|-----------------------------------|
|
||||
| KILL CONNECTION | 与不含修改符的KILL一样,可终止给定的 *threadid* 。 |
|
||||
| KILL QUERY | 可终止连接当前正在执行的语句,但是会保持连接的原状。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
终止 sessionid 为 3221638213 的会话连接当前正在执行的语句后,再终止该会话。
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>show processlist;
|
||||
+------------+-------+--------------------+------+---------+------+--------+------------------+
|
||||
| Id | User | Host | db | Command | Time | State | Info |
|
||||
+------------+-------+--------------------+------+---------+------+--------+------------------+
|
||||
| 3221638212 | admin | 1.11.111.127:11161 | test | Query | 0 | ACTIVE | show processlist |
|
||||
| 3221638213 | admin | 1.11.111.127:11161 | test | Query | 0 | ACTIVE | select "abcedfg" |
|
||||
+------------+-------+--------------------+------+---------+------+--------+------------------+
|
||||
1 row in set (0.03 sec)
|
||||
|
||||
OceanBase(admin@test)>kill query 3221638213;
|
||||
Query OK, 0 rows affected (0.01 sec)
|
||||
|
||||
OceanBase(admin@test)>kill 3221638212;
|
||||
Query OK, 0 rows affected (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,60 +0,0 @@
|
||||
PURGE DATABASE
|
||||
===================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于删除放在回收站的数据库。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
PURGE DATABASE object_name;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-------------|--------------|
|
||||
| object_name | 对象进入回收站后的新名字 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 删除放在回收站的数据库 __recycle_$_1_1597384386029184。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> create database db1;
|
||||
Query OK, 1 row affected (0.03 sec)
|
||||
|
||||
OceanBase(admin@test)> drop database db1;
|
||||
Query OK, 0 rows affected (0.04 sec)
|
||||
|
||||
OceanBase(admin@test)> show recyclebin;
|
||||
+--------------------------------+---------------+----------+----------------------------+
|
||||
| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |
|
||||
+--------------------------------+---------------+----------+----------------------------+
|
||||
| __recycle_$_1_1597384386029184 | db1 | DATABASE | 2020-08-14 13:53:06.029367 |
|
||||
+--------------------------------+---------------+----------+----------------------------+
|
||||
1 row in set (0.01 sec)
|
||||
|
||||
OceanBase(admin@test)> purge database __recycle_$_1_1597384386029184;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
|
||||
OceanBase(admin@test)> show recyclebin;
|
||||
```
|
||||
|
||||
|
@ -1,62 +0,0 @@
|
||||
PURGE INDEX
|
||||
================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来删除放在回收站中的索引表。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
PURGE INDEX object_name;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-------------|--------------|
|
||||
| object_name | 对象进入回收站后的新名字 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 删除放在回收站中的索引表 __recycle_$_1_1597387726700872。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> create table t1(c1 int);
|
||||
Query OK, 0 rows affected (0.09 sec)
|
||||
|
||||
OceanBase(admin@test)> create index idx on t1(c1);
|
||||
Query OK, 0 rows affected (0.48 sec)
|
||||
|
||||
OceanBase(admin@test)> drop table t1;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
|
||||
OceanBase(admin@test)> show recyclebin;
|
||||
+--------------------------------+----------------------------+-------+----------------------------+
|
||||
| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |
|
||||
+--------------------------------+----------------------------+-------+----------------------------+
|
||||
| __recycle_$_1_1597387726700872 | __idx_1101710651081557_idx | INDEX | 2020-08-14 14:48:46.699145 |
|
||||
| __recycle_$_1_1597387726712976 | t1 | TABLE | 2020-08-14 14:48:46.712643 |
|
||||
+--------------------------------+----------------------------+-------+----------------------------+
|
||||
5 rows in set (0.01 sec)
|
||||
|
||||
OceanBase(admin@test)> purge index __recycle_$_1_1597387726700872;
|
||||
Query OK, 0 rows affected (0.04 sec)
|
||||
```
|
||||
|
||||
|
@ -1,43 +0,0 @@
|
||||
PURGE RECYCLEBIN
|
||||
=====================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于 root 用户清空回收站。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
PURGE RECYCLEBIN会清除回收站中的所有东西,只有 root 用户才能够执行这条语句,操作时请谨慎。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
PURGE RECYCLEBIN;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
无。
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* root 用户清空回收站。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> purge recyclebin;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
```
|
||||
|
||||
|
@ -1,59 +0,0 @@
|
||||
PURGE TABLE
|
||||
================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于删除放在回收站的表。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
PURGE TABLE object_name;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-------------|--------------|
|
||||
| object_name | 对象进入回收站后的新名字 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 删除放在回收站中的表 __recycle_$_1_1099511628776_1099511677778。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> create table test(c1 int);
|
||||
Query OK, 0 rows affected (0.16 sec)
|
||||
|
||||
OceanBase(admin@test)> drop table test;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
|
||||
OceanBase(admin@test)> show recyclebin;
|
||||
+-------------------------------------------+---------------+-------+----------------------------+
|
||||
| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |
|
||||
+-------------------------------------------+---------------+-------+----------------------------+
|
||||
| __recycle_$_1_1099511628776_1099511677778 | test | TABLE | 2017-10-20 17:40:22.304025 |
|
||||
+-------------------------------------------+---------------+-------+----------------------------+
|
||||
1 row in set (0.02 sec)
|
||||
|
||||
OceanBase(admin@test)> purge table __recycle_$_1_1099511628776_1099511677778;
|
||||
Query OK, 0 rows affected (0.04 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,63 +0,0 @@
|
||||
PURGE TENANT
|
||||
=================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------------------
|
||||
|
||||
该语句用于删除放在回收站的租户。
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
该语句只有系统租户可以执行。
|
||||
|
||||
格式
|
||||
-----------------------
|
||||
|
||||
```unknow
|
||||
PURGE TENANT tenant_name;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
--------------------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 描述 |
|
||||
|-------------|--------------------------------------------------------------------------------------|
|
||||
| tenant_name | 租户名称。可以使用删除前的原始租户名,也可以使用在回收站中的名字。回收站中的名字具有唯一性,可以指定确定的租户;原始租户名可能会重复,此时删除的是最早进入回收站的租户。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------------------
|
||||
|
||||
* 删除放在回收站中的租户 mysql。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```unknow
|
||||
obclient>show recyclebin;
|
||||
+--------------------------------+---------------+--------+----------------------------+
|
||||
| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |
|
||||
+--------------------------------+---------------+--------+----------------------------+
|
||||
| __recycle_$_1_1599722585571328 | mysql | TENANT | 2020-09-10 15:36:54.712101 |
|
||||
+--------------------------------+---------------+--------+----------------------------+
|
||||
1 row in set (0.02 sec)
|
||||
|
||||
obclient>purge tenant mysql;
|
||||
Query OK, 0 rows affected (0.17 sec)
|
||||
|
||||
obclient>show recyclebin;
|
||||
Empty set (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,96 +0,0 @@
|
||||
RENAME TABLE
|
||||
=================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来对一个或多个表进行重命名。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
RENAME TABLE tblname TO newtblname
|
||||
[, tb1name2 TO newtblname ...];
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|---------------------------------------------------------------------------|------------------|
|
||||
| tblname | 原表名。 |
|
||||
| newtblname | 新表名。 |
|
||||
| tblname TO newtblname \[, tb1name2 TO newtblname ...\]; | 多个表重命名时,使用","隔开。 |
|
||||
|
||||
|
||||
|
||||
注意事项
|
||||
-------------
|
||||
|
||||
* 重命名操作自动进行,重命名正在进行时,其他线程不能读取任何表。
|
||||
|
||||
* 如果此语句用于对多个表进行重命名,则重命名操作从左到右进行。
|
||||
|
||||
* 当您执行 RENAME 时,您不能有被锁定的表,也不能有处于活性状态的事务。还必须拥有原表的 ALTER 和 DROP 权限,以及新表的 CREATE 和 INSERT 权限。
|
||||
|
||||
* RENAME TABLE 也可以用于视图,只要确保是在同一个数据库中。
|
||||
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
1. 创建表 t1 和 t2。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
create table t1(c1 int);
|
||||
|
||||
create table t2(c1 int);
|
||||
```
|
||||
|
||||
|
||||
|
||||
2. 将表 t1 重命名为 t11。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
rename table t1 to t11;
|
||||
```
|
||||
|
||||
|
||||
|
||||
3. 将表 t11 重命名为 t111,表 t2 重命名为 t22。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
rename table t11 to t111, t2 to t22;
|
||||
```
|
||||
|
||||
|
||||
|
||||
4. 将表 t111 重命名为 t1111 后,再将表 t1111重命名为 t1。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
rename table t111 to t1111, t1111 to t1;
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,110 +0,0 @@
|
||||
RENAME USER
|
||||
================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于修改 OceanBase 登录用户的用户名。
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
必须拥有全局 CREATE USER 权限,才可以使用本命令。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
RENAME USER
|
||||
'oldusername' TO 'newusername'
|
||||
[,'oldusername' TO 'newusername'...];
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|--------------------------------|-----------------------------------------------------------|
|
||||
| oldusername | 旧用户名。 |
|
||||
| newusername | 新用户名。用户名的占用字节小于或等于16。 |
|
||||
| 'oldusername' TO 'newusername' | 修改用户名。同时修改多个用户名时,用","隔开。 修改前后,新旧用户权限保持一致。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
1. 修改前,执行以下命令,查看用户。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT user FROM mysql.user;
|
||||
```
|
||||
|
||||
|
||||
|
||||
结果如下所示。
|
||||
|
||||
```javascript
|
||||
mysql> SELECT user FROM mysql.user;
|
||||
+-----------+
|
||||
| user |
|
||||
+-----------+
|
||||
| root |
|
||||
| admin |
|
||||
| sqluser01 |
|
||||
| sqluser02 |
|
||||
+-----------+
|
||||
4 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
2. 执行以下命令,将 sqluser01 用户的用户名修改为 obsqluser01。
|
||||
|
||||
```javascript
|
||||
RENAME USER 'sqluser01' TO 'obsqluser01';
|
||||
```
|
||||
|
||||
|
||||
|
||||
3. 修改后,执行以下命令,查看用户。
|
||||
|
||||
```javascript
|
||||
SELECT user FROM mysql.user;
|
||||
```
|
||||
|
||||
|
||||
|
||||
结果如下所示。 sqluser01 用户的用户名被修改为 obsqluser01。
|
||||
|
||||
```javascript
|
||||
mysql> RENAME USER 'sqluser01' TO 'obsqluser01';
|
||||
Query OK, 0 rows affected (0.04 sec)
|
||||
|
||||
mysql> SELECT user FROM mysql.user;
|
||||
+-------------+
|
||||
| user |
|
||||
+-------------+
|
||||
| root |
|
||||
| admin |
|
||||
| obsqluser01 |
|
||||
| sqluser02 |
|
||||
+-------------+
|
||||
4 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,60 +0,0 @@
|
||||
ALTER RESOURCE UNIT
|
||||
========================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来修改资源单元配置。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
ALTER RESOURCE UNIT unitname
|
||||
MAX_CPU [=] cpunum,
|
||||
MAX_MEMORY [=] memsize,
|
||||
MAX_IOPS [=] iopsnum,
|
||||
MAX_DISK_SIZE [=] disksize,
|
||||
MAX_SESSION_NUM [=] sessionnum,
|
||||
[MIN_CPU [=] cpunum,]
|
||||
[MIN_MEMORY [=] memsize,]
|
||||
[MIN_IOPS [=] iopsnum] ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| 参数 | 描述 |
|
||||
|-----------------|---------------------------------------------------|
|
||||
| MAX_CPU | 指定要修改的 CPU 最多数量 |
|
||||
| MAX_MEMORY | 指定要修改的最大内存容量,取值范围为\[1073741824, +∞) 单位为字节,即最小值为1G |
|
||||
| MAX_IOPS | 指定要修改的 IOPS 最多数量,取值范围为\[128,+∞) |
|
||||
| MAX_DISK_SIZE | 指定要修改的最大硬盘容量,取值范围为[536870912,+∞]单位为字节,即最小值为512M |
|
||||
| MAX_SESSION_NUM | 指定要修改的 session 最多数量,取值范围为\[64,+∞) |
|
||||
| MIN_CPU | 指定要修改的 CPU 最少数量 |
|
||||
| MIN_MEMORY | 指定要修改的最小内存容量 |
|
||||
| MIN_IOPS | 指定要修改的 IOPS 最少数量 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 修改资源单元 unit1 最高配置为 2个CPU,2G 的内存容量。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> ALTER RESOURCE UNIT unit1 max_cpu 2, max_memory '2G';
|
||||
Query OK, 0 rows affected (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,124 +0,0 @@
|
||||
REPLACE
|
||||
============================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于替换一个或多个记录到表。如果没有主键或唯一键冲突则插入记录,如果存在冲突则先删除冲突记录再插入新的记录。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
replace_stmt:
|
||||
REPLACE [INTO] table_factor [PARTITION (partition_name_list)] [(column_name_list)]
|
||||
{VALUES | VALUE} column_value_lists;
|
||||
|
||||
partition_name_list:
|
||||
partition_name [, partition_name ...]
|
||||
|
||||
column_name_list:
|
||||
column_name [, column_name ...]
|
||||
|
||||
column_value_lists:
|
||||
(column_value_list) [, (column_value_list) ...]
|
||||
|
||||
column_value_list:
|
||||
column_value [, column_value ...]
|
||||
|
||||
column_value:
|
||||
{expression | DEFAULT}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
### 参数解释
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|---------------------|-----------|
|
||||
| table_factor | 替换的表名 |
|
||||
| column_name_list | 指定替换数据的列 |
|
||||
| partition_name_list | 替换表指定的分区名 |
|
||||
|
||||
|
||||
|
||||
### 示例
|
||||
|
||||
本示例基于如下表定义。
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>create table test (c1 int primary key, c2 varchar(40));
|
||||
Query OK, 0 rows affected (0.23 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
1. 替换 test 表中的行一和行二的值分别为 'hello alibaba' 和 'hello ob'。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>REPLACE INTO test VALUES (1, 'hello alibaba'),(2, 'hello ob');
|
||||
Query OK, 2 rows affected (0.01 sec)
|
||||
Records: 2 Duplicates: 0 Warnings: 0
|
||||
```
|
||||
|
||||
|
||||
|
||||
2. 查看 test 表中的行一和行二内容。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>SELECT * FROM test;
|
||||
+----+---------------+
|
||||
| c1 | c2 |
|
||||
+----+---------------+
|
||||
| 1 | hello alibaba |
|
||||
| 2 | hello ob |
|
||||
+----+---------------+
|
||||
2 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
3. 替换表 test 中的行三和行二的内容分别为 'hello alibaba' 和 'hello oceanbase'。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>REPLACE INTO test VALUES (3, 'hello alibaba'),(2, 'hello oceanbase');
|
||||
Query OK, 3 rows affected (0.00 sec)
|
||||
Records: 2 Duplicates: 1 Warnings: 0
|
||||
```
|
||||
|
||||
|
||||
|
||||
4. 查看 test 表中的行一、行二和行三的内容。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>SELECT * FROM test;
|
||||
+----+-----------------+
|
||||
| c1 | c2 |
|
||||
+----+-----------------+
|
||||
| 1 | hello alibaba |
|
||||
| 2 | hello oceanbase |
|
||||
| 3 | hello alibaba |
|
||||
+----+-----------------+
|
||||
3 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,113 +0,0 @@
|
||||
REVOKE
|
||||
===========================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于系统管理员撤销 User 的某些权限。
|
||||
|
||||
使用说明如下:
|
||||
|
||||
* 用户必须拥有被撤销的权限(例如,user1 要撤销 user2 对表 t1 的 SELECT 权限,则 user1 必须拥有表 t1 的 SELECT的权限),并且拥有 GRANT OPTION权限。
|
||||
|
||||
* 撤销 ALL PRIVILEGES 和 GRANT OPTION 权限时,当前用户必须拥有全局 GRANT OPTION 权限,或者对权限表的UPDATE 及 DELETE 权限。
|
||||
|
||||
* 撤销操作不会级联。例如,用户 user1 给 user2 授予了某些权限,撤回 user1 的权限不会同时也撤回 user2 的相应权限。
|
||||
|
||||
|
||||
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
REVOKE priv_type
|
||||
ON database.tblname
|
||||
FROM 'username';
|
||||
|
||||
privilege_type:
|
||||
ALTER
|
||||
| CREATE
|
||||
| CREATE USER
|
||||
| CREATE VIEW
|
||||
| DELETE
|
||||
| DROP
|
||||
| GRANT OPTION
|
||||
| INDEX
|
||||
| INSERT
|
||||
| PROCESS
|
||||
| SELECT
|
||||
| SHOW DATABASES
|
||||
| SHOW VIEW
|
||||
| SUPER
|
||||
| UPDATE
|
||||
| USAGE
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|------------------|---------------------------------------------------------------------------------------|
|
||||
| priv_type | 指定撤销的权限类型。具体的权限类型及其说明请参见下方权限类型说明表。 同时对某个用户撤销多个权限时,权限类型用","隔开。 |
|
||||
| database.tblname | 指定数据库中的表。 用"\*"代替 database 或 *table_name* ,表示撤销全局权限,即撤销对数据库中所有表的操作权限。 |
|
||||
| username | 指定撤销权限的用户。同时撤销多个用户的授权时,用户名用","隔开。 |
|
||||
|
||||
|
||||
|
||||
可以撤销的权限类型如下表所示。
|
||||
|
||||
**权限类型说明表**
|
||||
|
||||
|
||||
| **权限** | **说明** |
|
||||
|-------------------|-----------------------------------------------------------------|
|
||||
| ALL PRIVILEGES | 除GRANT OPTION以外所有权限。 |
|
||||
| ALTER | ALTER TABLE的权限。 |
|
||||
| CREATE | CREATE TABLE的权限。 |
|
||||
| CREATE USER | CREATE USER,DROP USER,RENAME USER和REVOKE ALL PRIVILEGES的权限。 |
|
||||
| CREATE TABLEGROUP | 全局CREATE TABLEGROUP的权限。 |
|
||||
| DELETE | DELETE的权限。 |
|
||||
| DROP | DROP的权限。 |
|
||||
| GRANT OPTION | GRANT OPTION的权限。 |
|
||||
| INSERT | INSERT的权限。 |
|
||||
| SELECT | SELECT的权限。 |
|
||||
| UPDATE | UPDATE的权限。 |
|
||||
| SUPER | SET GLOBAL修改全局系统参数的权限。 |
|
||||
| SHOW DATABASES | 全局 SHOW DATABASES的权限。 |
|
||||
| INDEX | CREATE INDEX, DROP INDEX的权限。 |
|
||||
| CREATE VIEW | 创建、删除视图的权限。 |
|
||||
| SHOW VIEW | SHOW CREATE VIEW权限。 |
|
||||
| CREATE SYNONYM | 创建同义词的权限。 |
|
||||
|
||||
|
||||
|
||||
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
目前没有change effective tenant 的权限控制,故 sys 租户下的用户都可以撤销权限。
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
执行以下命令撤销用户 obsqluser01 的所有权限。
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@TEST)>REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'obsqluser01';
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,140 +0,0 @@
|
||||
SAVEPOINT
|
||||
==============================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
SAVEPOINT语句用来实现事务的部分回滚。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
1. 创建savepoint:
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SAVEPOINT spname
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
2. 回滚到savepoint:
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
ROLLBACK [WORK] to [SAVEPOINT] spname
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
3. 删除savepoint:
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
RELEASE SAVEPOINT spname
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
参数说明
|
||||
-------------
|
||||
|
||||
* spname:指定savepoint的名称。savepoint是事务范围内唯一的,一个savepoint会覆盖前一个同名的savepoint。创建savepoint后可以将事务回滚到指定savepoint,也可以使用`ROLLBACK`语句回滚整个事务。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
举例
|
||||
-----------
|
||||
|
||||
假设一个事务执行了如下语句:
|
||||
|
||||
|
||||
| **sql_no** | **语句** | **分区** |
|
||||
|------------|---------------|------------|
|
||||
| 1 | update... | p1, p4 |
|
||||
| | savepoint sp1 | |
|
||||
| 2 | update... | p2, p4 |
|
||||
| 3 | update... | p3, p5 |
|
||||
| | savepoint sp2 | |
|
||||
| 4 | update... | p1, p3, p6 |
|
||||
| 5 | update... | p1, p5 |
|
||||
| | savepoint sp3 | |
|
||||
| 6 | select... | |
|
||||
| 7 | update... | p5, p6 |
|
||||
| | savepoint sp4 | |
|
||||
|
||||
|
||||
|
||||
#### 记录savepoint
|
||||
|
||||
用户在提交事务之前可以创建savepoint,需要根据savepoint创建的顺序,将事务的savepoint串成链表。以上事务包含了7条sql和4个savepoint,记录savepoint的链表如下图所示,其中每个节点记录了\<spname, sql_no\>的映射关系:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
#### 事务参与者列表
|
||||
|
||||
事务为了支持回滚某条sql之后的所有修改,需要将每条语句涉及的参与者以及对应的sql_no记录下来,以上事务执行了7条sql,涉及p1\~p6共6个partition:
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
#### savepoint回滚过程
|
||||
|
||||
1. 根据savepoint链表查询spname对应的sql_no
|
||||
|
||||
|
||||
|
||||
|
||||
假设用户执行`ROLLBACK to SAVEPOINT sp2`,根据savepoint链表查询到sp2对应的sql_no为3。
|
||||
|
||||
2. 根据事务参与者列表查询sql_no对应的partition
|
||||
|
||||
|
||||
|
||||
|
||||
根据事务参与者列表查询到sql_no大于3的语句操作的分区涉及p1、p3、p5、p6。
|
||||
|
||||
3. 回滚分区数据
|
||||
|
||||
|
||||
|
||||
|
||||
根据第2步查询到的分区,调度程序向这些分区发起回滚请求,回滚当前事务在这些分区上sp2之后的所有修改。其中p1、p3、p5上关于本事务的部分修改被回滚掉,p6上关于本事务的所有修改都被回滚掉。
|
||||
|
||||
4. 更新事务参与者列表信息
|
||||
|
||||
|
||||
|
||||
|
||||
修改事务参与者列表,将sql_no大于3的操作信息从事务参与者列表中删除,由于p6上的所有修改都被回滚掉,因此p6可以从参与者列表中删除。
|
||||
|
||||

|
||||
|
||||
5. 删除无效的savepoint
|
||||
|
||||
|
||||
|
||||
|
||||
用户执行`ROLLBACK to SAVEPOINT sp2`成功后,系统会删除sp3和sp4的savepoint,不允许再回滚到sp3和sp4。
|
||||
|
||||

|
@ -1,6 +0,0 @@
|
||||
SCHEMA
|
||||
===========================
|
||||
|
||||
|
||||
|
||||
`SCHEMA`同`DATABASE`,请参考 CREATE DATABASE、ALTER DATABASE、DROP DATABASE 的详细描述。
|
@ -1,376 +0,0 @@
|
||||
SELECT
|
||||
===========================
|
||||
|
||||
|
||||
|
||||
SELECT 的语法相对比较复杂。本节首先会介绍普通的 SELECT 语法结构,然后介绍集合类 SELECT 的语法结构。
|
||||
|
||||
SIMPLE SELECT
|
||||
----------------------
|
||||
|
||||
### 描述
|
||||
|
||||
该语句用于查询表中的内容。
|
||||
|
||||
### 格式
|
||||
|
||||
```javascript
|
||||
simple_select:
|
||||
SELECT [/*+ hint statement */] [ALL | DISTINCT | UNIQUE | SQL_CALC_FOUND_ROWS]
|
||||
select_expr_list FROM from_list [WHERE condition]
|
||||
[GROUP BY group_expression_list [WITH ROLLUP] [HAVING condition]]
|
||||
[ORDER BY order_expression_list]
|
||||
[limit_clause]
|
||||
[FOR UPDATE]
|
||||
|
||||
select_expr:
|
||||
table_name.*
|
||||
| table_alias_name.*
|
||||
| expr [[AS] column_alias_name]
|
||||
|
||||
from_list:
|
||||
table_reference [, table_reference ...]
|
||||
|
||||
table_reference:
|
||||
simple_table
|
||||
| joined_table
|
||||
|
||||
simple_table:
|
||||
table_factor [partition_option] [[AS] table_alias_name]
|
||||
| (select_stmt) [AS] table_alias_name
|
||||
| (table_reference_list)
|
||||
|
||||
joined_table:
|
||||
table_reference [INNER] JOIN simple_table [join_condition]
|
||||
| table_reference outer_join_type JOIN simple_table join_condition
|
||||
|
||||
partition_option:
|
||||
PARTITION (partition_name_list)
|
||||
|
||||
partition_name_list:
|
||||
partition_name [, partition_name ...]
|
||||
|
||||
outer_join_type:
|
||||
{LEFT | RIGHT | FULL} [OUTER]
|
||||
|
||||
join_condition:
|
||||
ON expression
|
||||
|
||||
condition:
|
||||
expression
|
||||
|
||||
group_expression_list:
|
||||
group_expression [, group_expression ...]
|
||||
|
||||
group_expression:
|
||||
expression [ASC | DESC]
|
||||
|
||||
order_expression_list:
|
||||
order_expression [, order_expression ...]
|
||||
|
||||
order_expression:
|
||||
expression [ASC | DESC]
|
||||
|
||||
limit_clause:
|
||||
LIMIT {[offset,] row_count |row_count OFFSET offset}
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 参数解释
|
||||
|
||||
|
||||
|
||||
| 参数 | 描述 |
|
||||
|--------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| ALL \| DISTINCT \| UNIQUE \| SQL_CALC_FOUND_ROWS | 在数据库表中,可能会包含重复值。 * 指定"DISTINCT",则在查询结果中相同的行只显示一行; * 指定"ALL",则列出所有的行; * 指定"SQL_CALC_FOUND_ROWS",则不输出数据,只返回数据行数; * 不指定时,默认为"ALL"。 |
|
||||
| select_expr | 列出要查询的表达式或列名,用","隔开。也可以用"\*"表示所有列。 |
|
||||
| AS othername | 为输出字段重新命名。 |
|
||||
| FROM table_references | 指名了从哪个表或哪些表中读取数据(支持多表查询)。 |
|
||||
| WHERE where_conditions | 可选项,WHERE 字句用来设置一个筛选条件,查询结果中仅包含满足条件的数据。where_conditions 为表达式。 |
|
||||
| GROUP BY group_by_list | 用于进行分类汇总。 |
|
||||
| HAVING search_confitions | HAVING 字句与 WHERE 字句类似,但是 HAVING 字句可以使用累计函数(如 SUM,AVG 等)。 |
|
||||
| ORDER BY order_list order_list : colname \[ASC \| DESC\] \[,colname \[ASC \| DESC\]...\] | 用来按升序(ASC)或者降序(DESC)显示查询结果。不指定 ASC 或者 DESC 时,默认为 ASC。 |
|
||||
| \[LIMIT {\[offset,\] row_count \|row_count OFFSET offset}\] | 强制 SELECT 语句返回指定的记录数。 LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。 * 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)。 * 如果只给定一个参数,它表示返回记录行的最大数目,偏移量为0。 |
|
||||
| FOR UPDATE | 对查询结果所有行上排他锁,以阻止其他事务的并发修改,或阻止在某些事务隔离级别时的并发读取。 |
|
||||
| PARTITION(partition_list) | 指定查询表的分区信息。例如:partition(p0,p1...) |
|
||||
|
||||
|
||||
|
||||
### 示例
|
||||
|
||||
以如下表 a 为例。
|
||||
|
||||

|
||||
|
||||
* 从表 a 中读取 name 数据。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT name FROM a;
|
||||
```
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
* 在查询结果中对 name 进行去重处理。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT DISTINCT name FROM a;
|
||||
```
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
* 从表 a 中查询 id,name,num,然后把 num 列除以2输出,输出的列名为 avg。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT id, name, num/2 AS avg FROM a;
|
||||
```
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
* 从表 a 中根据筛选条件" name = 'a' " ,输出对应的 id 、name 和 num 。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT id, name, num FROM a WHERE name = 'a';
|
||||
```
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
* 从表 a 中查询 id,name,按照 name 分组对 num 求和,并输出。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT id, name, SUM(num) FROM a GROUP BY name;
|
||||
```
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
* 从表 a 中查询 id,name,按照 name 分组对 num 求和,查询 num 总和小于160的行,并输出。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT id, name, SUM(num) as sum FROM a GROUP BY name HAVING SUM(num) < 160;
|
||||
```
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
* 从表 a 中查询 id,name,num,根据 num 按升序(ASC)输出查询结果。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT * FROM a ORDER BY num ASC;
|
||||
```
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
* 从表 a 中查询 id,name,num,根据 num 按降序(DESC)输出查询结果。
|
||||
|
||||
```javascript
|
||||
SELECT * FROM a ORDER BY num DESC;
|
||||
```
|
||||
|
||||

|
||||
|
||||
* 从表 a 中查询 id,name,num,使用 LIMIT强制从第2行开始,返回表 a 的两行结果。
|
||||
|
||||
```javascript
|
||||
SELECT * FROM a LIMIT 1,2;
|
||||
```
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
集合类 SELECT
|
||||
-------------------
|
||||
|
||||
### 描述
|
||||
|
||||
该语句用于对多个 SELECT 查询的结果进行 UNION,MINUS,INTERSECT。
|
||||
|
||||
### 格式
|
||||
|
||||
```javascript
|
||||
select_clause_set:
|
||||
simple_select [ UNION | UNION ALL | EXCEPT | INTERSECT] select_clause_set_left
|
||||
[ORDER BY sort_list_columns] [limit_clause]
|
||||
select_clause_set_right:
|
||||
simple_select |
|
||||
select_caluse_set
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 参数解释
|
||||
|
||||
|
||||
|
||||
| 参数 | 描述 |
|
||||
|-----------|--------------------------|
|
||||
| UNION ALL | 合并两个查询的结果 |
|
||||
| UNION | 合并两个查询的结果,并去重 |
|
||||
| EXCEPT | 从左查询结果集中去重出现在右查询中的结果,并去重 |
|
||||
| INTERSECT | 保留左查询结果集中出现在右查询中的结果,并去重 |
|
||||
|
||||
|
||||
|
||||
### 示例
|
||||
|
||||
以如下两表的数据为例:
|
||||
|
||||
```javascript
|
||||
create table t1 (c1 int, c2 int);
|
||||
create table t2 (c1 int, c2 int);
|
||||
insert into t1 values (1, -1), (2, -2);
|
||||
insert into t2 values (1, 1), (2, -2), (3, 3);
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 计算 T1, T2 的所有的记录
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT C1, C2 FROM T1 UNION ALL SELECT C1, C2 FROM T2;
|
||||
+------+------+
|
||||
| C1 | C2 |
|
||||
+------+------+
|
||||
| 1 | -1 |
|
||||
| 2 | -2 |
|
||||
| 1 | 1 |
|
||||
| 2 | -2 |
|
||||
| 3 | 3 |
|
||||
+------+------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 计算 T1, T2 的去重后的所有记录
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT C1, C2 FROM T1 UNION SELECT C1, C2 FROM T2;
|
||||
+------+------+
|
||||
| C1 | C2 |
|
||||
+------+------+
|
||||
| 1 | -1 |
|
||||
| 2 | -2 |
|
||||
| 1 | 1 |
|
||||
| 3 | 3 |
|
||||
+------+------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 计算 T1 和 T2 的交集
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT C1, C2 FROM T1 INTERSECT SELECT C1, C2 FROM T2;
|
||||
+------+------+
|
||||
| C1 | C2 |
|
||||
+------+------+
|
||||
| 2 | -2 |
|
||||
+------+------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 计算 T1 和 T2 的差集
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT C1, C2 FROM T1 EXCEPT SELECT C1, C2 FROM T2;
|
||||
+------+------+
|
||||
| C1 | C2 |
|
||||
+------+------+
|
||||
| 1 | -1 |
|
||||
+------+------+
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 取 T1 和 T2 并集中 C2 排序最大的前两行
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT C1, C2 FROM T1 UNION SELECT C1, C2 FROM T2 ORDER BY C2 DESC LIMIT 2;
|
||||
+------+------+
|
||||
| C1 | C2 |
|
||||
+------+------+
|
||||
| 3 | 3 |
|
||||
| 1 | 1 |
|
||||
+------+------+
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,63 +0,0 @@
|
||||
SESSION
|
||||
============================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来强制结束 session。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
session_stmt:
|
||||
KILL [CONNECTION] session_id;
|
||||
|
||||
session_id:
|
||||
INT_VALUE
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|------------|-----------------|
|
||||
| session_id | 要结束 session 的编号 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 强制结束编号为 3221502221和 3221750376 的 session。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>show processlist;
|
||||
+------------+-------+---------------------+------+---------+------+--------+----------------------------------+
|
||||
| Id | User | Host | db | Command | Time | State | Info |
|
||||
+------------+-------+---------------------+------+---------+------+--------+----------------------------------+
|
||||
| 3221502221 | admin | 100.xx.xx.xx:44775 | test | Sleep | 10 | SLEEP | NULL |
|
||||
| 3221502083 | admin | 100.xx.xx.xx:44720 | test | Query | 0 | ACTIVE | show processlist |
|
||||
| 3221502317 | NULL | 100.xx.xx.xx:41414 | test | Query | 0 | ACTIVE | REMOTE/DISTRIBUTE PLAN EXECUTING |
|
||||
| 3221750377 | NULL | 100.xx.xx.xx:41414 | test | Query | 0 | ACTIVE | REMOTE/DISTRIBUTE PLAN EXECUTING |
|
||||
| 3221750376 | admin | 100.xx.xx.xx:43783 | test | Sleep | 4 | SLEEP | NULL |
|
||||
+------------+-------+---------------------+------+---------+------+--------+----------------------------------+
|
||||
5 rows in set (0.04 sec)
|
||||
|
||||
OceanBase(admin@test)>kill 3221502221;
|
||||
Query OK, 0 rows affected (0.00 sec)
|
||||
|
||||
OceanBase(admin@test)>kill connection 3221750376;
|
||||
Query OK, 0 rows affected (0.05 sec)
|
||||
```
|
||||
|
||||
|
@ -1,49 +0,0 @@
|
||||
SET PASSWORD
|
||||
=================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该用于修改 OceanBase 当前登录用户或其他用户的密码。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
SET PASSWORD [FOR user] = password_option;
|
||||
|
||||
password_option: {
|
||||
PASSWORD('authstring')
|
||||
|'hashstring'
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|----------|----------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| FOR user | 如果没有 For user 子句,表示修改当前用户的密码。任何成功登录的用户都可以修改当前用户的密码。 如果有 For user 子句,表示修改指定用户的密码。必须拥有全局(MySQL库)的 CREATE USER 权限,才可以修改指定用户的密码。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
执行以下命令将 sqluser01 用户的密码修改为 abc123。
|
||||
|
||||
```javascript
|
||||
oceanBase(admin@TEST)>set password for sqluser01 = password('abc123');
|
||||
Query OK, 0 rows affected (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,51 +0,0 @@
|
||||
SHOW GRANTS
|
||||
================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于系统管理员查看 User 的操作权限。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
SHOW GRANTS [FOR username];
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|--------------|----------------------------------------------------------------------------------------------------|
|
||||
| FOR username | 如果不指定用户名,则缺省显示当前用户的权限。当前用户可以查看自己的权限。 如果需要查看其他指定用户的权限,必须拥有对 mysql.user 的 SELECT 权限。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
查看看用户 obsqluser01 的权限。
|
||||
|
||||
```javascript
|
||||
oceanBase(admin@TEST)>show grants for obsqluser01;
|
||||
+-------------------------------------+
|
||||
| Grants for obsqluser01@% |
|
||||
+-------------------------------------+
|
||||
| GRANT USAGE ON *.* TO 'obsqluser01' |
|
||||
+-------------------------------------+
|
||||
1 row in set (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,50 +0,0 @@
|
||||
SHOW RECYCLEBIN
|
||||
====================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于查看回收站中的内容。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
SHOW RECYCLEBIN;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
无。
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 查看回收站中的内容。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> create table t1(c1 int);
|
||||
Query OK, 0 rows affected (0.24 sec)
|
||||
|
||||
OceanBase(admin@test)> drop table t1;
|
||||
Query OK, 0 rows affected (0.07 sec)
|
||||
|
||||
OceanBase(admin@test)> show recyclebin;
|
||||
+-------------------------------------------+---------------+-------+----------------------------+
|
||||
| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |
|
||||
+-------------------------------------------+---------------+-------+----------------------------+
|
||||
| __recycle_$_1_1099511628776_1099511677777 | t1 | TABLE | 2017-10-20 17:27:40.881506 |
|
||||
+-------------------------------------------+---------------+-------+----------------------------+
|
||||
1 row in set (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,106 +0,0 @@
|
||||
TRANSACTION
|
||||
================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于开启事务。
|
||||
|
||||
数据库事务(Database Transaction)是指作为单个逻辑工作单元执行的一系列操作。事务处理可以用来维护数据库的完整性,保证成批的SQL操作全部执行或全部不执行。
|
||||
|
||||
显示事务是用户自定义或用户指定的事务。通过 BEGIN TRANSACTION,或 BEGIN 和 BEGIN WORK(被作为START TRANSACTION的别名受到支持)语句显示开始,以 COMMIT 或 ROLLBACK 语句显示结束。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
transaction_stmt:
|
||||
START TRANSACTION [READ ONLY | READ WRITE];
|
||||
| BEGIN [WORK];
|
||||
| COMMIT [WORK];
|
||||
| ROLLBACK [WORK];
|
||||
| SET TRANSACTION {READ ONLY | READ WRITE};
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|-----------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| START TRANSACTION \[READ ONLY \| READ WRITE\] | 开启事务语句。一旦开启事务,则随后的 SQL 数据操作语句(即INSERT、UPDATE、DELETE等)直到显式提交时才会生效。 READ ONLY 子句表示事务是只读方式开启,事务内不允许执行修改操作。 READ WRITE 子句表示事务是读写方式开启,默认就是此种模式。 |
|
||||
| BEGIN | BEGIN 和 BEGIN WORK 被作为 START TRANSACTION 的别名受到支持 |
|
||||
| COMMIT | 提交当前事务。 |
|
||||
| ROLLBACK | 回滚当前事务。 |
|
||||
| SET TRANSACTION {READ ONLY \| READ WRITE} | 将当前事务设置成 READ ONLY 或者 READ WRITE 模式。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
假设现有表 a 如下所示。
|
||||
|
||||
|
||||
| id | name | num | sell_date |
|
||||
|----|------|-----|---------------------|
|
||||
| 1 | a | 100 | 2013-06-21 10:06:43 |
|
||||
| 2 | b | 200 | 2013-06-21 13:07:21 |
|
||||
| 3 | a | 50 | 2013-06-21 13:08:15 |
|
||||
|
||||
|
||||
|
||||
1. 依次执行以下命令开始执行事务,将 id 为 3 的的 name 改为 c,并插入一行当前卖出 a 的记录。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> START TRANSACTION;
|
||||
Query OK, 0 rows affected (0.00 sec)
|
||||
|
||||
OceanBase(admin@test)> UPDATE a SET name = 'c' WHERE id = 3;
|
||||
Query OK, 1 rows affected (0.00 sec)
|
||||
|
||||
OceanBase(admin@test)> INSERT INTO a VALUES (4, 'a', 30, '2013-06-21 16:09:13');
|
||||
Query OK, 1 rows affected (0.00 sec)
|
||||
|
||||
OceanBase(admin@test)> COMMIT;
|
||||
Query OK, 0 rows affected (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
2. 事务提交后,执行命令查看表 a 信息。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
SELECT * FROM a;
|
||||
```
|
||||
|
||||
|
||||
|
||||
结果如下:
|
||||
|
||||
|
||||
| id | name | num | sell_date |
|
||||
|----|------|-----|---------------------|
|
||||
| 1 | a | 100 | 2013-06-21 10:06:43 |
|
||||
| 2 | b | 200 | 2013-06-21 13:07:21 |
|
||||
| 3 | c | 50 | 2013-06-21 13:08:15 |
|
||||
| 4 | a | 30 | 2013-06-21 16:09:13 |
|
||||
|
||||
|
||||
**注意**
|
||||
|
||||
|
||||
|
||||
在事务还没有 COMMIT 之前,您可以查看下本事务中的操作是否已经生效,比如可以在 COMMIT 前,加一句" **SELECT \* FROM a;** "。本事务 session 的访问能读到最新的结果,本事务 session 之外的访问结果肯定是没有生效,在事务还没有 COMMIT 前,你之前做的操作除当前事务连接之外都是不可见的。如果您想回滚该事务,直接用"ROOLBACK"代替"COMMIT"。
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,55 +0,0 @@
|
||||
TRUNCATE TABLE
|
||||
===================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于完全清空指定表,但是保留表结构,包括表中定义的 Partition 信息。从逻辑上说,该语句与用于删除所有行的DELETE FROM语句相同。执行TRUNCATE语句,必须具有表的删除和创建权限。它属于DDL语句。
|
||||
|
||||
TRUNCATE TABLE 语句与 DELETE FROM 语句有以下不同:
|
||||
|
||||
* 删减操作会取消并重新创建表,这比一行一行的删除行要快很多。
|
||||
|
||||
* TRUNCATE TABLE 语句执行结果显示影响行数始终显示为 0 行。
|
||||
|
||||
* 使用 TRUNCATE TABLE 语句,表管理程序不记得最后被使用的 AUTO_INCREMENT 值,但是会从头开始计数。
|
||||
|
||||
* TRUNCATE 语句不能在进行事务处理和表锁定的过程中进行,如果使用,将会报错。
|
||||
|
||||
* 只要表定义文件是合法的,则可以使用 TRUNCATE TABLE 把表重新创建为一个空表,即使数据或索引文件已经被破坏。
|
||||
|
||||
|
||||
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
TRUNCATE [TABLE] table_name;
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|------------|--------|
|
||||
| table_name | 指定表名。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
完全清空表 tb1。
|
||||
|
||||
```javascript
|
||||
TRUNCATE [TABLE] tb1;
|
||||
```
|
||||
|
||||
|
@ -1,263 +0,0 @@
|
||||
UPDATE
|
||||
===========================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用于修改表中的字段值。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
UPDATE [IGNORE] table_references
|
||||
SET update_asgn_list
|
||||
[WHERE where_condition]
|
||||
[ORDER BY order_list]
|
||||
[LIMIT row_count];
|
||||
|
||||
table_references:
|
||||
tbl_name [PARTITION (partition_name,...)] [, ...]
|
||||
|
||||
update_asgn_list:
|
||||
column_name = expr [, ...]
|
||||
|
||||
order_list:
|
||||
column_name [ASC|DESC] [, column_name [ASC|DESC]...]
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|------------------|-----------------------------|
|
||||
| IGNORE | 在 INSERT 语句执行过程中发生的错误将会被忽略。 |
|
||||
| table_references | 指定修改表名,多表修改时,表名直接','作为间隔。 |
|
||||
| where_condition | 指定过滤条件。 |
|
||||
| row_count | 限制的行数。 |
|
||||
| tbl_name | 插入表名。 |
|
||||
| partition_name | 插入表指定的分区名。 |
|
||||
| column_name | 列名。 |
|
||||
| column_name ASC | 按列名升序修改。 |
|
||||
| column_name DESC | 按列名降序修改。 |
|
||||
|
||||
|
||||
|
||||
注意事项
|
||||
-------------
|
||||
|
||||
不管是多表还是单表更新都不支持直接对子查询进行更新值操作,例如:`update (select * from t1) set c1 = 100;`
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
1. 创建示例表 t1 和 t2。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>create table t1(c1 int primary key, c2 int);
|
||||
Query OK, 0 rows affected (0.16 sec)
|
||||
OceanBase(admin@test)>select * from t1;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 1 | 1 |
|
||||
| 2 | 2 |
|
||||
| 3 | 3 |
|
||||
| 4 | 4 |
|
||||
+----+------+
|
||||
4 rows in set (0.06 sec)
|
||||
|
||||
OceanBase(admin@test)>create table t2(c1 int primary key, c2 int) partition by key(c1) partitions 4;
|
||||
Query OK, 0 rows affected (0.19 sec)
|
||||
OceanBase(admin@test)>select * from t2;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 5 | 5 |
|
||||
| 1 | 1 |
|
||||
| 2 | 2 |
|
||||
| 3 | 3 |
|
||||
+----+------+
|
||||
4 rows in set (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
2. 将表 t1 中 "t1.c1=1" 对应的那一行数据的 c2 列值修改为 100。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>update t1 set t1.c2 = 100 where t1.c1 = 1;
|
||||
Query OK, 1 row affected (0.02 sec)
|
||||
Rows matched: 1 Changed: 1 Warnings: 0
|
||||
|
||||
OceanBase(admin@test)>select * from t1;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 1 | 100 |
|
||||
| 2 | 2 |
|
||||
| 3 | 3 |
|
||||
| 4 | 4 |
|
||||
+----+------+
|
||||
4 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
3. 将表 t1 中按照 c2 列排序的前两行数据的 c2 列值修改为 100。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>update t1 set t1.c2 = 100 order by c2 limit 2;
|
||||
Query OK, 2 rows affected (0.02 sec)
|
||||
Rows matched: 2 Changed: 2 Warnings: 0
|
||||
|
||||
OceanBase(admin@test)>select * from t1;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 1 | 100 |
|
||||
| 2 | 100 |
|
||||
| 3 | 3 |
|
||||
| 4 | 4 |
|
||||
+----+------+
|
||||
4 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
4. 将表 t2 中 p2 分区的数据中 "t2.c1 \> 2" 的对应行数据的 c2 列值修改为 100。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>update t2 partition(p2) set t2.c2 = 100 where t2.c1 > 2;
|
||||
Query OK, 1 row affected (0.02 sec)
|
||||
Rows matched: 1 Changed: 1 Warnings: 0
|
||||
|
||||
OceanBase(admin@test)>select * from t2;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 5 | 5 |
|
||||
| 1 | 1 |
|
||||
| 2 | 2 |
|
||||
| 3 | 100 |
|
||||
+----+------+
|
||||
4 rows in set (0.06 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
5. 修改多个表。将 t1 表和 t2 表中满足 "t1.c1 = t2.c1" 对应行的数据 t1 表中的 c2 列值修改为 100,t2 表中的 c2 列值修改为 200。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>update t1,t2 set t1.c2 = 100, t2.c2 = 200 where t1.c2 = t2.c2;
|
||||
Query OK, 6 rows affected (0.03 sec)
|
||||
Rows matched: 6 Changed: 6 Warnings: 0
|
||||
|
||||
OceanBase(admin@test)>select * from t1;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 1 | 100 |
|
||||
| 2 | 100 |
|
||||
| 3 | 100 |
|
||||
| 4 | 4 |
|
||||
+----+------+
|
||||
4 rows in set (0.00 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from t2;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 5 | 5 |
|
||||
| 1 | 200 |
|
||||
| 2 | 200 |
|
||||
| 3 | 200 |
|
||||
+----+------+
|
||||
4 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
6. 修改多个表。修改 t1 表和 t2 表的p2分区中满足 "t1.c1 = t2.c1" 对应行的数据 t1 表中的 c2 列值修改为 100,t2 表中的 c2 列值修改为 200。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>update t1,t2 partition(p2) set t1.c2 = 100, t2.c2 = 200 where t1.c2 = t2.c2;
|
||||
Query OK, 6 rows affected (0.02 sec)
|
||||
Rows matched: 6 Changed: 6 Warnings: 0
|
||||
|
||||
OceanBase(admin@test)>select * from t1;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 1 | 100 |
|
||||
| 2 | 100 |
|
||||
| 3 | 100 |
|
||||
| 4 | 4 |
|
||||
+----+------+
|
||||
4 rows in set (0.01 sec)
|
||||
|
||||
OceanBase(admin@test)>select * from t2;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 5 | 5 |
|
||||
| 1 | 200 |
|
||||
| 2 | 200 |
|
||||
| 3 | 200 |
|
||||
+----+------+
|
||||
4 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
7. 对可更新视图 v 进行更新值。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)>create view v as select * from t1;
|
||||
Query OK, 0 rows affected (0.07 sec)
|
||||
|
||||
OceanBase(admin@test)>update v set v.c2 = 100 where v.c1 = 1;
|
||||
Query OK, 1 row affected (0.02 sec)
|
||||
Rows matched: 1 Changed: 1 Warnings: 0
|
||||
|
||||
OceanBase(admin@test)>select * from v;
|
||||
+----+------+
|
||||
| c1 | c2 |
|
||||
+----+------+
|
||||
| 1 | 100 |
|
||||
| 2 | 2 |
|
||||
| 3 | 3 |
|
||||
| 4 | 4 |
|
||||
+----+------+
|
||||
4 rows in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,253 +0,0 @@
|
||||
ALTER TABLE
|
||||
================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来修改已存在的表的结构,比如:修改表及表属性、新增列、修改列及属性、删除列等。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
alter_table_stmt:
|
||||
ALTER TABLE table_name
|
||||
alter_table_action_list;
|
||||
| RENAME TABLE rename_table_action_list;
|
||||
|
||||
alter_table_action_list:
|
||||
alter_table_action [, alter_table_action ...]
|
||||
|
||||
alter_table_action:
|
||||
ADD [COLUMN] {column_definition | (column_definition_list)}
|
||||
| CHANGE [COLUMN] column_name column_definition
|
||||
| MODIFY [COLUMN] column_definition
|
||||
| ALTER [COLUMN] column_name {SET DEFAULT const_value | DROP DEFAULT}
|
||||
| DROP [COLUMN] column_name
|
||||
| ADD [CONSTRAINT [constraint_name]] UNIQUE {INDEX | KEY} [index_name] index_desc
|
||||
| ADD {INDEX | KEY} [index_name] index_desc
|
||||
| ADD FULLTEXT [INDEX | KEY] [index_name] fulltext_index_desc
|
||||
| ALTER INDEX index_name [VISIBLE | INVISIBLE | parallel_clause]
|
||||
| DROP {INDEX | KEY} index_name
|
||||
| ADD PARTITION (range_partition_list)
|
||||
| DROP PARTITION (partition_name_list)
|
||||
| REORGANIZE PARTITION name_list INTO partition_range_or_list
|
||||
| TRUNCATE PARTITION name_list
|
||||
| [SET] table_option_list
|
||||
| RENAME [TO] table_name
|
||||
| DROP TABLEGROUP
|
||||
| DROP FOREIGN KEY fk_name
|
||||
|
||||
rename_table_action_list:
|
||||
rename_table_action [, rename_table_action ...]
|
||||
|
||||
rename_table_action:
|
||||
table_name TO table_name
|
||||
|
||||
column_definition_list:
|
||||
column_definition [, column_definition ...]
|
||||
|
||||
column_definition:
|
||||
column_name data_type
|
||||
[DEFAULT const_value] [AUTO_INCREMENT]
|
||||
[NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] comment
|
||||
|
||||
index_desc:
|
||||
(column_desc_list) [index_type] [index_option_list]
|
||||
|
||||
fulltext_index_desc:
|
||||
(column_desc_list) CTXCAT(column_desc_list) [index_option_list]
|
||||
|
||||
column_desc_list:
|
||||
column_desc [, column_desc ...]
|
||||
|
||||
column_desc:
|
||||
column_name [(length)] [ASC | DESC]
|
||||
|
||||
index_type:
|
||||
USING BTREE
|
||||
|
||||
index_option_list:
|
||||
index_option [ index_option ...]
|
||||
|
||||
index_option:
|
||||
[GLOBAL | LOCAL]
|
||||
| block_size
|
||||
| compression
|
||||
| STORING(column_name_list)
|
||||
| comment
|
||||
|
||||
table_option_list:
|
||||
table_option [ table_option ...]
|
||||
|
||||
table_option:
|
||||
| primary_zone
|
||||
| replica_num
|
||||
| table_tablegroup
|
||||
| block_size
|
||||
| compression
|
||||
| AUTO_INCREMENT [=] INT_VALUE
|
||||
| comment
|
||||
| DUPLICATE_SCOPE [=] "none|zone|region|cluster"
|
||||
| parallel_clause
|
||||
|
||||
parallel_clause:
|
||||
{NOPARALLEL | PARALLEL integer}
|
||||
|
||||
partition_option:
|
||||
PARTITION BY HASH(expression)
|
||||
[subpartition_option] PARTITIONS partition_count
|
||||
| PARTITION BY KEY([column_name_list])
|
||||
[subpartition_option] PARTITIONS partition_count
|
||||
| PARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
|
||||
[subpartition_option] (range_partition_list)
|
||||
|
||||
subpartition_option:
|
||||
SUBPARTITION BY HASH(expression)
|
||||
SUBPARTITIONS subpartition_count
|
||||
| SUBPARTITION BY KEY(column_name_list)
|
||||
SUBPARTITIONS subpartition_count
|
||||
| SUBPARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
|
||||
(range_subpartition_list)
|
||||
|
||||
range_partition_list:
|
||||
range_partition [, range_partition ...]
|
||||
|
||||
range_partition:
|
||||
PARTITION partition_name
|
||||
VALUES LESS THAN {(expression_list) | MAXVALUE}
|
||||
|
||||
range_subpartition_list:
|
||||
range_subpartition [, range_subpartition ...]
|
||||
|
||||
range_subpartition:
|
||||
SUBPARTITION subpartition_name
|
||||
VALUES LESS THAN {(expression_list) | MAXVALUE}
|
||||
|
||||
expression_list:
|
||||
expression [, expression ...]
|
||||
|
||||
column_name_list:
|
||||
column_name [, column_name ...]
|
||||
|
||||
partition_name_list:
|
||||
partition_name [, partition_name ...]
|
||||
|
||||
partition_count | subpartition_count:
|
||||
INT_VALUE
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|---------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| ADD \[COLUMN\] | 增加列,目前不支持增加主键列。 |
|
||||
| CHANGE \[COLUMN\] | 修改列名和列属性。 |
|
||||
| MODIFY \[COLUMN\] | 修改列属性。 |
|
||||
| ALTER \[COLUMN\] | 修改列的默认值。 |
|
||||
| DROP \[COLUMN\] | 删除列,不允许删除主键列或者包含索引的列。 |
|
||||
| ADD \[UNIQUE INDEX\] | 增加唯一索引。 |
|
||||
| ADD \[INDEX\] | 增加普通索引 |
|
||||
| ALTER \[INDEX\] | 修改索引属性。 |
|
||||
| ADD \[PARTITION\] | 增加分区。 |
|
||||
| DROP \[PARTITION\] | 删除分区。 |
|
||||
| REORGANIZE \[PARTITION\] | 分区重组。 |
|
||||
| TRUNCATE \[PARTITION\] | 删除分区数据。 |
|
||||
| RENAME \[TO\] table_name | 表重命名。 |
|
||||
| DROP \[TABLEGROUP\] | 删除表组。 |
|
||||
| DROP \[FOREIGN KEY\] | 删除外键。 |
|
||||
| SET BLOCK_SIZE | 设置Partition表BLOCK大小。 |
|
||||
| SET REPLICA_NUM | 设置表的副本数(指表的副本总数)。 |
|
||||
| SET COMPRESSION | 设置表的压缩方式。 |
|
||||
| SET USE_BLOOM_FILTER | 设置是否使用BloomFilter。 |
|
||||
| SET COMMENT | 设置注释信息。 |
|
||||
| SET PROGRESSIVE_MERGE_NUM | 设置渐进合并步数,取值范围是1\~64。 |
|
||||
| parallel_clause | 指定表级别的并行度: * NOPARALLEL:并行度为1,默认配置 * PARALLEL integer:指定并行度,integer 取值大于等于 1。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 把表 t2 的字段 d 改名为 c,并同时修改字段类型
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
ALTER TABLE t2 CHANGE COLUMN d c CHAR(10);
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 增加、删除列
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
ALTER TABLE test ADD c3 int;
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
ALTER TABLE test DROP c3;
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
* 设置表格 test 的副本数,并且增加列 c5
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
ALTER TABLE test SET REPLICA_NUM=2, ADD COLUMN c5 INT;
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 修改表 t1 的并行度为 2
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```unknow
|
||||
ALTER TABLE t1 PARALLEL 2;
|
||||
```
|
||||
|
||||
|
@ -1,118 +0,0 @@
|
||||
ALTER TABLEGROUP
|
||||
=====================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来执行以下操作:
|
||||
|
||||
* 对一个表组增加多张表。
|
||||
|
||||
* 修改表组的分区规则。
|
||||
|
||||
* 修改表组的 locality 和 primary zone。
|
||||
|
||||
|
||||
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
* 对一个表组增加多张表。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
ALTER TABLEGROUP tablegroupname ADD [TABLE] tblname [, tblname...]
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 修改表组的分区规则。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
ALTER TABLEGROUP tablegroupname alter_tg_partition_option
|
||||
alter_tg_partition_option:
|
||||
DROP PARTITION '(' name_list ')'
|
||||
| ADD PARTITION opt_range_partition_list
|
||||
| modify_tg_partition_info
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 修改表组的 locality 和 primary zone。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
ALTER TABLEGROUP tablegroupname alter_tablegroup_actions
|
||||
alter_tablegroup_actions:
|
||||
alter_tablegroup_action
|
||||
| alter_tablegroup_action, alter_tablegroup_action
|
||||
alter_tablegroup_action:
|
||||
SET LOCALITY [=] locality_name
|
||||
|SET PRIMARY_ZONE [=] primary_zone_name
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|--------------------------------|--------------------------------------------------------------------------------------------------------------------------|
|
||||
| tablegroupname | 指定表组。 |
|
||||
| tblname | 表名。对一个表组增加多张表时,表与表之间以逗号(',')分隔。 当添加多个表时,允许表名重复。如果待添加的表已经属于 *tablegroupname* 的表格组,系统不报错。 |
|
||||
| modify_tg_partition_info | 修改表组的分区规则。 |
|
||||
| LOCALITY locality_name | 指定表组的 locality。 |
|
||||
| PRIMARY_ZONE primary_zone_name | 指定表组的主Zone。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
创建表组 tgh 和两张关系表 ttgh 和 ttgh2 ,并将表组的 locality 修改为 F@z1。
|
||||
|
||||
```javascript
|
||||
OceanBase(admin@test)> create tablegroup tgh locality='F,R{ALL_SERVER}@z1' partition by hash partitions 10;
|
||||
Query OK, 0 rows affected (0.09 sec)
|
||||
|
||||
OceanBase(admin@test)> create table ttgh(c1 int, c2 int) tablegroup = tgh locality='F,R{ALL_SERVER}@z1';
|
||||
Query OK, 0 rows affected (0.55 sec)
|
||||
|
||||
OceanBase(admin@test)> create table ttgh2(c1 int, c2 int) tablegroup = tgh locality='F,R{ALL_SERVER}@z1';
|
||||
Query OK, 0 rows affected (0.39 sec)
|
||||
|
||||
OceanBase(admin@test)> alter tablegroup tgh set locality ='F@z1';
|
||||
Query OK, 0 rows affected (0.09 sec)
|
||||
|
||||
OceanBase(admin@test)> select locality from oceanbase.__all_tablegroup where tablegroup_name ='tgh';
|
||||
+------------+
|
||||
| locality |
|
||||
+------------+
|
||||
| FULL{1}@z1 |
|
||||
+------------+
|
||||
1 row in set (0.05 sec)
|
||||
|
||||
OceanBase(admin@test)> select locality from oceanbase.__all_table where tablegroup_id=(select tablegroup_id from oceanbase.__all_tablegroup where tablegroup_name ='tgh');
|
||||
+------------+
|
||||
| locality |
|
||||
+------------+
|
||||
| FULL{1}@z1 |
|
||||
| FULL{1}@z1 |
|
||||
+------------+
|
||||
2 rows in set (0.04 sec)
|
||||
```
|
||||
|
||||
|
||||
|
@ -1,83 +0,0 @@
|
||||
ALTER TENANT
|
||||
=================================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------
|
||||
|
||||
该语句用来修改租户信息。
|
||||
|
||||
格式
|
||||
-----------
|
||||
|
||||
```javascript
|
||||
ALTER TENANT {tenant_name | ALL}
|
||||
[SET] [tenant_option_list] [opt_global_sys_vars_set]
|
||||
|
||||
tenant_option_list:
|
||||
tenant_option [, tenant_option ...]
|
||||
|
||||
tenant_option:
|
||||
COMMENT [=]'string'
|
||||
|{CHARACTER SET | CHARSET} [=] charsetname
|
||||
|COLLATE [=] collationname
|
||||
|REPLICA_NUM [=] num
|
||||
|ZONE_LIST [=] (zone [, zone...])
|
||||
|PRIMARY_ZONE [=] zone
|
||||
|RESOURCE_POOL_LIST [=](poolname [, poolname...])
|
||||
|DEFAULT TABLEGROUP [=] {NULL | tablegroupname}
|
||||
|{READ ONLY | READ WRITE}
|
||||
|LOGONLY_REPLICA_NUM [=] num
|
||||
|LOCALITY [=] 'locality description'
|
||||
|LOCK|UNLOCK;
|
||||
|
||||
opt_global_sys_vars_set:
|
||||
VARIABLES system_var_name = expr [,system_var_name = expr] ...
|
||||
```
|
||||
|
||||
|
||||
|
||||
参数解释
|
||||
-------------
|
||||
|
||||
|
||||
|
||||
| **参数** | **描述** |
|
||||
|--------------------------|---------------------------------------------------------------------------------------|
|
||||
| tenant_name | 指定要修改的租户名。 |
|
||||
| ALTER TENANT ALL | 同时修改所有租户。 |
|
||||
| RESOURCE_POOL_LIST | 资源池列表,为创建租户时的必填项,暂时只支持一个 RESOURCE POOL。 |
|
||||
| DEFAULT TABLEGROUP | 设置租户默认表组信息,NULL 表示取消ovtn库默认表组。 |
|
||||
| LOCK\|UNLOCK | 租户锁定和解锁。对租户进行锁定后,不能在该租户上创建新的连接,已有连接保持不变。通常在客户费用到期未续费的场景下使用,客户费用到期后对租户进行锁定,客户续费后再进行解锁。 |
|
||||
| COMMENT | 修改注释。 |
|
||||
| CHARACTER SET \| CHARSET | 修改租户的字符集。 |
|
||||
| COLLATE | 指定校对规则。 |
|
||||
| REPLICA_NUM | 指定副本数。 |
|
||||
| ZONE_LIST | 指定要修改的Zone列表。 |
|
||||
| PRIMARY_ZONE | 指定主Zone。 |
|
||||
| READ ONLY \| READ WRITE | 指定租户的只读或读写属性。 |
|
||||
| LOGONLY_REPLICA_NUM | 指定日志副本数。 |
|
||||
| LOCALITY | 描述副本在Zone间的分布情况,如:F@z1,F@z2,F@z3,R@z4 表示z1, z2, z3为全功能副本,z4为只读副本。 |
|
||||
| system_var_name | 修改租户的系统变量值。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------
|
||||
|
||||
* 锁定租户TENANT1。
|
||||
|
||||
|
||||
|
||||
|
||||
```javascript
|
||||
ALTER TENANT TENANT1 LOCK;
|
||||
```
|
||||
|
||||
|
||||
|
||||
注意事项
|
||||
-------------
|
||||
|
||||
ALTER TENANT语句系统租户有权限执行,同时本租户的管理员能执行。
|
@ -1,23 +0,0 @@
|
||||
SQL 请求执行流程
|
||||
===============================
|
||||
|
||||
|
||||
|
||||
SQL 引擎从接受 SQL 请求到执行的典型流程如下图所示:
|
||||
|
||||

|
||||
|
||||
下表为 SQL 请求执行流程的步骤说明。
|
||||
|
||||
|
||||
| **步骤** | **说明** |
|
||||
|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| Parser(词法/语法解析模块) | 在收到用户发送的 SQL 请求串后,Parser 会将字符串分成一个个的"单词",并根据预先设定好的语法规则解析整个请求,将 SQL 请求字符串转换成带有语法结构信息的内存数据结构,称为语法树(Syntax Tree)。 |
|
||||
| Plan Cache(执行计划缓存模块) | 执行计划缓存模块会将该 SQL 第一次生成的执行计划缓存在内存中,后续的执行可以反复执行这个计划,避免了重复查询优化的过程。 |
|
||||
| Resolver(语义解析模块) | Resolver 将生成的语法树转换为带有数据库语义信息的内部数据结构。在这一过程中,Resolver 将根据数据库元信息将 SQL 请求中的 Token 翻译成对应的对象(例如库、表、列、索引等),生成的数据结构叫做 Statement Tree。 |
|
||||
| Transfomer(逻辑改写模块) | 分析用户 SQL 的语义,并根据内部的规则或代价模型,将用户 SQL 改写为与之等价的其他形式,并将其提供给后续的优化器做进一步的优化。Transformer 的工作方式是在原 Statement Tree 上做等价变换,变换的结果仍然是一棵 Statement Tree。 |
|
||||
| Optimizer(优化器) | 优化器是整个 SQL 请求优化的核心,其作用是为 SQL 请求生成最佳的执行计划。在优化过程中,优化器需要综合考虑 SQL 请求的语义、对象数据特征、对象物理分布等多方面因素,解决访问路径选择、联接顺序选择、联接算法选择、分布式计划生成等多个核心问题,最终选择一个对应该 SQL 的最佳执行计划。 |
|
||||
| Code Generator(代码生成器) | 将执行计划转换为可执行的代码,但是不做任何优化选择。 |
|
||||
| Executor(执行器) | 启动 SQL 的执行过程。 * 对于本地执行计划,Executor 会简单的从执行计划的顶端的算子开始调用,根据算子自身的逻辑完成整个执行的过程,并返回执行结果。 * 对于远程或分布式计划,将执行树分成多个可以调度的子计划,并通过 RPC 将其发送给相关的节点去执行。 |
|
||||
|
||||
|
@ -1,190 +0,0 @@
|
||||
SQL 执行计划简介
|
||||
===============================
|
||||
|
||||
执行计划(EXPLAIN)是对一条 SQL 查询语句在数据库中执行过程的描述。
|
||||
|
||||
用户可以通过 `EXPLAIN` 命令查看优化器针对给定 SQL 生成的逻辑执行计划。如果要分析某条 SQL 的性能问题,通常需要先查看 SQL 的执行计划,排查每一步 SQL 执行是否存在问题。所以读懂执行计划是 SQL 优化的先决条件,而了解执行计划的算子是理解 `EXPLAIN` 命令的关键。
|
||||
|
||||
EXPLAIN 命令格式
|
||||
---------------------------------
|
||||
|
||||
OceanBase 数据库的执行计划命令有三种模式:`EXPLAIN BASIC`、`EXPLAIN` 和 `EXPLAIN EXTENDED`。这三种模式对执行计划展现不同粒度的细节信息:
|
||||
|
||||
* `EXPLAIN BASIC` 命令用于最基本的计划展示。
|
||||
|
||||
|
||||
|
||||
* `EXPLAIN EXTENDED` 命令用于最详细的计划展示(通常在排查问题时使用这种展示模式)。
|
||||
|
||||
|
||||
|
||||
* `EXPLAIN` 命令所展示的信息可以帮助普通用户了解整个计划的执行方式。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
命令格式如下:
|
||||
|
||||
```sql
|
||||
EXPLAIN [BASIC | EXTENDED | PARTITIONS | FORMAT = format_name] explainable_stmt
|
||||
format_name: { TRADITIONAL | JSON }
|
||||
explainable_stmt: { SELECT statement
|
||||
| DELETE statement
|
||||
| INSERT statement
|
||||
| REPLACE statement
|
||||
| UPDATE statement }
|
||||
```
|
||||
|
||||
|
||||
|
||||
执行计划形状与算子信息
|
||||
--------------------------------
|
||||
|
||||
在数据库系统中,执行计划在内部通常是以树的形式来表示的,但是不同的数据库会选择不同的方式展示给用户。
|
||||
|
||||
如下示例分别为 PostgreSQL 数据库、Oracle 数据库和 OceanBase 数据库对于 TPCDS Q3 的计划展示。
|
||||
|
||||
```sql
|
||||
obclient>SELECT /*TPC-DS Q3*/ *
|
||||
FROM (SELECT dt.d_year,
|
||||
item.i_brand_id brand_id,
|
||||
item.i_brand brand,
|
||||
Sum(ss_net_profit) sum_agg
|
||||
FROM date_dim dt,
|
||||
store_sales,
|
||||
item
|
||||
WHERE dt.d_date_sk = store_sales.ss_sold_date_sk
|
||||
AND store_sales.ss_item_sk = item.i_item_sk
|
||||
AND item.i_manufact_id = 914
|
||||
AND dt.d_moy = 11
|
||||
GROUP BY dt.d_year,
|
||||
item.i_brand,
|
||||
item.i_brand_id
|
||||
ORDER BY dt.d_year,
|
||||
sum_agg DESC,
|
||||
brand_id)
|
||||
WHERE rownum <= 100;
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
* PostgreSQL 数据库执行计划展示如下:
|
||||
|
||||
```sql
|
||||
Limit (cost=13986.86..13987.20 rows=27 width=91)
|
||||
-> Sort (cost=13986.86..13986.93 rows=27 width=65)
|
||||
Sort Key: dt.d_year, (sum(store_sales.ss_net_profit)), item.i_brand_id
|
||||
-> HashAggregate (cost=13985.95..13986.22 rows=27 width=65)
|
||||
-> Merge Join (cost=13884.21..13983.91 rows=204 width=65)
|
||||
Merge Cond: (dt.d_date_sk = store_sales.ss_sold_date_sk)
|
||||
-> Index Scan using date_dim_pkey on date_dim dt (cost=0.00..3494.62 rows=6080 width=8)
|
||||
Filter: (d_moy = 11)
|
||||
-> Sort (cost=12170.87..12177.27 rows=2560 width=65)
|
||||
Sort Key: store_sales.ss_sold_date_sk
|
||||
-> Nested Loop (cost=6.02..12025.94 rows=2560 width=65)
|
||||
-> Seq Scan on item (cost=0.00..1455.00 rows=16 width=59)
|
||||
Filter: (i_manufact_id = 914)
|
||||
-> Bitmap Heap Scan on store_sales (cost=6.02..658.94 rows=174 width=14)
|
||||
Recheck Cond: (ss_item_sk = item.i_item_sk)
|
||||
-> Bitmap Index Scan on store_sales_pkey (cost=0.00..5.97 rows=174 width=0)
|
||||
Index Cond: (ss_item_sk = item.i_item_sk)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* Oracle 数据库执行计划展示如下:
|
||||
|
||||
```sql
|
||||
Plan hash value: 2331821367
|
||||
--------------------------------------------------------------------------------------------------
|
||||
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
|
||||
--------------------------------------------------------------------------------------------------
|
||||
| 0 | SELECT STATEMENT | | 100 | 9100 | 3688 (1)| 00:00:01 |
|
||||
|* 1 | COUNT STOPKEY | | | | | |
|
||||
| 2 | VIEW | | 2736 | 243K| 3688 (1)| 00:00:01 |
|
||||
|* 3 | SORT ORDER BY STOPKEY | | 2736 | 256K| 3688 (1)| 00:00:01 |
|
||||
| 4 | HASH GROUP BY | | 2736 | 256K| 3688 (1)| 00:00:01 |
|
||||
|* 5 | HASH JOIN | | 2736 | 256K| 3686 (1)| 00:00:01 |
|
||||
|* 6 | TABLE ACCESS FULL | DATE_DIM | 6087 | 79131 | 376 (1)| 00:00:01 |
|
||||
| 7 | NESTED LOOPS | | 2865 | 232K| 3310 (1)| 00:00:01 |
|
||||
| 8 | NESTED LOOPS | | 2865 | 232K| 3310 (1)| 00:00:01 |
|
||||
|* 9 | TABLE ACCESS FULL | ITEM | 18 | 1188 | 375 (0)| 00:00:01 |
|
||||
|* 10 | INDEX RANGE SCAN | SYS_C0010069 | 159 | | 2 (0)| 00:00:01 |
|
||||
| 11 | TABLE ACCESS BY INDEX ROWID| STORE_SALES | 159 | 2703 | 163 (0)| 00:00:01 |
|
||||
--------------------------------------------------------------------------------------------------
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!-- -->
|
||||
|
||||
* OceanBase 数据库执行计划展示如下:
|
||||
|
||||
```sql
|
||||
|ID|OPERATOR |NAME |EST. ROWS|COST |
|
||||
-------------------------------------------------------
|
||||
|0 |LIMIT | |100 |81141|
|
||||
|1 | TOP-N SORT | |100 |81127|
|
||||
|2 | HASH GROUP BY | |2924 |68551|
|
||||
|3 | HASH JOIN | |2924 |65004|
|
||||
|4 | SUBPLAN SCAN |VIEW1 |2953 |19070|
|
||||
|5 | HASH GROUP BY | |2953 |18662|
|
||||
|6 | NESTED-LOOP JOIN| |2953 |15080|
|
||||
|7 | TABLE SCAN |ITEM |19 |11841|
|
||||
|8 | TABLE SCAN |STORE_SALES|161 |73 |
|
||||
|9 | TABLE SCAN |DT |6088 |29401|
|
||||
=======================================================
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
由示例可见,OceanBase 数据库的计划展示与 Oracle 数据库类似。OceanBase 数据库执行计划中的各列的含义如下:
|
||||
|
||||
|
||||
| 列名 | 含义 |
|
||||
|-----------|----------------------------|
|
||||
| ID | 执行树按照前序遍历的方式得到的编号(从 0 开始)。 |
|
||||
| OPERATOR | 操作算子的名称。 |
|
||||
| NAME | 对应表操作的表名(索引名)。 |
|
||||
| EST. ROWS | 估算该操作算子的输出行数。 |
|
||||
| COST | 该操作算子的执行代价(微秒)。 |
|
||||
|
||||
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
在表操作中,NAME 字段会显示该操作涉及的表的名称(别名),如果是使用索引访问,还会在名称后的括号中展示该索引的名称, 例如 t1(t1_c2) 表示使用了 t1_c2 这个索引。如果扫描的顺序是逆序,还会在后面使用 RESERVE 关键字标识,例如 `t1(t1_c2,RESERVE)`。
|
||||
|
||||
OceanBase 数据库 `EXPLAIN` 命令输出的第一部分是执行计划的树形结构展示。其中每一个操作在树中的层次通过其在 operator 中的缩进予以展示。树的层次关系用缩进来表示,层次最深的优先执行,层次相同的以特定算子的执行顺序为标准来执行。
|
||||
|
||||
上述 TPCDS Q3 示例的计划展示树如下:
|
||||
|
||||
OceanBase 数据库 `EXPLAIN` 命令输出的第二部分是各操作算子的详细信息,包括输出表达式、过滤条件、分区信息以及各算子的独有信息(包括排序键、连接键、下压条件等)。示例如下:
|
||||
|
||||
```unknow
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil), sort_keys([t1.c1, ASC], [t1.c2, ASC]), prefix_pos(1)
|
||||
1 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil),
|
||||
equal_conds([t1.c1 = t2.c2]), other_conds(nil)
|
||||
2 - output([t2.c1], [t2.c2]), filter(nil), sort_keys([t2.c2, ASC])
|
||||
3 - output([t2.c2], [t2.c1]), filter(nil),
|
||||
access([t2.c2], [t2.c1]), partitions(p0)
|
||||
4 - output([t1.c1], [t1.c2]), filter(nil),
|
||||
access([t1.c1], [t1.c2]), partitions(p0)
|
||||
```
|
||||
|
||||
|
@ -1,69 +0,0 @@
|
||||
TABLE SCAN
|
||||
===============================
|
||||
|
||||
TABLE SCAN 算子是存储层和 SQL 层的接口,用于展示优化器选择哪个索引来访问数据。
|
||||
|
||||
在 OceanBase 数据库中,对于普通索引,索引的回表逻辑是封装在 TABLE SCAN 算子中的;而对于全局索引,索引的回表逻辑由 TABLE LOOKUP 算子完成。
|
||||
|
||||
示例:含 TABLE SCAN 算子的执行计划
|
||||
|
||||
```javascript
|
||||
obclient>CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT, c3 INT, c4 INT,
|
||||
INDEX k1(c2,c3));
|
||||
Query OK, 0 rows affected (0.09 sec)
|
||||
|
||||
Q1:
|
||||
obclient>EXPLAIN EXTENDED SELECT * FROM t1 WHERE c1 = 1\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
| ==================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
----------------------------------
|
||||
|0 |TABLE GET|t1 |1 |53 |
|
||||
==================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([t1.c1(0x7f22fbe69340)], [t1.c2(0x7f22fbe695c0)], [t1.c3(0x7f22fbe69840)], [t1.c4(0x7f22fbe69ac0)]), filter(nil),
|
||||
access([t1.c1(0x7f22fbe69340)], [t1.c2(0x7f22fbe695c0)], [t1.c3(0x7f22fbe69840)], [t1.c4(0x7f22fbe69ac0)]), partitions(p0),
|
||||
is_index_back=false,
|
||||
range_key([t1.c1(0x7f22fbe69340)]), range[1 ; 1],
|
||||
range_cond([t1.c1(0x7f22fbe69340) = 1(0x7f22fbe68cf0)])
|
||||
|
||||
Q2:
|
||||
obclient>EXPLAIN EXTENDED SELECT * FROM t1 WHERE c2 < 1 AND c3 < 1 AND
|
||||
c4 < 1\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
| ======================================
|
||||
|ID|OPERATOR |NAME |EST. ROWS|COST |
|
||||
--------------------------------------
|
||||
|0 |TABLE SCAN|t1(k1)|100 |12422|
|
||||
======================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([t1.c1(0x7f22fbd1e220)], [t1.c2(0x7f227decec40)], [t1.c3(0x7f227decf9b0)], [t1.c4(0x7f22fbd1dfa0)]), filter([t1.c3(0x7f227decf9b0) < 1(0x7f227decf360)], [t1.c4(0x7f22fbd1dfa0) < 1(0x7f22fbd1d950)]),
|
||||
access([t1.c2(0x7f227decec40)], [t1.c3(0x7f227decf9b0)], [t1.c4(0x7f22fbd1dfa0)], [t1.c1(0x7f22fbd1e220)]), partitions(p0),
|
||||
is_index_back=true, filter_before_indexback[true,false],
|
||||
range_key([t1.c2(0x7f227decec40)], [t1.c3(0x7f227decf9b0)], [t1.c1(0x7f22fbd1e220)]),
|
||||
range(NULL,MAX,MAX ; 1,MIN,MIN),
|
||||
range_cond([t1.c2(0x7f227decec40) < 1(0x7f227dece5f0)])
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例中,执行计划展示中的 outputs \& filters 详细展示了 TABLE SCAN 算子的输出信息如下:
|
||||
|
||||
|
||||
| **信息名称** | **含义** |
|
||||
|---------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| operator | TABLE SCAN 算子的 operator 有两种形式:TABLE SCAN 和 TABLE GET。 * TABLE SCAN:属于范围扫描,会返回 0 行或者多行数据。 * TABLE GET:直接用主键定位,返回 0 行或者 1 行数据。 |
|
||||
| name | 选择用哪个索引来访问数据。选择的索引的名字会跟在表名后面,如果没有索引的名字,则说明执行的是主表扫描。 这里需要注意,在 OceanBase 数据库中,主表和索引的组织结构是一样的,主表本身也是一个索引。 |
|
||||
| output | 该算子的输出列。 |
|
||||
| filter | 该算子的过滤谓词。 由于示例中 TABLE SCAN 算子没有设置 filter,所以为 nil。 |
|
||||
| partitions | 查询需要扫描的分区。 |
|
||||
| is_index_back | 该算子是否需要回表。 例如,在 Q1 查询中,因为选择了主表,所以不需要回表。在 Q2 查询中,索引列是 `(c2,c3,c1)`, 由于查询需要返回 c4 列,所以需要回表。 |
|
||||
| filter_before_indexback | 与每个 filter 对应,表明该 filter 是可以直接在索引上进行计算,还是需要索引回表之后才能计算。 例如,在 Q2 查询中,filter `c3 < 1` 可以直接在索引上计算,能减少回表数量;filter `c4 < 1` 需要回表取出 c4 列之后才能计算。 |
|
||||
| range_key/range/range_cond | * range_key:索引的 rowkey 列。 <!-- --> * range:索引开始扫描和结束扫描的位置。判断是否是全表扫描需要关注 range 的范围。例如,对于一个 rowkey 有三列的场景,`range(MIN,MIN, MIN ; MAX, MAX, MAX)`代表的就是真正意义上的全表扫描。 * range_cond:决定索引开始扫描和结束扫描位置的相关谓词。 |
|
||||
|
||||
|
@ -1,50 +0,0 @@
|
||||
MATERIAL
|
||||
=============================
|
||||
|
||||
MATERIAL 算子用于物化下层算子输出的数据。
|
||||
|
||||
OceanBase 数据库以流式数据执行计划,但有时算子需要等待下层算子输出所有数据后才能够开始执行,所以需要在下方添加一个 MATERIAL 算子物化所有的数据。或者在子计划需要重复执行的时候,使用 MATERIAL 算子可以避免重复执行。
|
||||
|
||||
如下示例中,t1 表与 t2 表执行 NESTED LOOP JOIN 运算时,右表需要重复扫描,可以在右表有一个 MATERIAL 算子,保存 t2 表的所有数据。
|
||||
|
||||
```javascript
|
||||
obclient>CREATE TABLE t1(c1 INT, c2 INT, c3 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>CREATE TABLE t2(c1 INT ,c2 INT ,c3 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>EXPLAIN SELECT /*+ORDERED USE_NL(T2)*/* FROM t1,t2
|
||||
WHERE t1.c1=t2.c1\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
===========================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST |
|
||||
-------------------------------------------
|
||||
|0 |NESTED-LOOP JOIN| |2970 |277377|
|
||||
|1 | TABLE SCAN |t1 |3 |37 |
|
||||
|2 | MATERIAL | |100000 |176342|
|
||||
|3 | TABLE SCAN |t2 |100000 |70683 |
|
||||
===========================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([t1.c1], [t1.c2], [t1.c3], [t2.c1], [t2.c2], [t2.c3]), filter(nil),
|
||||
conds([t1.c1 = t2.c1]), nl_params_(nil)
|
||||
1 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil),
|
||||
access([t1.c1], [t1.c2], [t1.c3]), partitions(p0)
|
||||
2 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil)
|
||||
3 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil),
|
||||
access([t2.c1], [t2.c2], [t2.c3]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例中,执行计划展示中 2 号算子 MATERIAL 的功能是保存 t2 表的数据,以避免每次联接都从磁盘扫描 t2 表的数据。执行计划展示中的 outputs \& filters 详细展示了 MATERIAL 算子的输出信息如下:
|
||||
|
||||
|
||||
| **信息名称** | **含义** |
|
||||
|----------|------------------------------------------------------------------|
|
||||
| output | 该算子输出的表达式。 其中 rownum() 表示 ROWNUM 对应的表达式。 |
|
||||
| filter | 该算子上的过滤条件。 由于示例中 MATERIAL 算子没有设置 filter,所以为 nil。 |
|
||||
|
||||
|
@ -1,42 +0,0 @@
|
||||
SORT
|
||||
=========================
|
||||
|
||||
SORT 算子用于对输入的数据进行排序。
|
||||
|
||||
示例:对 t1 表的数据排序,并按照 c1 列降序排列和 c2 列升序排列
|
||||
|
||||
```javascript
|
||||
obclient>CREATE TABLE t1(c1 INT, c2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>CREATE TABLE t2(c1 INT, c2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>EXPLAIN SELECT c1 FROM t1 ORDER BY c1 DESC, c2 ASC\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
====================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
------------------------------------
|
||||
|0 |SORT | |3 |40 |
|
||||
|1 | TABLE SCAN|t1 |3 |37 |
|
||||
====================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([t1.c1]), filter(nil), sort_keys([t1.c1, DESC], [t1.c2, ASC])
|
||||
1 - output([t1.c1], [t1.c2]), filter(nil),
|
||||
access([t1.c1], [t1.c2]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例中,执行计划展示中 0 号算子 SORT 对 t1 表的数据进行排序,执行计划展示中的 outputs \& filters 详细展示了 SORT 算子的输出信息如下:
|
||||
|
||||
|
||||
| **信息名称** | **含义** |
|
||||
|-------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| output | 该算子的输出列。 |
|
||||
| filter | 该算子的过滤谓词。 由于示例中 SORT 算子没有设置 filter,所以为 nil。 |
|
||||
| sort_keys(\[column, DESC\],\[column, ASC\] ...) | 按 column 列排序。 * DESC:降序。 * ASC:升序。 例如,`sort_keys([t1.c1, DESC],[t1.c2, ASC])`中指定排序键分别为 c1 和 c2,并且以 c1 列降序, c2 列升序排列。 |
|
||||
|
||||
|
@ -1,226 +0,0 @@
|
||||
LIMIT
|
||||
==========================
|
||||
|
||||
LIMIT 算子用于限制数据输出的行数,与 MySQL 的 LIMIT 算子功能相同。
|
||||
|
||||
在 OceanBase 数据库的 MySQL 模式中处理含有 LIMIT 的 SQL 时,SQL 优化器都会为其生成一个 LIMIT 算子,但在一些特殊场景不会给与分配,例如 LIMIT 可以下压到基表的场景,就没有分配的必要性。
|
||||
|
||||
而对于 OceanBase 数据库的 Oracle 模式,以下两种场景会为其分配 LIMIT 算子:
|
||||
|
||||
* ROWNUM 经过 SQL 优化器改写生成
|
||||
|
||||
|
||||
|
||||
* 为了兼容 Oracle12c 的 FETCH 功能
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
MySQL 模式含有 LIMIT 的 SQL 场景
|
||||
----------------------------------------------
|
||||
|
||||
示例 1:OceanBase 数据库的 MySQL 模式含有 LIMIT 的 SQL 场景
|
||||
|
||||
```javascript
|
||||
obclient>CREATE TABLE t1(c1 INT, c2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>CREATE TABLE t2(c1 INT, c2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(1, 1);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(2, 2);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(3, 3);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t2 VALUES(1, 1);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t2 VALUES(2, 2);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t2 VALUES(3, 3);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
Q1:
|
||||
obclient>EXPLAIN SELECT t1.c1 FROM t1,t2 LIMIT 1 OFFSET 1\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
| =====================================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST |
|
||||
-----------------------------------------------------
|
||||
|0 |LIMIT | |1 |39 |
|
||||
|1 | NESTED-LOOP JOIN CARTESIAN| |2 |39 |
|
||||
|2 | TABLE SCAN |t1 |1 |36 |
|
||||
|3 | TABLE SCAN |t2 |100000 |59654|
|
||||
=====================================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([t1.c1]), filter(nil), limit(1), offset(1)
|
||||
1 - output([t1.c1]), filter(nil),
|
||||
conds(nil), nl_params_(nil)
|
||||
2 - output([t1.c1]), filter(nil),
|
||||
access([t1.c1]), partitions(p0)
|
||||
3 - output([t2.__pk_increment]), filter(nil),
|
||||
access([t2.__pk_increment]), partitions(p0)
|
||||
|
||||
Q2:
|
||||
obclient>EXPLAIN SELECT * FROM t1 LIMIT 2\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
| ===================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
-----------------------------------
|
||||
|0 |TABLE SCAN|t1 |2 |37 |
|
||||
===================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([t1.c1], [t1.c2]), filter(nil),
|
||||
access([t1.c1], [t1.c2]), partitions(p0),
|
||||
limit(2), offset(nil)
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例中,Q1 查询的执行计划展示中的 outputs \& filters 详细列出了 LIMIT 算子的输出信息如下:
|
||||
|
||||
|
||||
| **信息名称** | **含义** |
|
||||
|----------|--------------------------------------------------------------------------|
|
||||
| output | 该算子输出的表达式。 |
|
||||
| filter | 该算子上的过滤条件。 由于示例中 LIMIT 算子没有设置 filter,所以为 nil。 |
|
||||
| limit | 限制输出的行数,是一个常量。 |
|
||||
| offset | 距离当前位置的偏移行数,是一个常量。 由于示例中的 SQL 中不含有 offset,因此生成的计划中为 nil。 |
|
||||
|
||||
|
||||
|
||||
Q2 查询的执行计划展示中,虽然 SQL 中含有 LIMIT,但是并未分配 LIMIT 算子,而是将相关表达式下压到了 TABLE SCAN 算子上,这种下压 LIMIT 行为是 SQL 优化器的一种优化方式,详细信息请参见 [TABLE SCAN](../../../12.sql-optimization-guide-1/2.sql-execution-plan-3/2.execution-plan-operator-2/1.table-scan-2.md)。
|
||||
|
||||
Oracle 模式含有 COUNT 的 SQL 改写为 LIMIT 场景
|
||||
---------------------------------------------------------
|
||||
|
||||
由于 Oracle 模式含有 COUNT 的 SQL 改写为 LIMIT 场景在 COUNT 算子章节已经有过相关介绍,详细信息请参见 [COUNT](../../../12.sql-optimization-guide-1/2.sql-execution-plan-3/2.execution-plan-operator-2/4.COUNT-1-2-3-4.md)。
|
||||
|
||||
Oracle 模式含有 FETCH 的 SQL 场景
|
||||
-----------------------------------------------
|
||||
|
||||
示例 2:OceanBase 数据库的 Oracle 模式含有 FETCH 的 SQL 场景
|
||||
|
||||
```javascript
|
||||
obclient>CREATE TABLE T1(c1 INT, c2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>CREATE TABLE T1(c1 INT, c2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(1, 1);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(2, 2);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(3, 3);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t2 VALUES(1, 1);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t2 VALUES(2, 2);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t2 VALUES(3, 3);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
Q3:
|
||||
obclient>EXPLAIN SELECT * FROM t1,t2 OFFSET 1 ROWS
|
||||
FETCH NEXT 1 ROWS ONLY\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
| =====================================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST |
|
||||
-----------------------------------------------------
|
||||
|0 |LIMIT | |1 |238670 |
|
||||
|1 | NESTED-LOOP JOIN CARTESIAN| |2 |238669 |
|
||||
|2 | TABLE SCAN |T1 |1 |36 |
|
||||
|3 | MATERIAL | |100000 |238632 |
|
||||
|4 | TABLE SCAN |T2 |100000 |64066|
|
||||
=====================================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([T1.C1], [T1.C2], [T2.C1], [T2.C2]), filter(nil), limit(?), offset(?)
|
||||
1 - output([T1.C1], [T1.C2], [T2.C1], [T2.C2]), filter(nil),
|
||||
conds(nil), nl_params_(nil)
|
||||
2 - output([T1.C1], [T1.C2]), filter(nil),
|
||||
access([T1.C1], [T1.C2]), partitions(p0)
|
||||
3 - output([T2.C1], [T2.C2]), filter(nil)
|
||||
4 - output([T2.C1], [T2.C2]), filter(nil),
|
||||
access([T2.C1], [T2.C2]), partitions(p0)
|
||||
|
||||
|
||||
Q4:
|
||||
obclient>EXPLAIN SELECT * FROM t1 FETCH NEXT 1 ROWS ONLY\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
| ===================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
-----------------------------------
|
||||
|0 |TABLE SCAN|T1 |1 |37 |
|
||||
===================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([T1.C1], [T1.C2]), filter(nil),
|
||||
access([T1.C1], [T1.C2]), partitions(p0),
|
||||
limit(?), offset(nil)
|
||||
|
||||
|
||||
Q5:
|
||||
obclient>EXPLAIN SELECT * FROM t2 ORDER BY c1 FETCH NEXT 10
|
||||
PERCENT ROW WITH TIES\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
| =======================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST |
|
||||
---------------------------------------
|
||||
|0 |LIMIT | |10000 |573070|
|
||||
|1 | SORT | |100000 |559268|
|
||||
|2 | TABLE SCAN|T2 |100000 |64066 |
|
||||
=======================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([T2.C1], [T2.C2]), filter(nil), limit(nil), offset(nil), percent(?), with_ties(true)
|
||||
1 - output([T2.C1], [T2.C2]), filter(nil), sort_keys([T2.C1, ASC])
|
||||
2 - output([T2.C1], [T2.C2]), filter(nil),
|
||||
access([T2.C1], [T2.C2]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例中,Q3 和 Q4 的查询的执行计划展示中,与之前 MySQL 模式的 Q1 和 Q2 查询基本相同,这是因为 Oracle 12c 的 FETCH 功能和 MySQL 的 LIMIT 功能类似,两者的区别如 Q5 执行计划展示中所示。
|
||||
|
||||
执行计划展示中的 outputs \& filters 详细列出了 LIMIT 算子的输出信息如下:
|
||||
|
||||
|
||||
| **信息名称** | **含义** |
|
||||
|-----------|-------------------------------------------------------------------------------------------------|
|
||||
| output | 该算子输出的表达式。 |
|
||||
| filter | 该算子上的过滤条件。 由于示例中 LIMIT 算子没有设置 filter,所以为 nil。 |
|
||||
| limit | 限制输出的行数,是一个常量。 |
|
||||
| offset | 距离当前位置的偏移行数,是一个常量。 |
|
||||
| percent | 按照数据总行数的百分比输出,是一个常量。 |
|
||||
| with_ties | 是否在排序后的将最后一行按照等值一起输出。 例如,要求输出最后一行,但是排序之后有两行的值都为 1,如果设置了最后一行按照等值一起输出,那么这两行都会被输出。 |
|
||||
|
||||
|
||||
|
||||
以上 LIMIT 算子的新增的计划展示属性,都是在 Oracle 模式下的 FETCH 功能特有的,不影响 MySQL 模式计划。关于 Oracle12c 的 FETCH 语法的详细信息,请参见 [Oracle 12c Fetch Rows](https://renenyffenegger.ch/notes/development/databases/Oracle/SQL/select/first-n-rows/index#ora-sql-row-limiting-clause)。
|
@ -1,135 +0,0 @@
|
||||
FOR UPDATE
|
||||
===============================
|
||||
|
||||
FOR UPDATE 算子用于对表中的数据进行加锁操作。
|
||||
|
||||
OceanBase 数据库支持的 FOR UPDATE 算子包括 FOR UPDATE 和 MULTI FOR UPDATE。
|
||||
|
||||
FOR UPDATE 算子执行查询的一般流程如下:
|
||||
|
||||
1. 首先执行 `SELECT` 语句部分,获得查询结果集。
|
||||
|
||||
|
||||
|
||||
2. 对查询结果集相关的记录进行加锁操作。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
FOR UPDATE
|
||||
-------------------------------
|
||||
|
||||
FOR UPDATE 用于对单表(或者单个分区)进行加锁。
|
||||
|
||||
如下示例中,Q1 查询是对 t1 表中满足 `c1 = 1` 的行进行加锁。这里 t1 表是一张单分区的表,所以 1 号算子生成了一个 FOR UPDATE 算子。
|
||||
|
||||
```javascript
|
||||
obclient>CREATE TABLE t1(c1 INT, c2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>CREATE TABLE t2(c1 INT, c2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(1, 1);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(2, 2);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(3, 3);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t2 VALUES(1, 1);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t2 VALUES(2, 2);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t2 VALUES(3, 3);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
Q1:
|
||||
obclient> EXPLAIN SELECT * FROM t1 WHERE c1 = 1 FOR UPDATE\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
=====================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
-------------------------------------
|
||||
|0 |MATERIAL | |10 |856 |
|
||||
|1 | FOR UPDATE | |10 |836 |
|
||||
|2 | TABLE SCAN|T1 |10 |836 |
|
||||
=====================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([T1.C1], [T1.C2]), filter(nil)
|
||||
1 - output([T1.C1], [T1.C2]), filter(nil), lock tables(T1)
|
||||
2 - output([T1.C1], [T1.C2], [T1.__pk_increment]), filter([T1.C1 = 1]),
|
||||
access([T1.C1], [T1.C2], [T1.__pk_increment]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例中,Q1 查询的执行计划展示中的 outputs \& filters 详细列出了 FOR UPDATE 算子的输出信息如下:
|
||||
|
||||
|
||||
| **信息名称** | **含义** |
|
||||
|-------------|--------------------------------------------------------------------|
|
||||
| output | 该算子输出的表达式。 |
|
||||
| filter | 该算子上的过滤条件。 由于示例中 FOR UPDATE 算子没有设置 filter,所以为 nil。 |
|
||||
| lock tables | 需要加锁的表。 |
|
||||
|
||||
|
||||
|
||||
MULTI FOR UPDATE
|
||||
-------------------------------------
|
||||
|
||||
MULTI FOR UPDATE 用于对多表(或者多个分区)进行加锁操作。
|
||||
|
||||
如下示例中,Q2 查询是对 t1 和 t2 两张表的数据进行加锁,加锁对象是满足 `c1 = 1 AND c1 = d1` 的行。由于需要对多个表的行进行加锁,因此 1 号算子是 MULTI FOR UPDATE。
|
||||
|
||||
```javascript
|
||||
obclient>CREATE TABLE t1 (c1 INT, c2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>CREATE TABLE t2 (d1 INT, d2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>EXPLAIN SELECT * FROM t1, t2 WHERE c1 = 1 AND c1 = d1
|
||||
FOR UPDATE\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
=====================================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
-----------------------------------------------------
|
||||
|0 |MATERIAL | |10 |931 |
|
||||
|1 | MULTI FOR UPDATE | |10 |895 |
|
||||
|2 | NESTED-LOOP JOIN CARTESIAN| |10 |895 |
|
||||
|3 | TABLE GET |T2 |1 |52 |
|
||||
|4 | TABLE SCAN |T1 |10 |836 |
|
||||
=====================================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([T1.C1], [T1.C2], [T2.D1], [T2.D2]), filter(nil)
|
||||
1 - output([T1.C1], [T1.C2], [T2.D1], [T2.D2]), filter(nil), lock tables(T1, T2)
|
||||
2 - output([T1.C1], [T1.C2], [T2.D1], [T2.D2], [T1.__pk_increment]), filter(nil),
|
||||
conds(nil), nl_params_(nil)
|
||||
3 - output([T2.D1], [T2.D2]), filter(nil),
|
||||
access([T2.D1], [T2.D2]), partitions(p0)
|
||||
4 - output([T1.C1], [T1.C2], [T1.__pk_increment]), filter([T1.C1 = 1]),
|
||||
access([T1.C1], [T1.C2], [T1.__pk_increment]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例中,Q2 查询的执行计划展示中的 outputs \& filters 详细列出了 MULTI FOR UPDATE 算子的信息如下:
|
||||
|
||||
|
||||
| **信息名称** | **含义** |
|
||||
|-------------|--------------------------------------------------------------------------|
|
||||
| output | 该算子输出的列。 |
|
||||
| filter | 该算子上的过滤条件。 由于示例中 MULTI FOR UPDATE 算子没有设置 filter,所以为 nil。 |
|
||||
| lock tables | 需要加锁的表。 |
|
||||
|
||||
|
@ -1,47 +0,0 @@
|
||||
SELECT INTO
|
||||
================================
|
||||
|
||||
SELECT INTO 算子用于将查询结果赋值给变量列表,查询仅返回一行数据。
|
||||
|
||||
如下示例查询中, `SELECT` 输出列为 `COUNT(*)` 和 `MAX(c1)`,其查询结果分别赋值给变量 @a 和 @b。
|
||||
|
||||
```javascript
|
||||
obclient>CREATE TABLE t1(c1 INT, c2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(1,1);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(2,2);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>EXPLAIN SELECT COUNT(*), MAX(c1) INTO @a, @b FROM t1\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
=========================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
-----------------------------------------
|
||||
|0 |SELECT INTO | |0 |37 |
|
||||
|1 | SCALAR GROUP BY| |1 |37 |
|
||||
|2 | TABLE SCAN |t1 |2 |37 |
|
||||
=========================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([T_FUN_COUNT(*)], [T_FUN_MAX(t1.c1)]), filter(nil)
|
||||
1 - output([T_FUN_COUNT(*)], [T_FUN_MAX(t1.c1)]), filter(nil),
|
||||
group(nil), agg_func([T_FUN_COUNT(*)], [T_FUN_MAX(t1.c1)])
|
||||
2 - output([t1.c1]), filter(nil),
|
||||
access([t1.c1]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例中,执行计划展示中的 outputs \& filters 详细列出了 SELECT INTO 算子的输出信息如下:
|
||||
|
||||
|
||||
| **信息名称** | **含义** |
|
||||
|----------|---------------------------------------------------------------------|
|
||||
| output | 该算子赋值给变量列表的表达式。 |
|
||||
| filter | 该算子上的过滤条件。 由于示例中 SELECT INTO 算子没有设置 filter,所以为 nil。 |
|
||||
|
||||
|
@ -1,79 +0,0 @@
|
||||
SUBPLAN SCAN
|
||||
=================================
|
||||
|
||||
SUBPLAN SCAN 算子用于展示优化器从哪个视图访问数据。
|
||||
|
||||
当查询的 FROM TABLE 为视图时,执行计划中会分配 SUBPLAN SCAN 算子。SUBPLAN SCAN 算子类似于 TABLE SCAN 算子,但它不从基表读取数据,而是读取孩子节点的输出数据。
|
||||
|
||||
如下示例中,Q1 查询中 1 号算子为视图中查询生成,0 号算子 SUBPLAN SCAN 读取 1 号算子并输出。
|
||||
|
||||
```javascript
|
||||
obclient>CREATE TABLE t1(c1 INT, c2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(1,1);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(2,2);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>CREATE VIEW v AS SELECT * FROM t1 LIMIT 5;
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
Q1:
|
||||
obclient>EXPLAIN SELECT * FROM V WHERE c1 > 0\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
=====================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
-------------------------------------
|
||||
|0 |SUBPLAN SCAN|v |1 |37 |
|
||||
|1 | TABLE SCAN |t1 |2 |37 |
|
||||
=====================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([v.c1], [v.c2]), filter([v.c1 > 0]),
|
||||
access([v.c1], [v.c2])
|
||||
1 - output([t1.c1], [t1.c2]), filter(nil),
|
||||
access([t1.c1], [t1.c2]), partitions(p0),
|
||||
limit(5), offset(nil)
|
||||
```
|
||||
|
||||
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
目前 LIMIT 算子只支持 MySQL 模式的 SQL 场景。详细信息请参考 [LIMIT](../../../12.sql-optimization-guide-1/2.sql-execution-plan-3/2.execution-plan-operator-2/12.LIMIT-1-2.md)。
|
||||
|
||||
上述示例中,Q1 查询的执行计划展示中的 outputs \& filters 详细列出了 SUBPLAN SCAN 算子的输出信息如下:
|
||||
|
||||
|
||||
| **信息名称** | **含义** |
|
||||
|----------|-------------------------------------------------------------------|
|
||||
| output | 该算子输出的表达式。 |
|
||||
| filter | 该算子上的过滤条件。 例如 `filter([v.c1 > 0])` 中的 `v.c1 > 0`。 |
|
||||
| access | 该算子从子节点读取的需要使用的列名。 |
|
||||
|
||||
|
||||
|
||||
当 `FROM TABLE` 为视图并且查询满足一定条件时能够对查询进行视图合并改写,此时执行计划中并不会出现 SUBPLAN SCAN。如下例所示,Q2 查询相比 Q1 查询减少了过滤条件,不再需要分配 SUBPLAN SCAN 算子。
|
||||
|
||||
```javascript
|
||||
Q2:
|
||||
obclient>EXPLAIN SELECT * FROM v\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
===================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
-----------------------------------
|
||||
|0 |TABLE SCAN|t1 |2 |37 |
|
||||
===================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([t1.c1], [t1.c2]), filter(nil),
|
||||
access([t1.c1], [t1.c2]), partitions(p0),
|
||||
limit(5), offset(nil)
|
||||
```
|
||||
|
||||
|
@ -1,121 +0,0 @@
|
||||
UNION
|
||||
==========================
|
||||
|
||||
UNION 算子用于将两个查询的结果集进行并集运算。
|
||||
|
||||
OceanBase 数据库支持的 UNION 算子包括 UNION ALL、 HASH UNION DISTINCT 和 MERGE UNION DISTINCT。
|
||||
|
||||
UNION ALL
|
||||
------------------------------
|
||||
|
||||
UNION ALL 用于直接对两个查询结果集进行合并输出。
|
||||
|
||||
如下示例中,Q1 对两个查询使用 UNION ALL 进行联接,使用 UNION ALL 算子进行并集运算。算子执行时依次输出左右子节点所有输出结果。
|
||||
|
||||
```javascript
|
||||
obclient>CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(1,1);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(2,2);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
Q1:
|
||||
obclient>EXPLAIN SELECT c1 FROM t1 UNION ALL SELECT c2 FROM t1\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
====================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
------------------------------------
|
||||
|0 |UNION ALL | |4 |74 |
|
||||
|1 | TABLE SCAN|T1 |2 |37 |
|
||||
|2 | TABLE SCAN|T1 |2 |37 |
|
||||
====================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([UNION(T1.C1, T1.C2)]), filter(nil)
|
||||
1 - output([T1.C1]), filter(nil),
|
||||
access([T1.C1]), partitions(p0)
|
||||
2 - output([T1.C2]), filter(nil),
|
||||
access([T1.C2]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例中,执行计划展示中的 outputs \& filters 详细列出了 UNION ALL 算子的输出信息如下:
|
||||
|
||||
|
||||
| **信息名称** | **含义** |
|
||||
|----------|-------------------------------------------------------------------|
|
||||
| output | 该算子的输出表达式。 |
|
||||
| filter | 该算子上的过滤条件。 由于示例中 UNION ALL 算子没有设置 filter,所以为 nil。 |
|
||||
|
||||
|
||||
|
||||
MERGE UNION DISTINCT
|
||||
-----------------------------------------
|
||||
|
||||
MERGE UNION DISTINCT 用于对结果集进行并集、去重后进行输出。
|
||||
|
||||
如下示例中,Q2 对两个查询使用 UNION DISTINCT 进行联接, c1 有可用排序,0 号算子生成 MERGE UNION DISTINCT 进行取并集、去重。由于 c2 无可用排序,所以在 3 号算子上分配了 SORT 算子进行排序。算子执行时从左右子节点读取有序输入,进行合并得到有序输出并去重。
|
||||
|
||||
```javascript
|
||||
Q2:
|
||||
obclient>EXPLAIN SELECT c1 FROM t1 UNION SELECT c2 FROM t1\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
=============================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
---------------------------------------------
|
||||
|0 |MERGE UNION DISTINCT| |4 |77 |
|
||||
|1 | TABLE SCAN |T1 |2 |37 |
|
||||
|2 | SORT | |2 |39 |
|
||||
|3 | TABLE SCAN |T1 |2 |37 |
|
||||
=============================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([UNION(T1.C1, T1.C2)]), filter(nil)
|
||||
1 - output([T1.C1]), filter(nil),
|
||||
access([T1.C1]), partitions(p0)
|
||||
2 - output([T1.C2]), filter(nil), sort_keys([T1.C2, ASC])
|
||||
3 - output([T1.C2]), filter(nil),
|
||||
access([T1.C2]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例的执行计划展示中的 outputs \& filters 详细列出了 MERGE UNION DISTINCT 算子的输出信息,字段的含义与 UNION ALL 算子相同。
|
||||
|
||||
HASH UNION DISTINCT
|
||||
----------------------------------------
|
||||
|
||||
HASH UNION DISTINCT 用于对结果集进行并集、去重后进行输出。
|
||||
|
||||
如下示例中,Q3 对两个查询使用 UNION DISTINCT 进行联接,无可利用排序,0 号算子使用 HASH UNION DISTINCT 进行并集、去重。算子执行时读取左右子节点输出,建立哈希表进行去重,最终输出去重后结果。
|
||||
|
||||
```javascript
|
||||
Q3:
|
||||
obclient>EXPLAIN SELECT c2 FROM t1 UNION SELECT c2 FROM t1\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
============================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
--------------------------------------------
|
||||
|0 |HASH UNION DISTINCT| |4 |77 |
|
||||
|1 | TABLE SCAN |T1 |2 |37 |
|
||||
|2 | TABLE SCAN |T1 |2 |37 |
|
||||
============================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([UNION(T1.C2, T1.C2)]), filter(nil)
|
||||
1 - output([T1.C2]), filter(nil),
|
||||
access([T1.C2]), partitions(p0)
|
||||
2 - output([T1.C2]), filter(nil),
|
||||
access([T1.C2]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例的执行计划展示中的 outputs \& filters 详细列出了 HASH UNION DISTINCT 算子的输出信息,字段的含义与 UNION ALL 算子相同。
|
@ -1,86 +0,0 @@
|
||||
INTERSECT
|
||||
==============================
|
||||
|
||||
INTERSECT 算子用于对左右孩子算子输出进行交集运算,并进行去重。
|
||||
|
||||
OceanBase 数据库支持的 INTERSECT 算子包括 MERGE INTERSECT DISTINCT 和 HASH INTERSECT DISTINCT。
|
||||
|
||||
MERGE INTERSECT DISTINCT
|
||||
---------------------------------------------
|
||||
|
||||
如下示例中,Q1 对两个查询使用 INTERSECT 联接,c1 有可用排序,0 号算子生成了 MERGE INTERSECT DISTINCT 进行求取交集、去重。由于 c2 无可用排序,所以在 3 号算子上分配了 SORT 算子进行排序。算子执行时从左右子节点读取有序输入,利用有序输入进行 MERGE,实现去重并得到交集结果。
|
||||
|
||||
```javascript
|
||||
obclient>CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(1,1);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(2,2);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
Q1:
|
||||
obclient>EXPLAIN SELECT c1 FROM t1 INTERSECT SELECT c2 FROM t1\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
=================================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
-------------------------------------------------
|
||||
|0 |MERGE INTERSECT DISTINCT| |2 |77 |
|
||||
|1 | TABLE SCAN |T1 |2 |37 |
|
||||
|2 | SORT | |2 |39 |
|
||||
|3 | TABLE SCAN |T1 |2 |37 |
|
||||
=================================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([INTERSECT(T1.C1, T1.C2)]), filter(nil)
|
||||
1 - output([T1.C1]), filter(nil),
|
||||
access([T1.C1]), partitions(p0)
|
||||
2 - output([T1.C2]), filter(nil), sort_keys([T1.C2, ASC])
|
||||
3 - output([T1.C2]), filter(nil),
|
||||
access([T1.C2]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例中,执行计划展示中的 outputs \& filters 详细列出了所有 INTERSECT 算子的输出信息如下:
|
||||
|
||||
|
||||
| **信息名称** | **含义** |
|
||||
|----------|------------------------------------------------------------------------------------------|
|
||||
| output | 该算子的输出表达式。 使用 INTERSECT 联接的两个子算子对应输出,即表示交集运算输出结果中的一列,括号内部为左右子节点对应此列的输出列。 |
|
||||
| filter | 该算子上的过滤条件。 由于示例中 INTERSECT 算子没有设置 filter,所以为 nil。 |
|
||||
|
||||
|
||||
|
||||
HASH INTERSECT DISTINCT
|
||||
--------------------------------------------
|
||||
|
||||
如下例所示,Q2 对两个查询使用 INTERSECT 进行联接,不可利用排序,0 号算子使用 HASH INTERSECT DISTINCT 进行求取交集、去重。算子执行时先读取一侧子节点输出建立哈希表并去重,再读取另一侧子节点利用哈希表求取交集并去重。
|
||||
|
||||
```javascript
|
||||
Q2:
|
||||
obclient>EXPLAIN SELECT c2 FROM t1 INTERSECT SELECT c2 FROM t1\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
================================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
------------------------------------------------
|
||||
|0 |HASH INTERSECT DISTINCT| |2 |77 |
|
||||
|1 | TABLE SCAN |T1 |2 |37 |
|
||||
|2 | TABLE SCAN |T1 |2 |37 |
|
||||
================================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([INTERSECT(T1.C2, T1.C2)]), filter(nil)
|
||||
1 - output([T1.C2]), filter(nil),
|
||||
access([T1.C2]), partitions(p0)
|
||||
2 - output([T1.C2]), filter(nil),
|
||||
access([T1.C2]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例的执行计划展示中的 outputs \& filters 详细列出了 HASH INTERSECT DISTINCT 算子的输出信息,字段的含义与 MERGE INTERSECT DISTINCT 算子相同。
|
@ -1,87 +0,0 @@
|
||||
EXCEPT/MINUS
|
||||
=================================
|
||||
|
||||
EXCEPT 算子用于对左右孩子算子输出集合进行差集运算,并进行去重。
|
||||
|
||||
Oracle 模式下一般使用 MINUS 进行差集运算,MySQL 模式下一般使用 EXCEPT 进行差集运算。OceanBase 数据库的 MySQL 模式不区分 EXCEPT 和 MINUS,两者均可作为差集运算关键字使用。
|
||||
|
||||
OceanBase 数据库支持的 EXCEPT 算子包括 MERGE EXCEPT DISTINCT 和 HASH EXCEPT DISTINCT。
|
||||
|
||||
MERGE EXCEPT DISTINCT
|
||||
------------------------------------------
|
||||
|
||||
如下示例中,Q1 对两个查询使用 MINUS 进行联接, c1 有可用排序,0 号算子生成了 MERGE EXCEPT DISTINCT 进行求取差集、去重,由于 c2 无可用排序,所以在 3 号算子上分配了 SORT 算子进行排序。算子执行时从左右孩子节点读取有序输入,利用有序输入进行 MERGE, 实现去重并得到差集结果。
|
||||
|
||||
```javascript
|
||||
obclient>CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT);
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(1,1);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
obclient>INSERT INTO t1 VALUES(2,2);
|
||||
Query OK, 1 rows affected (0.12 sec)
|
||||
|
||||
Q1:
|
||||
obclient>EXPLAIN SELECT c1 FROM t1 MINUS SELECT c2 FROM t1\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
==============================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
----------------------------------------------
|
||||
|0 |MERGE EXCEPT DISTINCT| |2 |77 |
|
||||
|1 | TABLE SCAN |T1 |2 |37 |
|
||||
|2 | SORT | |2 |39 |
|
||||
|3 | TABLE SCAN |T1 |2 |37 |
|
||||
==============================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([MINUS(T1.C1, T1.C2)]), filter(nil)
|
||||
1 - output([T1.C1]), filter(nil),
|
||||
access([T1.C1]), partitions(p0)
|
||||
2 - output([T1.C2]), filter(nil), sort_keys([T1.C2, ASC])
|
||||
3 - output([T1.C2]), filter(nil),
|
||||
access([T1.C2]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例中,执行计划展示中的 outputs \& filters 详细列出了 EXCEPT 算子的输出信息如下:
|
||||
|
||||
|
||||
| **信息名称** | **含义** |
|
||||
|----------|----------------------------------------------------------------------------------------------------------------------------------|
|
||||
| output | 该算子的输出表达式。 使用 EXCEPT/MINUS 联接的两孩子算子对应输出(Oracle 模式使用 MINUS,MySQL 模式使用 EXCEPT),表示差集运算输出结果中的一列,括号内部为左右孩子节点对应此列的输出列。 |
|
||||
| filter | 该算子上的过滤条件。 由于示例中 EXCEPT 算子没有设置 filter,所以为 nil。 |
|
||||
|
||||
|
||||
|
||||
HASH EXCEPT DISTINCT
|
||||
-----------------------------------------
|
||||
|
||||
如下示例中,Q2 对两个查询使用 MINUS 进行联接,不可利用排序,0 号算子使用 HASH EXCEPT DISTINCT 进行求取差集、去重。算子执行时先读取左侧孩子节点输出建立哈希表并去重,再读取右侧孩子节点输出利用哈希表求取差集并去重。
|
||||
|
||||
```javascript
|
||||
Q2:
|
||||
obclient>EXPLAIN SELECT c2 FROM t1 MINUS SELECT c2 FROM t1\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
=============================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
---------------------------------------------
|
||||
|0 |HASH EXCEPT DISTINCT| |2 |77 |
|
||||
|1 | TABLE SCAN |T1 |2 |37 |
|
||||
|2 | TABLE SCAN |T1 |2 |37 |
|
||||
=============================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([MINUS(T1.C2, T1.C2)]), filter(nil)
|
||||
1 - output([T1.C2]), filter(nil),
|
||||
access([T1.C2]), partitions(p0)
|
||||
2 - output([T1.C2]), filter(nil),
|
||||
access([T1.C2]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例的执行计划展示中的 outputs \& filters 详细列出了 HASH EXCEPT DISTINCT 算子的输出信息,字段的含义与 MERGE EXCEPT DISTINCT 算子相同。
|
@ -1,232 +0,0 @@
|
||||
INSERT
|
||||
===========================
|
||||
|
||||
INSERT 算子用于将指定的数据插入数据表,数据来源包括直接指定的值和子查询的结果。
|
||||
|
||||
OceanBase 数据库支持的 INSERT 算子包括 INSERT 和 MULTI PARTITION INSERT。
|
||||
|
||||
INSERT
|
||||
---------------------------
|
||||
|
||||
INSERT 算子用于向数据表的单个分区中插入数据。
|
||||
|
||||
如下例所示,Q1 查询将值 (1, '100') 插入到非分区表 t1 中。其中 1 号算子 EXPRESSION 用来生成常量表达式的值。
|
||||
|
||||
```javascript
|
||||
obclient>CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 VARCHAR2(10));
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>CREATE TABLE t2 (c1 INT PRIMARY KEY, c2 VARCHAR2(10)) PARTITION BY
|
||||
HASH(c1) PARTITIONS 10;
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>CREATE TABLE t3 (c1 INT PRIMARY KEY, c2 VARCHAR2(10));
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
obclient>CREATE INDEX IDX_t3_c2 ON t3 (c2) PARTITION BY HASH(c2) PARTITIONS 3;
|
||||
Query OK, 0 rows affected (0.12 sec)
|
||||
|
||||
Q1:
|
||||
obclient>EXPLAIN INSERT INTO t1 VALUES (1, '100')\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
====================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
------------------------------------
|
||||
|0 |INSERT | |1 |1 |
|
||||
|1 | EXPRESSION| |1 |1 |
|
||||
====================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([__values.C1], [__values.C2]), filter(nil),
|
||||
columns([{T1: ({T1: (T1.C1, T1.C2)})}]), partitions(p0)
|
||||
1 - output([__values.C1], [__values.C2]), filter(nil)
|
||||
values({1, '100'})
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例中,执行计划展示中的 outputs \& filters 详细列出了 INSERT 算子的输出信息如下:
|
||||
|
||||
|
||||
| **信息名称** | **含义** |
|
||||
|------------|----------------------------------------------------------------|
|
||||
| output | 该算子输出的表达式。 |
|
||||
| filter | 该算子上的过滤条件。 由于示例中 INSERT 算子没有设置 filter,所以为 nil。 |
|
||||
| columns | 插入操作涉及的数据表的列。 |
|
||||
| partitions | 插入操作涉及到的数据表的分区(非分区表可以认为是一个只有一个分区的分区表)。 |
|
||||
|
||||
|
||||
|
||||
更多 INSERT 算子的示例如下:
|
||||
|
||||
* Q2 查询将值(2, '200')、(3, '300')插入到表 t1 中。
|
||||
|
||||
```unknow
|
||||
Q2:
|
||||
obclient>EXPLAIN INSERT INTO t1 VALUES (2, '200'),(3, '300')\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
====================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
------------------------------------
|
||||
|0 |INSERT | |2 |1 |
|
||||
|1 | EXPRESSION| |2 |1 |
|
||||
====================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([__values.C1], [__values.C2]), filter(nil),
|
||||
columns([{T1: ({T1: (T1.C1, T1.C2)})}]), partitions(p0)
|
||||
1 - output([__values.C1], [__values.C2]), filter(nil)
|
||||
values({2, '200'}, {3, '300'})
|
||||
```
|
||||
|
||||
|
||||
|
||||
* Q3 查询将子查询 `SELECT * FROM t3` 的结果插入到表 t1 中。
|
||||
|
||||
```unknow
|
||||
Q3:
|
||||
obclient>EXPLAIN INSERT INTO t1 SELECT * FROM t3\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
====================================
|
||||
|0 |INSERT | |100000 |117862|
|
||||
|1 | EXCHANGE IN DISTR | |100000 |104060|
|
||||
|2 | EXCHANGE OUT DISTR| |100000 |75662 |
|
||||
|3 | SUBPLAN SCAN |VIEW1|100000 |75662 |
|
||||
|4 | TABLE SCAN |T3 |100000 |61860 |
|
||||
================================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([VIEW1.C1], [VIEW1.C2]), filter(nil),
|
||||
columns([{T1: ({T1: (T1.C1, T1.C2)})}]), partitions(p0)
|
||||
1 - output([VIEW1.C1], [VIEW1.C2]), filter(nil)
|
||||
2 - output([VIEW1.C1], [VIEW1.C2]), filter(nil)
|
||||
3 - output([VIEW1.C1], [VIEW1.C2]), filter(nil),
|
||||
access([VIEW1.C1], [VIEW1.C2])
|
||||
4 - output([T3.C1], [T3.C2]), filter(nil),
|
||||
access([T3.C2], [T3.C1]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* Q4 查询将值(1, '100')插入到分区表 t2 中,通过 `partitions` 参数可以看出,该值会被插入到 t2 的 p5 分区。
|
||||
|
||||
```javascript
|
||||
Q4:
|
||||
obclient>EXPLAIN INSERT INTO t2 VALUES (1, '100')\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
====================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
------------------------------------
|
||||
|0 |INSERT | |1 |1 |
|
||||
|1 | EXPRESSION| |1 |1 |
|
||||
====================================
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([__values.C1], [__values.C2]), filter(nil),
|
||||
columns([{T2: ({T2: (T2.C1, T2.C2)})}]), partitions(p5)
|
||||
1 - output([__values.C1], [__values.C2]), filter(nil)
|
||||
values({1, '100'})
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
MULTI PARTITION INSERT
|
||||
-------------------------------------------
|
||||
|
||||
MULTI PARTITION INSERT 算子用于向数据表的多个分区中插入数据。
|
||||
|
||||
如下例所示,Q5 查询将值(2, '200')、(3, '300')插入到分区表 t2 中,通过 `partitions` 可以看出,这些值会被插入到 t2 的 p0 和 p6 分区。
|
||||
|
||||
```javascript
|
||||
Q5:
|
||||
obclient>EXPLAIN INSERT INTO t2 VALUES (2, '200'),(3, '300')\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
===============================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
-----------------------------------------------
|
||||
|0 |MULTI PARTITION INSERT| |2 |1 |
|
||||
|1 | EXPRESSION | |2 |1 |
|
||||
===============================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([__values.C1], [__values.C2]), filter(nil),
|
||||
columns([{T2: ({T2: (T2.C1, T2.C2)})}]), partitions(p0, p6)
|
||||
1 - output([__values.C1], [__values.C2]), filter(nil)
|
||||
values({2, '200'}, {3, '300'})
|
||||
```
|
||||
|
||||
|
||||
|
||||
上述示例的执行计划展示中的 outputs \& filters 详细列出了 MULTI PARTITION INSERT 算子的信息,字段的含义与 INSERT 算子相同。
|
||||
|
||||
更多 MULTI PARTITION INSERT 算子的示例如下:
|
||||
|
||||
* Q6 查询将子查询 `SELECT * FROM t3` 的结果插入到分区表 t2 中,因为无法确定子查询的结果集,因此数据可能插入到 t2 的 p0 到 p9 的任何一个分区中。从1 号算子可以看到,这里的 `SELECT * FROM t3` 会被放在一个子查询中,并将子查询命名为 VIEW1。当 OceanBase 数据库内部改写 SQL 产生了子查询时,会自动为子查询命名,并按照子查询生成的顺序命名为 VIEW1、VIEW2、VIEW3...
|
||||
|
||||
```unknow
|
||||
Q6:
|
||||
obclient>EXPLAIN INSERT INTO t2 SELECT * FROM t3\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
==============================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
--------------------------------------------------
|
||||
|0 |MULTI PARTITION INSERT| |100000 |117862|
|
||||
|1 | EXCHANGE IN DISTR | |100000 |104060|
|
||||
|2 | EXCHANGE OUT DISTR | |100000 |75662 |
|
||||
|3 | SUBPLAN SCAN |VIEW1|100000 |75662 |
|
||||
|4 | TABLE SCAN |T3 |100000 |61860 |
|
||||
==================================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([VIEW1.C1], [VIEW1.C2]), filter(nil),
|
||||
columns([{T2: ({T2: (T2.C1, T2.C2)})}]), partitions(p[0-9])
|
||||
1 - output([VIEW1.C1], [VIEW1.C2]), filter(nil)
|
||||
2 - output([VIEW1.C1], [VIEW1.C2]), filter(nil)
|
||||
3 - output([VIEW1.C1], [VIEW1.C2]), filter(nil),
|
||||
access([VIEW1.C1], [VIEW1.C2])
|
||||
4 - output([T3.C1], [T3.C2]), filter(nil),
|
||||
access([T3.C2], [T3.C1]), partitions(p0)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* Q7 查询将值(1, '100')插入到非分区表 t3 中。虽然 t3 本身是一个非分区表,但因为 t3 上存在全局索引 idx_t3_c2,因此本次插入也涉及到了多个分区。
|
||||
|
||||
```javascript
|
||||
Q7:
|
||||
obclient>EXPLAIN INSERT INTO t3 VALUES (1, '100')\G;
|
||||
*************************** 1. row ***************************
|
||||
Query Plan:
|
||||
==============================================
|
||||
|ID|OPERATOR |NAME|EST. ROWS|COST|
|
||||
-----------------------------------------------
|
||||
|0 |MULTI PARTITION INSERT| |1 |1 |
|
||||
|1 | EXPRESSION | |1 |1 |
|
||||
===============================================
|
||||
|
||||
Outputs & filters:
|
||||
-------------------------------------
|
||||
0 - output([__values.C1], [__values.C2]), filter(nil),
|
||||
columns([{T3: ({T3: (T3.C1, T3.C2)}, {IDX_T3_C2: (T3.C2, T3.C1)})}]), partitions(p0)
|
||||
1 - output([__values.C1], [__values.C2]), filter(nil)
|
||||
values({1, '100'})
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user