MySQL CRUD 增删改查

MySQL CRUD 增删改查完整学习笔记

摘要:MySQL最核心的就是CRUD增删改查,是日常开发写SQL的基础。本文完整梳理新增、查询、修改、删除、聚合函数、分组、常用内置函数,附带大量可直接运行案例,适合入门复习。

一、什么是CRUD

CRUD代表数据库四条基础操作:

  • Create:新增数据
  • Retrieve:查询读取数据
  • Update:更新修改数据
  • Delete:删除数据

几乎所有业务开发,都离不开这四类操作,也是SQL入门必学内容。

二、Create 新增数据 insert

语法

sql 复制代码
INSERT INTO 表名 [(列1,列2...)] 
VALUES (值列表), (值列表)...;

三种插入方式

  1. 全列插入:值的顺序、数量必须和表定义完全一致
sql 复制代码
create table users (
    id bigint,
    name varchar(20) comment '用户名'
);
-- 全列插入
insert into users values (1, '张三');
  1. 指定列插入,只写需要插入的字段
sql 复制代码
insert into users(id, name) values (3, '王五');
  1. 一次性多行插入 ,写多组(),效率高于多次单条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.基础查询

  1. 全列查询 *代表所有列
sql 复制代码
select * from exam;

⚠️生产环境禁止随意select *,会读取全部字段,数据量大消耗大量服务器资源。

  1. 指定列查询,列顺序自己定义,和表结构无关
sql 复制代码
select id,name,chinese from exam;
  1. 查询字段为表达式,可以做计算
sql 复制代码
-- 所有学生总分
select id,name, chinese+math+english from exam;
  1. 查询别名 as,as可以省略,别名带空格需要单引号
sql 复制代码
select id,name, chinese+math+english as 总分 from exam;
  1. 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区别

  1. WHERE:过滤原始表数据,分组之前执行,不能用聚合函数;
  2. 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,'默认值');

九、开发踩坑总结

  1. update / delete一定要先select核对where条件,确认数据再执行;
  2. NULL不能用=判断,必须用IS NULL;NULL参与运算结果依旧NULL;
  3. WHERE不能使用select别名,ORDER BY、HAVING可以使用别名;
  4. AND优先级高于OR,复杂条件加括号;
  5. WHERE过滤原始数据,HAVING过滤分组后的结果;
  6. 生产环境尽量避免select *,不要不带条件执行update/delete;
  7. TRUNCATE清空表会重置自增主键,不能回滚,谨慎使用。

十、写在最后

CRUD是MySQL地基,后续多表联查、索引都是建立在这个基础之上。建议自己把文中示例在本地MySQL全部敲一遍,加深记忆。

相关推荐
一条闲鱼_mytube1 小时前
深入理解 Pinecone 向量数据库:从云服务到索引原理,一篇讲透
数据库
许彰午1 小时前
政务低代码平台实战⑤:双输出模式——存DB与导出JSP的完整链路
数据库·低代码·政务
南京码讯光电技术有限公司1 小时前
What Does Ex tb IIIC T80°C Db Mean?
服务器·网络·数据库
做萤石二次开发的哈哈2 小时前
萤石蓝海AIoT一站式工作台计费说明
网络·数据库·萤石开放平台·蓝海aiot一站式工作台
竹枝溪2 小时前
MySQL数据库零基础入门
数据库·sql·mysql·navicat·ddl·dml·dql
龙仔7253 小时前
人大金仓Kingbase V8 自动全量备份部署完整笔记
数据库·笔记·备份·人大金仓
王志来137944730083 小时前
从选型到交付,工控服务器机箱一站式采购平台匀天如何实现服务闭环?
数据库
ShuiShenHuoLe3 小时前
HmarkX(码笺)的本地数据库模块重构实战
数据库·oracle·重构
Databend3 小时前
从 Kafka 到 Databend Cloud:万亿级 Agent Trace 接入链路的工程实践
大数据·数据库·agent