MySQL CRUD 增删改查完整学习笔记
摘要:MySQL最核心的就是CRUD增删改查,是日常开发写SQL的基础。本文完整梳理新增、查询、修改、删除、聚合函数、分组、常用内置函数,附带大量可直接运行案例,适合入门复习。
一、什么是CRUD
CRUD代表数据库四条基础操作:
- Create:新增数据
- Retrieve:查询读取数据
- Update:更新修改数据
- Delete:删除数据
几乎所有业务开发,都离不开这四类操作,也是SQL入门必学内容。
二、Create 新增数据 insert
语法
sql
INSERT INTO 表名 [(列1,列2...)]
VALUES (值列表), (值列表)...;
三种插入方式
- 全列插入:值的顺序、数量必须和表定义完全一致
sql
create table users (
id bigint,
name varchar(20) comment '用户名'
);
-- 全列插入
insert into users values (1, '张三');
- 指定列插入,只写需要插入的字段
sql
insert into users(id, name) values (3, '王五');
- 一次性多行插入 ,写多组
(),效率高于多次单条insert
sql
insert into users(id, name) values (4, '赵六'), (5, '钱七');
💡小提示:生产环境优先使用指定列插入,表新增字段后不会导致SQL报错。
三、Retrieve 查询 select
完整SELECT语法
sql
SELECT [DISTINCT] 字段/表达式
FROM 表名
[WHERE 条件]
[GROUP BY 分组字段]
[HAVING 分组过滤]
[ORDER BY 排序字段 ASC|DESC]
[LIMIT 偏移,条数];
准备测试成绩表,下面示例全部基于这张表:
sql
CREATE TABLE exam (
id BIGINT,
name VARCHAR(20) COMMENT '同学姓名',
chinese float COMMENT '语文成绩',
math float COMMENT '数学成绩',
english float COMMENT '英语成绩'
);
INSERT INTO exam (id,name,chinese,math,english) VALUES
(1,'唐三藏',67,98,56),
(2,'孙悟空',87,78,77),
(3,'猪悟能',88,98,90),
(4,'曹孟德',82,84,67),
(5,'刘玄德',55,85,45),
(6,'孙权',70,73,78),
(7,'宋公明',75,65,30);
1.基础查询
- 全列查询
*代表所有列
sql
select * from exam;
⚠️生产环境禁止随意
select *,会读取全部字段,数据量大消耗大量服务器资源。
- 指定列查询,列顺序自己定义,和表结构无关
sql
select id,name,chinese from exam;
- 查询字段为表达式,可以做计算
sql
-- 所有学生总分
select id,name, chinese+math+english from exam;
- 查询别名 as,as可以省略,别名带空格需要单引号
sql
select id,name, chinese+math+english as 总分 from exam;
- DISTINCT去重:全部查询字段的值都相同才判定重复
sql
select distinct math from exam;
2.WHERE条件过滤
常用比较运算符
| 运算符 | 说明 |
|---|---|
> >= < <= |
大于大于等于小于小于等于 |
= |
等于,不能判断NULL NULL=NULL → NULL |
<=> |
安全等于,可以比较NULL |
!= / <> |
不等于 |
BETWEEN a AND b |
闭区间 a,b |
IN(值1,值2) |
匹配列表中任意一个值 |
IS NULL / IS NOT NULL |
判断空值 |
LIKE模糊匹配 |
%任意多字符,_单个字符 |
逻辑运算符:AND并且,OR或者,NOT取反
注意:AND优先级高于OR,复杂条件建议加括号;WHERE不能使用select设置的别名。
示例:
sql
--英语不及格
select name,english from exam where english <60;
--语文大于80并且英语大于80
select * from exam where chinese>80 and english>80;
--语文80~90之间
select name,chinese from exam where chinese between 80 and 90;
--数学是78或98
select name,math from exam where math in (78,98);
--模糊查询姓孙
select * from exam where name like '孙%';
--姓名两个字,姓孙
select * from exam where name like '孙_';
--英语成绩为null
select * from exam where english is null;
📌重要:
NULL和任何数值运算结果都为NULL,判断空值只能用IS NULL,不要用=NULL。
3.ORDER BY排序
ASC升序(从小到大,默认)DESC降序(从大到小)- 支持多字段排序;可以使用别名排序
- NULL排序视作比普通数值更小,升序排在最上方
sql
--数学降序
select name,math from exam order by math desc;
--多字段排序:数学降序,英语升序
select name,math,english from exam order by math desc, english asc;
--总分排序,使用别名
select name, chinese+math+english as 总分 from exam order by 总分 desc;
4.LIMIT分页查询
偏移下标从0开始。
sql
--从0开始拿3条
select * from exam order by id asc limit 0,3;
--推荐写法 limit 条数 offset 偏移
select * from exam order by id asc limit 3 offset 3;
四、Update 修改数据
语法
sql
UPDATE 表名
SET 列1=值1,列2=值2
[WHERE 条件]
[ORDER BY ...]
[LIMIT 行数];
示例:
sql
--修改孙悟空数学成绩
update exam set math=80 where name='孙悟空';
--同时修改多个字段
update exam set math=60, chinese=70 where name='曹孟德';
--字段基于原值修改
update exam set math = math +30 where id>3;
⚠️高危提醒:不加WHERE条件,更新整张表所有行,线上千万谨慎!
MySQL不支持
math +=30这种语法,只能写math = math + 30。
五、Delete 删除数据
语法
sql
DELETE FROM 表名 [WHERE 条件] [ORDER BY ...] [LIMIT ...];
示例:
sql
delete from exam where name='孙悟空';
⚠️不加WHERE条件会清空整张表,生产务必小心。
TRUNCATE 截断表
sql
TRUNCATE TABLE t_truncate;
- 只能清空整张表,不能按条件删除;
- 速度远快于delete;
- 重置自增主键AUTO_INCREMENT;
- 不走事务,无法回滚。
对比:
delete是逐行删除;truncate直接销毁重建表。
插入查询结果 insert ... select
把查询出来的结果直接插入另一张表,常用于去重、数据迁移。
sql
insert into t_recored_new select distinct * from t_recored;
六、聚合函数
聚合函数是对一组数据做统计,NULL值不会参与计算。
| 函数 | 作用 |
|---|---|
COUNT() |
统计行数 |
SUM() |
求和 |
AVG() |
求平均值 |
MAX() |
最大值 |
MIN() |
最小值 |
sql
--统计行数
select count(*) from exam;
--数学总分
select sum(math) from exam;
--英语平均分
select avg(english) from exam;
--数学最高分最低分
select max(math),min(math) from exam;
count(*)统计全部行;count(列名)统计该列不为NULL的行数。
七、GROUP BY分组查询 + HAVING
GROUP BY把数据按照字段分组,分组后配合聚合函数统计每组数据。
语法:
sql
SELECT 分组字段,聚合函数(...)
FROM 表
GROUP BY 分组字段
[HAVING 分组过滤条件];
示例员工表:
sql
create table emp (
id bigint primary key auto_increment,
name varchar(20) not null,
role varchar(20) not null,
salary decimal(10, 2) not null
);
insert into emp (name,role,salary) values
('马云','老板',1500000.00),
('马化腾','老板',1800000.00),
('鑫哥','讲师',10000.00),
('博哥','讲师',12000.00),
('平姐','学管',9000.00),
('莹姐','学管',8000.00);
统计每个角色人数、平均薪资:
sql
select role, count(*) as 人数, avg(salary) as 平均工资
from emp group by role;
WHERE 和 HAVING区别
- WHERE:过滤原始表数据,分组之前执行,不能用聚合函数;
- HAVING :过滤分组之后的结果,可以写聚合函数。
sql
--筛选分组后平均工资小于1500的角色
select role, avg(salary) from emp group by role having avg(salary) <1500;
八、MySQL常用内置函数
1.日期函数
| 函数 | 功能 |
|---|---|
CURDATE() |
获取当前日期 |
CURTIME() |
获取当前时间 |
NOW() |
日期+时间 |
DATE(datetime) |
提取日期部分 |
ADDDATE() |
日期加间隔 |
SUBDATE() |
日期减间隔 |
DATEDIFF(d1,d2) |
计算两个日期相差天数 |
sql
select now();
select DATEDIFF('2026-08-12','2026-01-01');
2.字符串函数
CHAR_LENGTH(str):字符个数;LENGTH(str)字节长度(和编码有关)CONCAT(a,b,c)拼接字符串;CONCAT_WS('分隔符',a,b,c)带分隔符拼接UCASE()大写,LCASE()小写SUBSTR(str,pos,len)截取子串REPLACE()字符串替换TRIM()去除首尾空格
sql
select concat(name,'总分:',chinese+math+english) from exam;
3.数学函数
ABS()绝对值CEIL()向上取整;FLOOR()向下取整ROUND(x,d)四舍五入保留d位小数RAND()生成0~1随机数
4.其他实用函数
version()数据库版本database()当前数据库名user()当前登录用户MD5(str)md5摘要IFNULL(val1,val2):val1为NULL返回val2,否则返回val1,处理空值非常常用
sql
select ifnull(null,'默认值');
九、开发踩坑总结
- 做
update / delete一定要先select核对where条件,确认数据再执行; - NULL不能用
=判断,必须用IS NULL;NULL参与运算结果依旧NULL; - WHERE不能使用select别名,ORDER BY、HAVING可以使用别名;
- AND优先级高于OR,复杂条件加括号;
- WHERE过滤原始数据,HAVING过滤分组后的结果;
- 生产环境尽量避免
select *,不要不带条件执行update/delete; TRUNCATE清空表会重置自增主键,不能回滚,谨慎使用。
十、写在最后
CRUD是MySQL地基,后续多表联查、索引都是建立在这个基础之上。建议自己把文中示例在本地MySQL全部敲一遍,加深记忆。