当前位置: 代码网 > it编程>数据库>Mysql > MySQL CRUD 查询、插入、更新、删除全实战指南

MySQL CRUD 查询、插入、更新、删除全实战指南

2026年03月18日 Mysql 我要评论
前言:在 mysql 日常开发中,crud(create/retrieve/update/delete)是最核心的高频操作。掌握规范的 crud 语法、灵活的查询技巧和避坑要点,能大幅提升开发效率和

前言:

在 mysql 日常开发中,crud(create/retrieve/update/delete)是最核心的高频操作。掌握规范的 crud 语法、灵活的查询技巧和避坑要点,能大幅提升开发效率和 sql 可读性。本文基于实战场景,全面拆解 mysql 的增删改查操作,所有 sql 语句均采用小写形式,贴合实际开发规范,同时涵盖聚合查询、分组统计等进阶内容。

一. 基础准备:创建测试表与测试数据

为了让所有示例更直观,先创建两张测试表并插入测试数据,后续操作均基于这两张表:

  • 语法
insert [into] table_name
	[(column [, column] ...)]
	values (value_list) [, (value_list)] ...
value_list: value, [, value] ...

1.1 学生表(students)

create table students (
  id int unsigned primary key auto_increment,
  sn int not null unique comment '学号',
  name varchar(20) not null,
  qq varchar(20)
);
-- 插入测试数据
insert into students values 
(100, 10000, '唐三藏', null),
(101, 10001, '孙悟空', '11111'),
(102, 20001, '曹孟德', null),
(103, 20002, '孙仲谋', null);

1.2 考试成绩表(exam_result)

create table exam_result (
  id int unsigned primary key auto_increment,
  name varchar(20) not null comment '同学姓名',
  chinese float default 0.0 comment '语文成绩',
  math float default 0.0 comment '数学成绩',
  english float default 0.0 comment '英语成绩'
);
-- 插入测试数据
insert into exam_result (name, chinese, math, english) values 
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);

二. create(插入数据)

插入数据核心是insert语句,支持单行 / 多行插入、指定列插入、冲突处理等场景。

2.1 单行全列插入

插入数据需与表结构的列数和顺序完全一致(自增主键可省略,自动生成):

-- 全列插入(指定id)
insert into students values (104, 20003, '鲁智深', '22222');
-- 省略自增主键(自动生成id)
insert into students (sn, name, qq) values (20004, '林冲', '33333');

2.2 多行指定列插入

一次插入多条数据,仅指定需要赋值的列,未指定列使用默认值或null

insert into students (sn, name) values 
(20005, '武松'),
(20006, '杨志');

2.3 插入冲突处理(on duplicate key update)

当主键或唯一键冲突时,不报错而是执行更新操作:

-- 主键冲突(id=100已存在),执行更新
insert into students (id, sn, name) values (100, 10010, '唐大师')
on duplicate key update sn = 10010, name = '唐大师'; // 同步更新语法
-- 唯一键冲突(sn=20001已存在),执行更新
insert into students (sn, name) values (20001, '曹阿瞒')
on duplicate key update name = '曹阿瞒';

2.4 替换插入(replace into)

主键或唯一键冲突时,删除原记录后重新插入:

-- sn=20002已存在,删除原记录后插入新数据
replace into students (sn, name) values (20002, '孙伯符');

2.5 插入查询结果

将一张表的查询结果插入另一张表(常用于数据迁移、去重):

-- 创建空表(结构与students一致)
create table students_copy like students;
-- 将students的去重数据插入新表
insert into students_copy select distinct * from students;

三. retrieve(查询数据)

查询是 crud 中最复杂的操作,支持全列查询、条件查询、排序、分页、聚合等功能,核心语法:

select 
  [distinct] {* | column [, column] ...}
from table_name
[where ...]
[order by column [asc | desc], ...]
limit ...

3.1 基础查询

3.1.1 全列查询(不推荐)

-- 全列查询(数据量大时性能差,不建议在生产环境使用)
-- 1. 查询的列越多,意味着需要传输的数据量越大
-- 2. 可能会影响到索引的使用。(索引待后面我们再进行理解)
select * from exam_result;

3.1.2 指定列查询

按需查询列,顺序可与表结构不一致:

-- 查询姓名、语文、数学成绩
select name, chinese, math from exam_result;

3.1.3 查询表达式

支持常量、单字段运算、多字段运算:

-- 常量表达式
select id, name, 10 from exam_result;
-- 单字段运算(英语成绩+10)
select id, name, english + 10 from exam_result;
-- 多字段运算(总分)
select id, name, chinese + math + english from exam_result;

3.1.4 结果别名(as 可省略)

