PingCAP
  • 文档
  • 案例
  • 博客
  • 关于
  • 下载
PingCAP
  • 文档
  • 案例
  • 博客
  • 关于
  • 下载

Contact

  • 微信扫一扫
    微信ID:pingcap2015

English
文档
  • 关于 TiDB
    • TiDB 简介
    • TiDB 整体架构
    • TiDB 核心特性
  • TiDB 快速入门
    • 快速入门指南
    • SQL 基本操作
  • TiDB 用户文档
    • TiDB 数据库管理
      • TiDB 服务
      • TiDB 进程启动参数
      • TiDB 数据目录
      • TiDB 系统数据库
      • TiDB 系统变量
      • TiDB 专用系统变量和语法
      • TiDB 服务器日志文件
      • TiDB 访问权限管理
      • TiDB 用户账户管理
      • 使用加密连接
    • SQL 优化
      • 理解 TiDB 执行计划
      • 统计信息
    • 语言结构
      • 字面值
      • 数据库、表、索引、列和别名
      • 关键字和保留字
      • 用户变量
      • 表达式语法
      • 注释语法
    • 字符集和时区
      • 字符集支持
      • 字符集配置
      • 时区
    • 数据类型
      • 数值类型
      • 日期和时间类型
      • 字符串类型
      • JSON 数据类型
      • 枚举类型
      • 集合类型
      • 数据类型默认值
    • 函数和操作符
      • 函数和操作符概述
      • 表达式求值的类型转换
      • 操作符
      • 控制流程函数
      • 字符串函数
      • 数值函数与操作符
      • 日期和时间函数
      • 位函数和操作符
      • Cast 函数和操作符
      • 加密和压缩函数
      • 信息函数
      • JSON 函数
      • GROUP BY 聚合函数
      • 其他函数
      • 精度数学
    • SQL 语句语法
      • 数据定义语句 (DDL)
      • 数据操作语句 (DML)
      • 事务语句
      • 数据库管理语句
      • Prepared SQL 语句语法
      • 实用工具语句
      • TiDB SQL 语法图
    • JSON 支持
    • Connectors 和 API
    • TiDB 事务隔离级别
    • 错误码与故障诊断
    • 与 MySQL 兼容性对比
    • TiDB 内存控制
    • 慢查询日志
    • 高级功能
      • 历史数据回溯
      • 垃圾回收 (GC)
  • TiDB 运维文档
    • 软硬件环境需求
    • 部署集群
      • Ansible 部署方案(强烈推荐)
      • 离线 Ansible 部署方案
      • Docker 部署方案
      • Docker Compose 部署方案
      • 跨机房部署方案
    • 配置集群
      • 参数解释
      • TiDB 配置项解释
      • 使用 Ansible 变更组件配置
      • 开启 TLS 验证
      • 生成自签名证书
    • 监控集群
      • 整体监控框架概述
      • 重要监控指标详解
      • 组件状态 API & 监控
    • 扩容缩容
      • 集群扩容缩容方案
      • 使用 Ansible 扩容缩容
    • 升级
      • 升级组件版本
      • TiDB 2.0 升级操作指南
    • 性能调优
    • 备份与迁移
      • 备份与恢复
      • 数据迁移
        • 数据迁移概述
        • 全量导入
        • 增量导入
    • 故障诊断
  • TiDB 周边工具
    • Syncer
    • Loader
    • TiDB-Binlog
    • PD Control
    • PD Recover
    • TiKV Control
    • TiDB Controller
  • TiSpark 文档
    • TiSpark 快速入门指南
    • TiSpark 用户指南
  • 常见问题与解答(FAQ)
  • 最佳实践
  • 版本发布历史
    • 2.1 RC3
    • 2.1 RC2
    • 2.0.7
    • 2.1 RC1
    • 2.0.6
    • 2.0.5
    • 2.1 Beta
    • 2.0.4
    • 2.0.3
    • 2.0.2
    • 2.0.1
    • 2.0
    • 2.0 RC5
    • 2.0 RC4
    • 2.0 RC3
    • 2.0 RC1
    • 1.1 Beta
    • 1.1 Alpha
    • 1.0
    • Pre-GA
    • RC4
    • RC3
    • RC2
    • RC1
  • TiDB 路线图
  • 用户案例
    • 北京银行
    • 海航
    • 今日头条
    • 转转
    • Mobike
    • 饿了么(一)
    • 饿了么(二)
    • 爱奇艺
    • 易果生鲜
    • 同程旅游
    • 去哪儿
    • G7
    • 一面数据
    • 凤凰网
    • 猿辅导
    • Mobikok
    • 二维火
    • 客如云
    • Ping++
    • 乐视云
    • 零氪科技
    • 威锐达测控
    • 盖娅互娱
    • 游族网络
    • 西山居
    • FUNYOURS JAPAN
    • 特来电
    • 万达网络
    • 360金融
    • 中国电信翼支付
    • 某电信运营商
  • 更多资源
    • 常用工具
    • PingCAP 团队技术博客
    • 知乎专栏
    • Weekly
    • 英文文档

