MySQL:DML、DDL与TCL精讲

前言

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 可回滚 不可回滚 核心就是回滚与提交

五、实战建议与注意事项

  1. UPDATE 和 DELETE 务必带 WHERE 条件,否则会操作全表数据,造成不可挽回的损失。
  2. TRUNCATE 与 DELETE 的区别:TRUNCATE 不可回滚且重置自增长列,DELETE 可回滚且保留自增长断点。
  3. DDL 操作隐式提交事务,执行后无法通过 ROLLBACK 撤销,操作前请做好备份。
  4. 金额字段推荐使用 DECIMAL,避免 FLOAT/DOUBLE 的精度丢失问题。
  5. 生产环境建议开启事务,将多条关联的 DML 操作放入同一事务中,保证数据一致性。
  6. 合理使用约束,在数据库层面保证数据的合法性与完整性,而不是完全依赖应用层校验。

总结

本文系统讲解了 MySQL 的三大核心语言:DML 负责数据的增删改,DDL 负责库表结构的定义与管理,TCL 负责事务的控制与数据一致性保障。掌握这三类语言是使用 MySQL 的基础,也是进阶优化与架构设计的前提。建议读者结合实际业务场景多加练习,逐步形成自己的数据库操作规范。

相关推荐
风哥2号1 小时前
数据库教程FGMT04‑生产环境Linux+Oracle19c RAC集群安装配置与项目实战
linux·数据库
Java开发追求者1 小时前
navicat连接新的数据库提示Oracle library is not loaded.
数据库·oracle·oracle11g·oracle library·is not loaded
砚底藏山河1 小时前
存储选型实战:CSV-SQLite-MySQL同机基准(魔码量化实战 #02)
java·数据库·python·金融·maven
huaweichenai1 小时前
spring boot 打包并部署到线上服务
java·数据库·spring boot
明志数科1 小时前
具身智能数据工程观察:从集中式数采工厂到真实场景采集,数据供给路线正在转向
大数据·数据库·人工智能
天行健,君子而铎1 小时前
数据分类分级的范式转换:从规则匹配到模型持续优化规模化前瞻算法
大数据·网络·数据库·安全·分类
云雀衔光1 小时前
多个 MCP Server 怎么编排:数据库 / Redis / Git / 飞书一把梭
java·数据库·人工智能·redis·git·语言模型·飞书
bksczm2 小时前
MySQL基础之数据类型
数据库·mysql
涛思数据(TDengine)2 小时前
存储成本降低80%,Zendure用TDengine支撑117万台设备的能源数据分析
大数据·数据库·人工智能·数据分析·时序数据库·tdengine·工业