前言
MySQL 作为最流行的关系型数据库之一,其核心操作语言分为三大类:DML(数据操作语言) 、DDL(数据定义语言) 和 TCL(事务控制语言)。本文将从实战角度出发,系统讲解这三类语言的语法、用法及注意事项,适合初学者快速入门,也适合有经验的开发者作为参考手册。
一、DML(数据操作语言)
数据操作语言(Data Manipulation Language)用于对数据库中的数据进行增、删、改操作。
1. INSERT(插入数据)
1.1 方式一:VALUES 方式
sql
-- 基本语法
INSERT INTO 表名 (列名1, 列名2, ...) VALUES (值1, 值2, ...);
-- 省略列名(需按表结构顺序提供所有列的值)
INSERT INTO 表名 VALUES (值1, 值2, ...);
示例:
sql
-- 指定列插入
INSERT INTO beauty (id, name, sex, borndate, phone, photo, boyfriend_id)
VALUES (1, '迪丽热巴', '女', '1992-06-03', '17000000000', NULL, 1);
-- 省略列名(必须匹配所有列)
INSERT INTO beauty VALUES (6, '杨幂', '女', '1986-08-12', '18000000000', NULL, 3);
-- 批量插入(方式一支持多行)
INSERT INTO beauty VALUES
(8, '杨幂2', '女', '1986-08-12', '15000000000', NULL, 3),
(9, '杨幂3', '女', '1986-08-12', '16000000000', NULL, 3);
1.2 方式二:SET 方式
sql
-- 基本语法
INSERT INTO 表名 SET 列名1 = 值1, 列名2 = 值2, ...;
示例:
sql
INSERT INTO beauty SET id = 7, name = '刘亦菲', sex = '女';
两种插入方式对比
| 对比项 | VALUES 方式 | SET 方式 |
|---|---|---|
| 支持多行插入 | ✅ | ❌ |
| 支持子查询 | ✅ | ❌ |
| 语法灵活性 | 一般 | 更直观 |
2. UPDATE(修改数据)
2.1 单表修改
sql
UPDATE 表名 SET 列名 = 新值, 列名2 = 新值2, ...
WHERE 筛选条件;
示例:
sql
-- 修改手机号
UPDATE beauty SET phone = '1919999999'
WHERE name LIKE '杨%';
-- 修改多个字段
UPDATE boys SET boyName = '汪峰2', userCP = 10000
WHERE id = 1;
2.2 多表修改(连表更新)
sql
UPDATE 表1 别名
INNER | LEFT | RIGHT JOIN 表2 别名 ON 连接条件
SET 列名 = 新值, ...
WHERE 筛选条件;
示例:
sql
-- 修改汪峰对应的女明星手机号
UPDATE boys bo
INNER JOIN beauty b ON bo.id = b.boyfriend_id
SET b.phone = '911'
WHERE bo.boyName = '汪峰2';
-- 将没有男朋友的女明星分配给编号为1的男生
UPDATE boys bo
RIGHT JOIN beauty b ON bo.id = b.boyfriend_id
SET b.boyfriend_id = 1
WHERE bo.id IS NULL;
3. DELETE(删除数据)
3.1 单表删除
sql
DELETE FROM 表名 WHERE 筛选条件;
示例:
sql
-- 删除手机号以91开头的女神信息
DELETE FROM beauty WHERE phone LIKE '91%';
3.2 多表删除
sql
DELETE 表1的别名, 表2的别名
FROM 表1 别名
INNER | LEFT | RIGHT JOIN 表2 别名 ON 连接条件
WHERE 筛选条件;
示例:
sql
-- 删除刘恺威及其女朋友的信息
DELETE b, bo
FROM beauty b
INNER JOIN boys bo ON b.boyfriend_id = bo.id
WHERE bo.boyName = '刘恺威';
4. TRUNCATE(截断表)
sql
TRUNCATE [TABLE] 表名;
DELETE vs TRUNCATE
| 对比项 | DELETE | TRUNCATE |
|---|---|---|
| WHERE 条件 | ✅ 支持 | ❌ 不支持 |
| 执行效率 | 较慢 | 更快 |
| 自增长列 | 从断点继续 | 从 1 重新开始 |
| 返回值 | 返回删除行数 | 无返回值 |
| 事务回滚 | ✅ 支持 | ❌ 不支持 |
二、DDL(数据定义语言)
数据定义语言(Data Definition Language)用于定义和管理数据库和表的结构。
1. 库的管理
1.1 创建数据库
sql
CREATE DATABASE [IF NOT EXISTS] 库名;
示例:
sql
CREATE DATABASE IF NOT EXISTS bigdata;
1.2 修改数据库
sql
ALTER DATABASE 库名 CHARACTER SET = 字符集;
ALTER DATABASE 库名 READ ONLY = {0 | 1}; -- 1为只读模式
1.3 删除数据库
sql
DROP DATABASE [IF EXISTS] 库名;
2. 表的管理
2.1 创建表
sql
CREATE TABLE [IF NOT EXISTS] 表名 (
列名 数据类型 [约束条件],
列名 数据类型 [约束条件],
...
);
示例:
sql
CREATE TABLE IF NOT EXISTS book (
id INT, -- 编号
bName VARCHAR(255), -- 图书名
price DOUBLE, -- 价格
authorId INT, -- 作者编号
publishDate DATETIME -- 出版日期
);
2.2 修改表
sql
-- 修改列名
ALTER TABLE 表名 CHANGE COLUMN 旧列名 新列名 数据类型;
-- 修改列的类型或约束
ALTER TABLE 表名 MODIFY COLUMN 列名 新数据类型;
-- 添加新列
ALTER TABLE 表名 ADD COLUMN 列名 数据类型;
-- 删除列
ALTER TABLE 表名 DROP COLUMN 列名;
-- 修改表名
ALTER TABLE 表名 RENAME TO 新表名;
示例:
sql
ALTER TABLE book CHANGE COLUMN publishDate pubDate DATETIME;
ALTER TABLE book MODIFY COLUMN pubDate TIMESTAMP;
ALTER TABLE author ADD COLUMN age INT;
ALTER TABLE author DROP COLUMN age;
ALTER TABLE author RENAME TO book_author;
2.3 删除表
sql
DROP TABLE [IF EXISTS] 表名;
2.4 复制表
sql
-- 复制表结构 + 数据
CREATE TABLE copy1 SELECT * FROM author;
-- 仅复制表结构
CREATE TABLE copy2 LIKE author;
-- 复制部分数据
CREATE TABLE copy3 SELECT id, au_name FROM author WHERE nation = '中国';
-- 复制某些字段(不复制数据)
CREATE TABLE copy4 SELECT id, au_name FROM author WHERE 0;
3. 数据类型速查
| 分类 | 数据类型 | 说明 |
|---|---|---|
| 整数 | INT, BIGINT | 常用 INT |
| 浮点数 | FLOAT, DOUBLE | 近似值存储 |
| 定点数 | DECIMAL | 精确值存储(金额推荐) |
| 日期时间 | DATE, TIME, DATETIME, TIMESTAMP | TIMESTAMP 支持时区 |
| 字符串 | CHAR(0-255), VARCHAR(0-65535) | 推荐 VARCHAR |
| 大文本 | TEXT | 长文本数据 |
| 二进制 | BLOB | 图片、文件等 |
4. 常见约束
约束分类
| 约束 | 关键字 | 说明 |
|---|---|---|
| 非空 | NOT NULL | 字段值不能为 NULL |
| 默认 | DEFAULT | 设置默认值 |
| 主键 | PRIMARY KEY | 唯一且非空 |
| 唯一 | UNIQUE | 唯一可为空 |
| 检查 | CHECK | 条件检查(MySQL 8.0 支持) |
| 外键 | FOREIGN KEY | 引用其他表主键 |
主键 vs 唯一
| 对比项 | PRIMARY KEY | UNIQUE |
|---|---|---|
| 唯一性 | ✅ | ✅ |
| 允许为空 | ❌ | ✅ |
| 每表数量 | 至多 1 个 | 多个 |
| 组合键 | 允许(不推荐) | 允许(不推荐) |
添加约束
列级约束(创建表时):
sql
CREATE TABLE stuinfo (
id INT PRIMARY KEY, -- 主键
stuName VARCHAR(20) NOT NULL, -- 非空
gender CHAR(1) CHECK(gender IN ('男', '女')), -- 检查
seat INT UNIQUE, -- 唯一
age INT DEFAULT 18 -- 默认
);
表级约束(创建表时):
sql
CREATE TABLE stuinfo (
id INT,
stuName VARCHAR(20),
gender CHAR(1),
seat INT,
age INT,
majorid INT,
CONSTRAINT pk PRIMARY KEY(id),
CONSTRAINT uq UNIQUE(seat),
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);
三、TCL(事务控制语言)
事务控制语言(Transaction Control Language)用于管理数据库中的事务,确保数据的一致性和完整性。
1. 事务的基本概念
事务(Transaction)是一组逻辑操作单元,要么全部成功,要么全部失败。事务具备 ACID 四大特性:
| 特性 | 说明 |
|---|---|
| 原子性(Atomicity) | 事务中的所有操作要么全部完成,要么全部不完成 |
| 一致性(Consistency) | 事务执行前后,数据始终保持一致状态 |
| 隔离性(Isolation) | 多个事务并发执行时,互不干扰 |
| 持久性(Durability) | 事务一旦提交,对数据的修改就是永久性的 |
2. 事务的开启与提交
sql
-- 关闭自动提交(默认开启)
SET autocommit = 0;
-- 开启事务
START TRANSACTION;
-- 执行 SQL 操作
UPDATE account SET balance = balance - 1000 WHERE id = 1;
UPDATE account SET balance = balance + 1000 WHERE id = 2;
-- 提交事务(永久保存)
COMMIT;
3. 事务的回滚
sql
SET autocommit = 0;
START TRANSACTION;
UPDATE account SET balance = balance - 1000 WHERE id = 1;
-- 发现错误,回滚事务(撤销所有未提交的修改)
ROLLBACK;
4. 保存点(SAVEPOINT)
sql
SET autocommit = 0;
START TRANSACTION;
UPDATE account SET balance = balance - 1000 WHERE id = 1;
SAVEPOINT sp1; -- 设置保存点
UPDATE account SET balance = balance - 500 WHERE id = 2;
-- 回滚到保存点 sp1(仅撤销保存点之后的修改)
ROLLBACK TO sp1;
COMMIT;
5. 事务的隔离级别
MySQL 支持四种事务隔离级别:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | ✅ 可能 | ✅ 可能 | ✅ 可能 |
| READ COMMITTED | ❌ 避免 | ✅ 可能 | ✅ 可能 |
| REPEATABLE READ(默认) | ❌ 避免 | ❌ 避免 | ✅ 可能 |
| SERIALIZABLE | ❌ 避免 | ❌ 避免 | ❌ 避免 |
sql
-- 查看当前隔离级别
SELECT @@transaction_isolation;
-- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
四、三大语言对比总结
| 对比项 | DML | DDL | TCL |
|---|---|---|---|
| 全称 | Data Manipulation Language | Data Definition Language | Transaction Control Language |
| 作用 | 操作数据(增删改) | 定义结构(库、表) | 管理事务 |
| 核心命令 | INSERT、UPDATE、DELETE | CREATE、ALTER、DROP | COMMIT、ROLLBACK、SAVEPOINT |
| 是否自动提交 | 是(默认) | 是(隐式提交) | 需手动控制 |
| 可否回滚 | 配合 TCL 可回滚 | 不可回滚 | 核心就是回滚与提交 |
五、实战建议与注意事项
- UPDATE 和 DELETE 务必带 WHERE 条件,否则会操作全表数据,造成不可挽回的损失。
- TRUNCATE 与 DELETE 的区别:TRUNCATE 不可回滚且重置自增长列,DELETE 可回滚且保留自增长断点。
- DDL 操作隐式提交事务,执行后无法通过 ROLLBACK 撤销,操作前请做好备份。
- 金额字段推荐使用 DECIMAL,避免 FLOAT/DOUBLE 的精度丢失问题。
- 生产环境建议开启事务,将多条关联的 DML 操作放入同一事务中,保证数据一致性。
- 合理使用约束,在数据库层面保证数据的合法性与完整性,而不是完全依赖应用层校验。
总结
本文系统讲解了 MySQL 的三大核心语言:DML 负责数据的增删改,DDL 负责库表结构的定义与管理,TCL 负责事务的控制与数据一致性保障。掌握这三类语言是使用 MySQL 的基础,也是进阶优化与架构设计的前提。建议读者结合实际业务场景多加练习,逐步形成自己的数据库操作规范。