给查询结果列指定别名,增强可读性:

select 
  id, 
  name, 
  chinese + math + english as 总分 
from exam_result;

3.1.5 结果去重(distinct)

去除查询结果中的重复记录:

-- 去重查询数学成绩 distinct
select distinct math from exam_result;

3.2 条件查询(where)

通过比较运算符和逻辑运算符筛选数据,支持多种条件组合。

3.2.1 比较运算符

以下是您提供的运算符说明表格:

运算符说明
>, >=, <, <=大于、大于等于、小于、小于等于
=等于(null 不安全,null = null 结果为 null)
<=>等于(null 安全,null <=> null 结果为 1)
!=, <>不等于
between a and b范围匹配([a, b])
in (option...)匹配选项中的任意一个
is null为空
is not null不为空
like模糊匹配(% 匹配任意字符,_ 匹配单个字符)

3.2.2 逻辑运算符

运算符说明
and多个条件同时成立
or任意一个条件成立
not条件取反

3.2.3 条件查询示例

-- 1. 英语不及格(<60)
select name, english from exam_result where english < 60;
-- 2. 语文成绩在[80, 90]之间(between...and)
select name, chinese from exam_result where chinese between 80 and 90;
-- 3. 数学成绩是58、59、98、99中的一个(in)
select name, math from exam_result where math in (58, 59, 98, 99);
-- 4. 姓孙的同学(like %)
select name from exam_result where name like '孙%';
-- 5. 姓名是两个字且姓孙(like _)
select name from exam_result where name like '孙_';
-- 6. 语文成绩好于英语成绩
select name, chinese, english from exam_result where chinese > english;
-- 7. 总分低于200分(表达式作为条件)
select name, chinese + math + english as 总分 
from exam_result 
where chinese + math + english < 200; // 不能直接用总分 < 20,因为执行这里的时候还没执行前面的部分
-- 8. 语文>80且不姓孙(and + not)
select name, chinese from exam_result where chinese > 80 and name not like '孙%';
-- 9. qq号不为空(is not null)
select name, qq from students where qq is not null;
-- 10. null安全比较(<=>)
select name, qq from students where qq <=> null;

3.3 结果排序(order by)

默认升序(asc),可指定降序(desc),支持多字段排序。

-- 1. 按数学成绩升序
select name, math from exam_result order by math;
-- 2. 按数学降序,英语升序,语文升序
select name, math, english, chinese 
from exam_result 
order by math desc, english, chinese;
-- 3. 按总分降序(表达式排序)
select name, chinese + math + english as 总分 
from exam_result 
order by 总分 desc;
-- 4. null排序(null视为最小值,升序在最前)
select name, qq from students order by qq;
select name, qq from students order by qq desc;

3.4 分页查询(limit)

限制查询结果数量,避免数据量过大导致性能问题,起始下标从 0 开始。

-- 语法1:limit 条数(取前n条)
select * from exam_result order by id limit 3;
-- 语法2:limit 起始下标, 条数(从s(下标从0开始)开始取n条)
select * from exam_result order by id limit 3, 3;
-- 语法3:limit 条数 offset 起始下标(推荐,更清晰)
select * from exam_result order by id limit 3 offset 6;
-- 分页示例:每页3条,第1-3页
select * from exam_result order by id limit 3 offset 0; -- 第1页
select * from exam_result order by id limit 3 offset 3; -- 第2页
select * from exam_result order by id limit 3 offset 6; -- 第3页

3.5 聚合查询(聚合函数)

对查询结果进行统计计算,常用聚合函数如下:

函数说明
count([distinct] expr)统计记录数(distinct 去重)
sum([distinct] expr)求和(仅数字类型)
avg([distinct] expr)求平均值(仅数字类型)
max([distinct] expr)求最大值(仅数字类型)
min([distinct] expr)求最小值(仅数字类型)

聚合查询示例:

-- 1. 统计学生总数(count(*)不受null影响)
select count(*) as 学生总数 from students;
-- 2. 统计qq号非空的学生数(null不计入)
select count(qq) as qq已收集人数 from students;
-- 3. 统计数学成绩总分和去重后总分
select sum(math) as 数学总分, sum(distinct math) as 去重数学总分 from exam_result;
-- 4. 统计语文成绩平均分
select avg(chinese) as 语文平均分 from exam_result;
-- 5. 英语最高分和最低分
select max(english) as 英语最高分, min(english) as 英语最低分 from exam_result;
-- 6. 统计70分以上的数学最低分
select min(math) as 70+数学最低分 from exam_result where math > 70;

3.6 分组查询(group by + having)

group by按指定列分组,having筛选分组结果(类似where,但作用于分组)。