TiDB 数据操作语言

数据操作语言 (Data Manipulation Language, DML) 用于帮助用户实现对数据库的基本操作,比如查询、写入、删除和修改数据库中的数据。

TiDB 支持的数据操作语言包括 Select,Insert,Delete,Update 和 Replace。

Select 语句

Select 语句用于从数据库中查询数据。

语法定义

SELECT
    [ALL | DISTINCT | DISTINCTROW ]
      [HIGH_PRIORITY]
      [STRAIGHT_JOIN]
      [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
    select_expr [, select_expr ...]
    [FROM table_references
    [WHERE where_condition]
    [GROUP BY {col_name | expr | position}
      [ASC | DESC], ...]
    [HAVING where_condition]
    [ORDER BY {col_name | expr | position}
      [ASC | DESC], ...]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]
    [FOR UPDATE | LOCK IN SHARE MODE]]

语法元素说明

语法元素 说明
ALL、DISTINCT、DISTINCTROW 查询结果集中可能会包含重复值。指定 DISTINCT/DISTINCTROW 则在查询结果中过滤掉重复的行;指定 ALL 则列出所有的行。默认为 ALL。
HIGH_PRIORITY 该语句为高优先级语句,TiDB 在执行阶段会优先处理这条语句
SQL_CACHE、SQL_NO_CACHE、SQL_CALC_FOUND_ROWS TiDB 出于兼容性解析这三个语法,但是不做任何处理
STRAIGHT_JOIN STRAIGHT_JOIN 会强制优化器按照 FROM 子句中所使用的表的顺序做联合查询。当优化器选择的 Join 顺序并不优秀时,你可以使用这个语法来加速查询的执行
select_expr 投影操作列表,一般包括列名、表达式,或者是用 ‘*’ 表示全部列
FROM table_references 表示数据来源,数据来源可以是一个表(select * from t;)或者是多个表 (select * from t1 join t2;) 或者是0个表 (select 1+1 from dual;, 等价于 select 1+1;)
WHERE where_condition Where 子句用于设置过滤条件,查询结果中只会包含满足条件的数据
GROUP BY GroupBy 子句用于对查询结果集进行分组
HAVING where_condition Having 子句与 Where 子句作用类似,Having 子句可以让过滤 GroupBy 后的各种数据,Where 子句用于在聚合前过滤记录。
ORDER BY OrderBy 子句用于指定结果排序顺序,可以按照列、表达式或者是 select_expr 列表中某个位置的字段进行排序。
LIMIT Limit 子句用于限制结果条数。Limit 接受一个或两个数字参数,如果只有一个参数,那么表示返回数据的最大行数;如果是两个参数,那么第一个参数表示返回数据的第一行的偏移量(第一行数据的偏移量是 0),第二个参数指定返回数据的最大条目数。
FOR UPDATE 对查询结果集所有数据上读锁,以监测其他事务对这些的并发修改。TiDB 使用乐观事务模型在语句执行期间不会检测锁冲突,在事务的提交阶段才会检测事务冲突,如果执行 Select For Update 期间,有其他事务修改相关的数据,那么包含 Select For Update 语句的事务会提交失败。
LOCK IN SHARE MODE TiDB 出于兼容性解析这个语法,但是不做任何处理

