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题库)进一步巩固技能,提升解决复杂问题的能力。

相关推荐
Elastic 中国社区官方博客2 小时前
在 Elasticsearch 中使用 Mistral Chat completions 进行上下文工程
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
编程爱好者熊浪4 小时前
两次连接池泄露的BUG
java·数据库
南宫乘风5 小时前
基于 Flask + APScheduler + MySQL 的自动报表系统设计
python·mysql·flask
TDengine (老段)5 小时前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq7422349845 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE6 小时前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy12393102166 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎6 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
杨云龙UP7 小时前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql
l1t7 小时前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb