it编程 > 数据库 > Mysql

MySQL 增删改查操作与 SQL 执行顺序详解

3人参与 2025-10-24 Mysql

一、crud 核心操作

数据库中的 crud 指的是对表数据的增(create)、删(delete)、改(update)、查(select)四类基本操作。为了保证数据完整性和业务约束,表设计中常用 五大约束not nullauto_incrementuniqueprimary keyforeign key,是数据库操作的基础核心。

1.1 数据约束

为保证数据库中数据的完整性与一致性,存在 5 大约束:

1.2 删除数据

mysql 删除数据的几种方式有什么区别?

在 mysql 中,删除数据主要有三种方式:droptruncatedeletedrop 属于 ddl 操作,会直接删除整张表,包括表结构、数据、索引等所有对象,执行最快但无法回滚;truncate 也是 ddl,只清空表中所有数据,保留表结构,同时会重置自增主键,速度也很快,同样无法回滚;而 delete 是 dml 操作,逐行删除数据,可以通过 where 条件选择性删除,并且支持事务回滚,但速度相对较慢。

删除数据有 drop(ddl)、truncate(ddl)、delete(dml)三种方式,区别如下:

① drop (ddl)

② truncate (ddl)

③ delete (dml)

1.3 去重

去重用于获取表中不重复的数据,主要有以下两种方式:

① group by column

通过对指定进行分组,将相同值的行归为一组,从而实现去重效果。常与聚合函数(count, sum, avg 等)配合用于统计或去重。

示例(统计每个班级人数):

select class, count(*) as cnt
from student
group by class;

② select distinct column

示例(去重班级):列出学生表中所有不同的班级名称。

select distinct class from student;

1.4 查询条件与过滤

条件判断用于在数据库操作中根据特定条件筛选数据或执行操作,常见的有以下几种场景:

① from… where…

select * from student where age > 19;
delete from student where id = 3;
update student set age = age + 1 where class = '计算机1班';

② group by… having…

示例:筛选出平均年龄大于 20 的班级及其平均年龄

select class, avg(age) from student group by class having avg(age) > 20;

③ a join b on condition

select s.name, c.name
from student s
join course c on s.id = c.student_id
where s.age > 18;

假设课程表有 student_id 外键关联学生表 id,获取学生姓名和所选课程名称。

二、crud 操作示例

2.1 创建数据库

create database `mydb` default character set utf8;
use `mydb`;
drop database `mydb`;

2.2 创建表

创建表:使用 create table 语句创建表,可指定字段、类型、约束等。

例如创建学生表:

create table if not exists `student` (
   `id` int unsigned auto_increment comment '学号',
   `name` varchar(40) not null comment '姓名',
   `age` tinyint unsigned comment '年龄',
   `class` varchar(20) comment '班级',
   primary key (`id`)
)engine=innodb default charset=utf8 comment='学生表';

创建课程表:

create table if not exists `course` (
   `id` int unsigned auto_increment comment '课程id',
   `name` varchar(40) not null comment '课程名称',
   `teacher` varchar(20) not null comment '教师',
   `credit` tinyint unsigned comment '学分',
   primary key (`id`)
)engine=innodb default charset=utf8 comment='课程表';

2.3 增(create)

插入数据:使用 insert into 语句向表中插入数据

例如向学生表插入数据:

insert into `student` (`name`, `age`, `class`) values 
('张三', 20, '计算机1班'),
('李四', 19, '计算机2班'),
('王五', 21, '软件工程1班');

向课程表插入数据:

insert into `course` (`name`, `teacher`, `credit`) values 
('数据库原理', '张老师', 3),
('操作系统', '李老师', 4),
('计算机网络', '王老师', 3);

2.4 删(delete)

删除表与清空数据:使用 delete from 语句删除表中数据,可通过 where 子句设置条件,

例如:

delete from `student` where id = 3;           -- 删除id为3的学生
delete from `student` where name = '李四';    -- 删除姓名为李四的学生
delete from `student` where age > 20;         -- 删除年龄大于20的学生

清空数据表

示例:

drop table `student`;           -- 删除表结构与数据
truncate table `student`;       -- 清空数据(重置自增)
delete from `student`;          -- 逐行删除(可加 where)

2.5 改(update)

更新数据:使用 update 语句更新表中数据,通过 set 子句设置新值,where 子句设置条件

例如:

update `student` set `age` = 22 where id = 1;           -- 更新年龄
update `student` set `class` = '计算机3班' where id = 2; -- 更新班级
update `student` set `age` = `age` + 1;                 -- 所有学生年龄加1

2.6 查(read)

查询数据:使用 select 语句查询表中数据,可进行简单查询、条件查询、排序查询、统计查询等

例如:

select * from `student`;                              -- 查询所有学生
select `name`, `age` from `student`;                  -- 查询指定列
select * from `student` where age > 19;               -- 条件查询
select * from `student` where class like '计算机%';    -- 模糊查询
select * from `student` order by age desc;            -- 排序查询
select count(*) as total from `student`;              -- 统计数量

三、sql 执行顺序

写 sql 是按如下顺序:

select ... from ... where ... group by ... having ... order by ... limit ...

但实际执行顺序并不是这样!
数据库在执行 sql 时,是按照逻辑执行步骤从底层一层层向上处理的:

执行阶段关键字说明
from首先确定要从哪张表获取数据,生成笛卡尔积。
on如果涉及多表连接(join),在这一阶段根据连接条件过滤行。
join执行连接操作,合并结果集。
where过滤不符合条件的记录,只保留满足条件的数据。此阶段不能使用聚合函数。
group by对筛选后的数据进行分组,为聚合计算(如 count、sum 等)准备。
having对分组结果再进行条件过滤,这时可以使用聚合函数。
select确定要查询哪些列或表达式,执行投影操作。
distinct对结果去重(如果指定了 distinct)。
order by按指定的列或表达式对结果排序。
limit返回指定范围的记录,例如分页查询。

示例:

假设有两张表:

查询每个班级中数学平均分≥80 分的学生,显示班级、学生姓名、数学分数,结果按分数降序排列,只看前 2 名。

select 
  s.class, 
  s.name, 
  sc.score 
from 
  student s 
join 
  score sc on s.id = sc.stu_id  -- 关联条件
where 
  sc.subject = '数学'  -- 只看数学成绩
group by 
  s.class, s.name, sc.score  -- 按班级、学生、分数分组
having 
  avg(sc.score) ≥ 80  -- 筛选平均分≥80的组
order by 
  sc.score desc  -- 按分数降序
limit 2;  -- 只取前2条

实际执行顺序:

① from 阶段

② on 阶段

③ join 阶段

④ where 阶段

⑤ group by 阶段

⑥ having 阶段

⑦ select 阶段

⑧ distinct 阶段

⑨ order by 阶段

⑩ limit 阶段

classnamescore
高一1班张三95
高二2班李四90

到此这篇关于mysql 增删改查操作与 sql 执行顺序详解的文章就介绍到这了,更多相关mysql增删改查内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

MySQL中order by排序遇到NULL值的问题及解决

10-24

MySQL数据库: 高并发电商场景下的架构设计与优化

10-25

MySQL查询表结构以及varchar和char的区别与说明

10-25

Ubuntu24.04搭建部署OpenStack私有云的图文教程

10-25

mysql设置update时间字段自动更新的实现

10-24

MySQL Online DDL原理及使用详解

10-24

猜你喜欢

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

发表评论