MySQL增删改查(CRUD)操作详解与实战指南

目录

一、引言

二、CRUD基础操作

[1. 数据插入(Create)](#1. 数据插入(Create))

全列插入与指定列插入

冲突处理:插入否则更新

替换操作

[2. 数据查询(Retrieve)](#2. 数据查询(Retrieve))

基础查询

条件筛选(WHERE)

排序与分页

[3. 数据更新(Update)](#3. 数据更新(Update))

[4. 数据删除(Delete)](#4. 数据删除(Delete))

三、聚合函数与分组查询

[1. 常用聚合函数](#1. 常用聚合函数)

示例

[2. 分组查询(GROUP BY)](#2. 分组查询(GROUP BY))

四、实战应用场景

[1. 去重与数据迁移](#1. 去重与数据迁移)

[2. 分页查询优化](#2. 分页查询优化)

[3. 处理复杂条件](#3. 处理复杂条件)

五、面试重点:SQL执行顺序

六、总结与最佳实践


一、引言

MySQL作为最流行的关系型数据库之一,其核心操作CRUD(Create, Retrieve, Update, Delete)是每个开发者必须掌握的基础技能。本文将系统性地讲解MySQL的增删改查操作,涵盖基础语法、高级技巧和实战案例,帮助读者构建完整的知识体系。

二、CRUD基础操作

1. 数据插入(Create)

全列插入与指定列插入
sql 复制代码
-- 全列插入(需按表结构顺序填写所有字段)
INSERT INTO students VALUES (100, 10000, '唐三藏', NULL);

-- 指定列插入(可省略自增主键或允许为NULL的字段)
INSERT INTO students (sn, name) VALUES (20001, '曹孟德');
冲突处理:插入否则更新

当主键或唯一键冲突时,使用 ON DUPLICATE KEY UPDATE 同步更新数据:

sql 复制代码
INSERT INTO students (id, sn, name) VALUES (100, 10010, '唐大师')
ON DUPLICATE KEY UPDATE sn = 10010, name = '唐大师';
替换操作

REPLACE 在冲突时先删除再插入:

sql 复制代码
REPLACE INTO students (sn, name) VALUES (20001, '曹阿晴');

2. 数据查询(Retrieve)

基础查询
sql 复制代码
-- 全列查询(谨慎使用,可能影响性能)
SELECT * FROM exam_result;

-- 指定列查询
SELECT name, math FROM exam_result;

-- 别名与表达式
SELECT name, chinese + math + english AS 总分 FROM exam_result;
条件筛选(WHERE)
sql 复制代码
-- 比较运算符
SELECT name, english FROM exam_result WHERE english < 60;

-- 范围查询
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;

-- 模糊匹配
SELECT name FROM exam_result WHERE name LIKE '孙%';  -- 姓孙的同学
SELECT name FROM exam_result WHERE name LIKE '孙_';  -- 姓孙且名字为两字的同学
排序与分页
sql 复制代码
-- 按总分降序排列
SELECT name, chinese + math + english 总分 
FROM exam_result 
ORDER BY 总分 DESC;

-- 分页查询(每页3条,查看第2页)
SELECT id, name 
FROM exam_result 
ORDER BY id 
LIMIT 3 OFFSET 3;

3. 数据更新(Update)

sql 复制代码
-- 单字段更新
UPDATE exam_result SET math = 80 WHERE name = '孙悟空';

-- 多字段更新
UPDATE exam_result SET math = 60, chinese = 70 WHERE name = '曹孟德';

-- 表达式更新(为总分倒数前三的同学数学加30分)
UPDATE exam_result SET math = math + 30 
ORDER BY chinese + math + english 
LIMIT 3;

4. 数据删除(Delete)

sql 复制代码
-- 删除特定记录
DELETE FROM exam_result WHERE name = '孙悟空';

-- 清空表(自增ID保留)
DELETE FROM for_delete;

-- 截断表(自增ID重置)
TRUNCATE TABLE for_truncate;

三、聚合函数与分组查询

1. 常用聚合函数

函数 说明
COUNT() 统计行数
SUM() 求和
AVG() 求平均值
MAX() 最大值
MIN() 最小值
示例
sql 复制代码
-- 统计班级人数
SELECT COUNT(*) FROM students;

-- 统计数学成绩种类数
SELECT COUNT(DISTINCT math) FROM exam_result;

-- 计算平均总分
SELECT AVG(chinese + math + english) AS 平均总分 FROM exam_result;

2. 分组查询(GROUP BY)

sql 复制代码
-- 统计各部门的平均工资与最高工资
SELECT deptno, AVG(sal), MAX(sal) 
FROM emp 
GROUP BY deptno;

-- 过滤分组结果(HAVING)
SELECT deptno, AVG(sal) AS avg_sal 
FROM emp 
GROUP BY deptno 
HAVING avg_sal < 2000;

四、实战应用场景

1. 去重与数据迁移

sql 复制代码
-- 创建新表并插入去重数据
CREATE TABLE no_duplicate_table LIKE duplicate_table;
INSERT INTO no_duplicate_table SELECT DISTINCT * FROM duplicate_table;

-- 重命名表实现原子操作
RENAME TABLE duplicate_table TO old_duplicate_table,
no_duplicate_table TO duplicate_table;

2. 分页查询优化

sql 复制代码
-- 使用LIMIT和OFFSET实现分页
SELECT * FROM large_table 
ORDER BY id 
LIMIT 10 OFFSET 20;  -- 第3页,每页10条

3. 处理复杂条件

sql 复制代码
-- 查询姓孙或总成绩>200且语文<数学的同学
SELECT name, chinese, math, english 
FROM exam_result 
WHERE name LIKE '孙%' OR (chinese + math + english > 200 AND chinese < math);

五、面试重点:SQL执行顺序

SQL关键字执行顺序决定了查询逻辑的优先级:
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT


六、总结与最佳实践

  1. 避免全列查询 :使用 SELECT * 可能导致性能问题,明确指定所需字段。

  2. 谨慎更新/删除:操作前务必确认WHERE条件,可先通过SELECT验证。

  3. 索引优化:频繁查询的字段建议添加索引,但需权衡写入性能。

  4. 事务处理:批量操作时使用事务,确保数据一致性。

通过本文的学习,相信你已经掌握了MySQL的核心操作。建议结合实战题目(如LeetCode SQL题库)进一步巩固技能,提升解决复杂问题的能力。

相关推荐
我有医保我先冲1 小时前
SQL复杂查询与性能优化:医药行业ERP系统实战指南
数据库·sql·性能优化
快来卷java1 小时前
MySQL篇(一):慢查询定位及索引、B树相关知识详解
java·数据结构·b树·mysql·adb
阳光_你好2 小时前
详细说明Qt 中共享内存方法: QSharedMemory 对象
开发语言·数据库·qt
喝醉酒的小白2 小时前
MySQL响应慢是否由堵塞或死锁引起?
数据库
Pasregret3 小时前
04-深入解析 Spring 事务管理原理及源码
java·数据库·后端·spring·oracle
jnrjian3 小时前
归档重做日志archived log (明显) 比redo log重做日志文件小
数据库·oracle
TDengine (老段)3 小时前
TDengine 中的命名与边界
大数据·数据库·物联网·oracle·时序数据库·tdengine·iotdb
谁家有个大人4 小时前
MYSQL中对行与列的操作
数据库·mysql
0000ysl4 小时前
数据库基础-函数&约束
数据库
JavaPub-rodert4 小时前
Etcd用的是Raft算法
数据库·github·etcd·raft