1. 引言
增删改查(CRUD)是数据库操作中最基础、最核心的四个动作,分别对应 SQL 中的 INSERT (新增)、SELECT (查询)、UPDATE (修改)和 DELETE(删除)。本文将从语法结构、常用写法、注意事项和实战示例四个维度,系统讲解 MySQL 中增删改查的完整用法。
2. 准备工作
在开始讲解之前,先创建一个示例表,后续所有示例都基于这张表展开。
sql
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
name VARCHAR(50) NOT NULL COMMENT '姓名',
age INT COMMENT '年龄',
class_name VARCHAR(50) COMMENT '班级',
score DECIMAL(5,2) COMMENT '成绩',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 新增数据(INSERT)
3.1 基本语法
sql
INSERT INTO 表名 (列1, 列2, ...) VALUES (值1, 值2, ...);
3.2 常用写法
写法一:指定列插入,只给部分列赋值,未指定的列使用默认值。
sql
INSERT INTO student (name, age, class_name, score)
VALUES ('张三', 18, '高三(1)班', 92.5);
写法二:省略列名,此时必须按表结构顺序给所有列赋值。
sql
INSERT INTO student VALUES (NULL, '李四', 19, '高三(2)班', 88.0, NOW());
写法三:一次插入多行,用逗号分隔多组值,减少 SQL 执行次数。
sql
INSERT INTO student (name, age, class_name, score) VALUES
('王五', 17, '高三(3)班', 95.0),
('赵六', 18, '高三(1)班', 87.5),
('孙七', 19, '高三(2)班', 90.0);
写法四:INSERT ... SET,可读性更强,适合字段较少的场景。
sql
INSERT INTO student SET name = '周八', age = 18, class_name = '高三(4)班', score = 89.0;
3.3 注意事项
- 字符串和日期类型必须加单引号,数字类型不需要。
- 自增主键(AUTO_INCREMENT)可以传 NULL 或省略,由数据库自动生成。
- 插入的数据必须满足字段约束,如 NOT NULL 字段不能为空。
- 使用
INSERT IGNORE可忽略因主键或唯一索引冲突导致的错误。 - 使用
ON DUPLICATE KEY UPDATE可在冲突时改为更新操作。
4. 查询数据(SELECT)
4.1 基本语法
sql
SELECT 列1, 列2, ... FROM 表名 [WHERE 条件] [ORDER BY 排序] [LIMIT 限制];
4.2 常用写法
查询全部列,使用星号通配符。
sql
SELECT * FROM student;
查询指定列,只返回需要的字段,减少数据传输量。
sql
SELECT name, age, score FROM student;
带条件查询,使用 WHERE 过滤记录。
sql
SELECT name, score FROM student WHERE score >= 90;
多条件组合,使用 AND、OR、NOT 连接多个条件。
sql
SELECT * FROM student
WHERE class_name = '高三(1)班' AND age >= 18;
模糊查询 ,使用 LIKE 配合通配符 %(任意多个字符)和 _(单个字符)。
sql
SELECT * FROM student WHERE name LIKE '张%';
范围查询,使用 BETWEEN ... AND 或 IN。
sql
SELECT * FROM student WHERE score BETWEEN 85 AND 95;
SELECT * FROM student WHERE class_name IN ('高三(1)班', '高三(2)班');
排序,使用 ORDER BY 指定排序字段和方向。
sql
SELECT * FROM student ORDER BY score DESC; -- 成绩从高到低
SELECT * FROM student ORDER BY class_name ASC, score DESC; -- 多字段排序
分页查询,使用 LIMIT 限制返回行数,offset 表示跳过多少行。
sql
SELECT * FROM student LIMIT 5; -- 返回前 5 行
SELECT * FROM student LIMIT 5, 10; -- 跳过 5 行,返回 10 行(第 6 到第 15 行)
去重查询,使用 DISTINCT 去除重复值。
sql
SELECT DISTINCT class_name FROM student;
聚合查询,配合 COUNT、SUM、AVG、MAX、MIN 使用。
sql
SELECT COUNT(*) AS total_count FROM student;
SELECT AVG(score) AS avg_score, MAX(score) AS max_score FROM student;
分组查询,使用 GROUP BY 按字段分组,常与聚合函数配合。
sql
SELECT class_name, COUNT(*) AS cnt, AVG(score) AS avg_score
FROM student
GROUP BY class_name
HAVING AVG(score) >= 88;
4.3 注意事项
- WHERE 用于分组前过滤,HAVING 用于分组后过滤。
- LIKE 模糊查询以
%开头时无法利用索引,数据量大时性能较差。 - ORDER BY 默认升序(ASC),降序需显式指定 DESC。
- LIMIT 的 offset 从 0 开始计数。
5. 修改数据(UPDATE)
5.1 基本语法
sql
UPDATE 表名 SET 列1 = 值1, 列2 = 值2, ... [WHERE 条件];
5.2 常用写法
修改单条记录,通过主键精确定位。
sql
UPDATE student SET score = 96.0 WHERE id = 1;
批量修改,通过条件匹配多条记录。
sql
UPDATE student SET class_name = '高三(1)班' WHERE age = 18;
同时修改多个字段,用逗号分隔多个赋值。
sql
UPDATE student SET age = 19, score = 91.0 WHERE name = '张三';
基于原值更新,在原有值基础上做运算。
sql
UPDATE student SET score = score + 2 WHERE class_name = '高三(3)班';
5.3 注意事项
- 务必带 WHERE 条件,否则会更新表中所有记录,这是最常见的误操作。
- UPDATE 语句执行后,可通过
ROW_COUNT()获取受影响的行数。 - 更新操作会触发数据库的行锁,大批量更新时注意锁等待和事务控制。
- 建议在事务中执行 UPDATE,配合 COMMIT 和 ROLLBACK 保证数据安全。
6. 删除数据(DELETE)
6.1 基本语法
sql
DELETE FROM 表名 [WHERE 条件];
6.2 常用写法
删除单条记录,按主键删除。
sql
DELETE FROM student WHERE id = 1;
按条件批量删除。
sql
DELETE FROM student WHERE score < 60;
清空整张表,删除所有记录。
sql
DELETE FROM student;
使用 TRUNCATE 清空表,速度更快,但无法回滚,且会重置自增主键。
sql
TRUNCATE TABLE student;
6.3 DELETE 与 TRUNCATE 的区别
| 对比项 | DELETE | TRUNCATE |
|---|---|---|
| 是否可加 WHERE | 可以,按条件删除 | 不可以,只能全表清空 |
| 是否可回滚 | 在事务内可回滚 | 不可回滚 |
| 执行速度 | 较慢,逐行删除 | 很快,直接释放数据页 |
| 自增主键 | 保留当前计数 | 重置为初始值 |
| 触发器 | 会触发 DELETE 触发器 | 不会触发 |
6.4 注意事项
- 务必带 WHERE 条件,否则会清空整张表。
- 删除操作不可逆,建议先 SELECT 确认要删除的数据范围。
- 生产环境删除数据前,建议先备份或使用软删除(增加 is_deleted 字段)。
7. 综合实战示例
下面用一个完整的业务场景串联四个操作:新增学生、查询成绩、修改分数、删除不合格记录。
sql
-- 1. 新增三名学生
INSERT INTO student (name, age, class_name, score) VALUES
('张三', 18, '高三(1)班', 92.5),
('李四', 19, '高三(2)班', 88.0),
('王五', 17, '高三(3)班', 95.0);
-- 2. 查询所有成绩大于等于 90 的学生
SELECT name, class_name, score FROM student WHERE score >= 90;
-- 3. 将张三的成绩加 2 分
UPDATE student SET score = score + 2 WHERE name = '张三';
-- 4. 删除成绩低于 60 的学生
DELETE FROM student WHERE score < 60;
-- 5. 查看最终结果
SELECT * FROM student ORDER BY score DESC;
8. 总结
MySQL 的增删改查是数据库操作的基石,掌握好这四类语句的语法和细节,是后续学习复杂查询、事务、索引优化和存储过程的前提。日常开发中要特别注意:INSERT 注意字段约束,SELECT 注意查询效率,UPDATE 和 DELETE 务必带 WHERE 条件,并在关键操作前做好数据备份。