Insert 语句

Insert 语句用于向数据库中插入数据,TiDB 兼容 MySQL Insert 语句的所有语法。

语法定义

InsertStatement:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name
    insert_values
    [ON DUPLICATE KEY UPDATE assignment_list]

insert_values:
    [(col_name [, col_name] ...)]
    {VALUES | VALUE} (expr_list) [, (expr_list)] ...
|   SET assignment_list
|   [(col_name [, col_name] ...)]
    SELECT ...

expr_list:
    expr [, expr] ...

assignment:
    col_name = expr

assignment_list:
    assignment [, assignment] ...

语法元素说明

语法元素 说明
LOW_PRIORITY 该语句为低优先级语句,TiDB 在执行阶段会降低这条语句的优先级
DELAYED TiDB 出于兼容性解析这个语法,但是不做任何处理
HIGH_PRIORITY 该语句为高优先级语句,TiDB 在执行阶段会优先处理这条语句
IGNORE 如果发生 Uniq Key 冲突,则忽略插入的数据,不报错
tbl_name 要插入的表名
insert_values 待插入的数据,下面一节会详细描述
ON DUPLICATE KEY UPDATE assignment_list 如果发生 Uniq Key 冲突,则舍弃要插入的数据,改用 assignment_list 更新已存在的行

insert_values

待插入的数据集,可以用以下三种方式指定:

  • Value List

将被插入的数据值写入列表中,例如:

CREATE TABLE tbl_name (
    a int,
    b int,
    c int
);
INSERT INTO tbl_name VALUES(1,2,3),(4,5,6),(7,8,9);

上面的例子中,(1,2,3),(4,5,6),(7,8,9) 即为 Value List,其中每个括号内部的数据表示一行数据,这个例子中插入了三行数据。Insert 语句也可以只给部分列插入数据,这种情况下,需要在 Value List 之前加上 ColumnName List,如:

INSERT INTO tbl_name (a,c) VALUES(1,2),(4,5),(7,8);

上面的例子中,每行数据只指定了 a 和 c 这两列的值,b 列的值会设为 Null。

  • Assignment List

通过赋值列表指定插入的数据,例如:

INSERT INTO tbl_name a=1, b=2, c=3;

这种方式每次只能插入一行数据,每列的值通过赋值列表制定。

  • Select Statement

待插入的数据集是通过一个 Select 语句获取,要插入的列是通过 Select 语句的 Schema 获得。例如:

CREATE TABLE tbl_name1 (
    a int,
    b int,
    c int
);
INSERT INTO tbl_name SELECT * from tbl_name1;

上面的例子中,从 tbl_name1 中查询出数据,插入 tbl_name 中。

Delete 语句

Delete 语句用于删除数据库中的数据,TiDB 兼容 MySQL Delete 语句除 PARTITION 之外的所有语法。Delete 语句主要分为单表删除和多表删除两种,下面分开描述。

单表删除

这种语法用于删除的数据只会涉及一个表的情况。

语法定义

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

多表删除

这种语法用于删除的数据会涉及多张表的情况。一共有两种写法:

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    tbl_name[.*] [, tbl_name[.*]] ...
    FROM table_references
    [WHERE where_condition]

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM tbl_name[.*] [, tbl_name[.*]] ...
    USING table_references
    [WHERE where_condition]