-- 准备雇员表(经典测试表)
create table emp (
  empno int primary key,
  ename varchar(20),
  job varchar(20),
  deptno int,
  sal float
);
insert into emp values
(7369, 'smith', 'clerk', 20, 800),
(7499, 'allen', 'salesman', 30, 1600),
(7521, 'ward', 'salesman', 30, 1250),
(7566, 'jones', 'manager', 20, 2975),
(7654, 'martin', 'salesman', 30, 1250),
(7698, 'blake', 'manager', 30, 2850),
(7782, 'clark', 'manager', 10, 2450),
(7788, 'scott', 'analyst', 20, 3000);
-- 1. 按部门分组,统计每个部门的平均工资和最高工资
select deptno, avg(sal) as 平均工资, max(sal) as 最高工资 from emp group by deptno;
-- 2. 按部门和岗位分组,统计平均工资和最低工资
select deptno, job, avg(sal) as 平均工资, min(sal) as 最低工资 from emp group by deptno, job;
-- 3. 筛选平均工资低于2000的部门(having筛选分组结果)
select deptno, avg(sal) as 平均工资 from emp group by deptno having avg(sal) < 2000;

四. update(更新数据)

修改表中已有数据,支持单字段、多字段更新,结合whereorder bylimit精准控制更新范围。

  • 语法
update table_name set column = expr [, column = expr ...]
[where ...] [order by ...] [limit ...]
-- 1. 更新单字段(孙悟空数学成绩改为80)
update exam_result set math = 80 where name = '孙悟空';
-- 2. 更新多字段(曹孟德数学60、语文70)
update exam_result set math = 60, chinese = 70 where name = '曹孟德';
-- 3. 按表达式更新(所有同学语文成绩翻倍)
update exam_result set chinese = chinese * 2;
-- 4. 结合排序和limit(总分倒数前三的同学数学+30)
update exam_result 
set math = math + 30 
order by chinese + math + english 
limit 3;
-- 5. 条件更新(英语<60的同学英语+10)
update exam_result set english = english + 10 where english < 60;
  • 警告:无where子句会更新全表数据,生产环境需谨慎

五. delete(删除数据)

删除表中数据,支持条件删除、全表删除,还有高效的truncate截断表。

5.1 条件删除

-- 1. 删除孙悟空的考试成绩
delete from exam_result where name = '孙悟空';
-- 2. 删除英语<60的同学成绩
delete from exam_result where english < 60;

5.2 全表删除(delete)

-- 删除for_delete表所有数据(自增id不重置)
create table for_delete (
  id int primary key auto_increment,
  name varchar(20)
);
insert into for_delete (name) values ('a'), ('b'), ('c');
delete from for_delete;
-- 插入新数据,自增id从4开始
insert into for_delete (name) values ('d');
select * from for_delete; -- id=4

5.3 截断表(truncate)

快速删除全表数据,重置自增 id,比delete更高效(不记录事务):

-- 截断表(自增id重置为1)
create table for_truncate (
  id int primary key auto_increment,
  name varchar(20)
);
insert into for_truncate (name) values ('a'), ('b'), ('c');
truncate for_truncate;
-- 插入新数据,自增id从1开始
insert into for_truncate (name) values ('d');
select * from for_truncate; -- id=1
  • 区别delete是逐行删除(可回滚),truncate直接重置表(不可回滚),效率更高。

六. sql 执行顺序与避坑指南

6.1 sql 关键字执行顺序

from → on → join → where → group by → with → having → select → distinct → order by → limit
  • 别名不能在where中使用(selectwhere之后执行);
  • having用于筛选分组结果(group by之后执行),where用于筛选行数据(group by之前执行)。

6.2 避坑要点和总结

  • 避免全列查询:仅查询需要的列,减少数据传输和内存占用;
  • null判断用is null/is not null=!=null无效;
  • 更新 / 删除必加where:防止误操作全表数据;
  • 分页查询必加order by:避免分页结果混乱;
  • 聚合函数忽略nullcount(qq)不计入qqnull的记录;
  • truncate不可回滚:删除全表数据优先考虑delete(需回滚)或truncate(高效)。

总结: mysql crud 是数据库开发的基础,核心要点:

  • 插入数据支持单行 / 多行、冲突处理、查询结果插入;
  • 查询是核心,灵活组合whereorder bylimit、聚合函数、分组查询满足复杂需求;
  • 更新 / 删除需精准控制范围,避免全表操作;
  • 遵循 sql 执行顺序,避开null判断、别名使用等常见坑。

到此这篇关于mysql crud 查询、插入、更新、删除全实战指南的文章就介绍到这了,更多相关mysql crud 查询 插入更新删除内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com