MySQL 增删改查(CRUD)语法详解

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 条件,并在关键操作前做好数据备份。

相关推荐
Dovis(誓平步青云)1 小时前
几个方案来回选不定?做一个随时切换的候选推荐页
android·java·服务器·开发语言·javascript·数据库·智能化
2501_933670792 小时前
2027届大数据管理与应用求职数字化转型顾问:项目、SQL、业务理解怎么排优先级
数据库·sql
东方护航数据恢复(深圳)2 小时前
物流案例:勒索病毒 Mallox 加密 ERP 数据库,旧备份 + 残留页重组实录【东方护航数据恢复深圳店】
数据库·数据恢复·勒索病毒·二次开盘·开盘·数据镜像
.Hypocritical.3 小时前
Redis从入门到实战:核心原理、场景落地与避坑指南
数据库·redis·缓存
梦想画家3 小时前
SQLMesh Python 模型入门(二):依赖管理、引擎实战与内存优化
数据库·python·sqlmesh
Omics Pro3 小时前
经典多组学整合算法→商用云平台
数据库·人工智能·算法·机器学习·自然语言处理
xcLeigh3 小时前
【KingbaseES数据库教程】国产化信创背景下的数据库选型与初识
linux·数据库·windows·kes·数据选型
rm -rf * && haha.sh3 小时前
【Linux】Rocky 9.8 操作系统磁盘分区与MySQL数据目录迁移
linux·运维·mysql
资深技术分享员4 小时前
Geejing WebBuilder 数据库连接配置与在线 SQL 工具,运维的左右手
运维·数据库·sql·低代码