删除多个表的数据的时候,可以用这两种语法。这两种写法都可以指定从多个表查询数据,但只删除其中一些表的数据。在第一种语法中,只会删除 FROM 关键字之前的 Table 列表中所列 Table 的表中的数据。对于第二种写法,只会删除 FROM 之后 USING 之前的 Table 列表中的所列 Table 中的数据。

语法元素说明

语法元素 说明
LOW_PRIORITY 该语句为低优先级语句,TiDB 在执行阶段会降低这条语句的优先级
QUICK TiDB 出于兼容性解析这个语法,但是不做任何处理
IGNORE TiDB 出于兼容性解析这个语法,但是不做任何处理
tbl_name 要删除数据的表名
WHERE where_condition Where 表达式,只删除满足表达式的那些行
ORDER BY 对待删除数据集进行排序
LIMIT row_count 只对待删除数据集中排序前 row_count 行的内容进行删除

Update 语句

Update 语句用于更新表中的数据。

语法定义

Update 语句一共有两种语法,分别用于更新单表数据和多表数据。

单表 Update

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET assignment_list
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]

assignment:
    col_name = value

assignment_list:
    assignment [, assignment] ...

单表 Update 语句会更新 Table 中现有行的指定列。SET assignment_list 指定了要更新的列名,以及要赋予地新值。 Where/OrderBy/Limit 子句一起用于从 Table 中查询出待更新的数据。

多表 Update

UPDATE [LOW_PRIORITY] [IGNORE] table_references
    SET assignment_list
    [WHERE where_condition]

多表更新语句用于将 table_references 中满足 Where 子句的数据地指定列赋予新的值。

语法元素说明

语法元素 说明
LOW_PRIORITY 该语句为低优先级语句,TiDB 在执行阶段会降低这条语句的优先级
IGNORE TiDB 出于兼容性解析这个语法,但是不做任何处理
table_reference 待更新的 Table 名称
table_references 待更新的 Table 名称列表
SET assignment_list 待更新的列名以及目标值
WHERE where_condition Where 表达式,只更新满足表达式的那些行
ORDER BY 对待更新数据集进行排序
LIMIT row_count 只对待更新数据集中排序前 row_count 行的内容进行更新

Replace 语句

Replace 语句是 MySQL 对标准 SQL 语法的扩展,其行为和 Insert 语句一样,但是当现有数据中有和待插入数据在 PRIMARY KEY 或者 UNIQUE KEY 冲突的情况下,会先删除旧数据,再插入新数据。

语法定义

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
    [(col_name [, col_name] ...)]
    {VALUES | VALUE} (value_list) [, (value_list)] ...

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
    SET assignment_list

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
    [(col_name [, col_name] ...)]
    SELECT ...

语法元素说明

语法元素 说明
LOW_PRIORITY 该语句为低优先级语句,TiDB 在执行阶段会降低这条语句的优先级
DELAYED TiDB 出于兼容性解析这个语法,但是不做任何处理
tbl_name 待更新的 Table 名称
value_list 待插入的数据
SET assignment_list 待更新的列名以及目标值
SELECT ... 待插入的数据集,该数据集来自于一个 Select 语句
"数据操作语言" 更新于 Jul 12 2018: *: update metadata of docs-cn files (9058c86)
修改本文

本页导航

产品

  • TiDB
  • TiSpark
  • TiDB 路线图

文档

  • 快速入门
  • 最佳实践
  • 常见问题解答
  • TiDB 周边工具
  • 版本发布说明

资源

  • 博客
  • GitHub
  • 知乎专栏

公司

  • 关于我们
  • 招贤纳士
  • 新闻报道

联系我们

  • Twitter
  • LinkedIn
  • Reddit
  • Google Group
  • Stack Overflow
  • 微信公众号

    微信扫一扫
    微信ID:pingcap2015

© 2018 北京平凯星辰科技发展有限公司

English