3人参与 • 2025-10-24 • Mysql
数据库中的 crud 指的是对表数据的增(create)、删(delete)、改(update)、查(select)四类基本操作。为了保证数据完整性和业务约束,表设计中常用 五大约束:not null、auto_increment、unique、primary key、foreign key,是数据库操作的基础核心。
为保证数据库中数据的完整性与一致性,存在 5 大约束:
not null 非空约束:确保字段的值不能为空。例如,在学生表的“姓名”字段设置该约束后,插入学生记录时必须填写姓名。auto_increment 自增约束:常用于主键字段,使字段值在插入新记录时自动递增。比如学生表的“学号”字段,每次新增学生,学号会自动加 1。unique 唯一约束:保证字段的值在表中是唯一的,避免重复。像课程表的“课程名称”字段,不能有重复的课程名。primary 主键约束:同时包含“非空 + 唯一”属性,用于唯一标识表中的每条记录,一个表只能有一个主键。例如学生表的“学号”字段可作为主键,唯一确定每个学生。foreign 外键约束:用于建立表与表之间的关联,确保参照完整性。比如学生选课表中的“学生学号”字段可作为外键,关联学生表的“学号”主键,保证选课记录对应的学生存在。mysql 删除数据的几种方式有什么区别?
在 mysql 中,删除数据主要有三种方式:
drop、truncate和delete。drop属于 ddl 操作,会直接删除整张表,包括表结构、数据、索引等所有对象,执行最快但无法回滚;truncate也是 ddl,只清空表中所有数据,保留表结构,同时会重置自增主键,速度也很快,同样无法回滚;而delete是 dml 操作,逐行删除数据,可以通过where条件选择性删除,并且支持事务回滚,但速度相对较慢。
删除数据有 drop(ddl)、truncate(ddl)、delete(dml)三种方式,区别如下:
① drop (ddl)
drop table student; 学生表的结构和所有学生数据都会被删除。② truncate (ddl)
truncate table student; 后,学生表数据被清空,如果再次插入数据,自增学号从 1 开始。③ delete (dml)
where 条件进行部分删除。delete from student where age > 20; 只会删除年龄大于 20 的学生记录。去重用于获取表中不重复的数据,主要有以下两种方式:
① group by column
通过对指定列进行分组,将相同值的行归为一组,从而实现去重效果。常与聚合函数(count, sum, avg 等)配合用于统计或去重。
示例(统计每个班级人数):
select class, count(*) as cnt from student group by class;
② select distinct column
示例(去重班级):列出学生表中所有不同的班级名称。
select distinct class from student;
条件判断用于在数据库操作中根据特定条件筛选数据或执行操作,常见的有以下几种场景:
① from… where…
where 子句设置条件,筛选出符合要求的数据。having 更早执行select * from student where age > 19; delete from student where id = 3; update student set age = age + 1 where class = '计算机1班';
② group by… having…
group by 对列进行分组,再用 having 子句对分组后的结果设置条件进行筛选。having count(*) > 1)。示例:筛选出平均年龄大于 20 的班级及其平均年龄
select class, avg(age) from student group by class having avg(age) > 20;
③ a join b on condition
on 指定连接条件,将两个或多个表中相关联的数据组合在一起。where 可继续对连接后的结果集进行过滤。select s.name, c.name from student s join course c on s.id = c.student_id where s.age > 18;
假设课程表有 student_id 外键关联学生表 id,获取学生姓名和所选课程名称。
create database 数据库名 default character set utf8;,用于创建新的数据库并设置字符集为 utf8,例如 create database school default character set utf8;。drop database 数据库名;,会删除指定数据库及其所有对象,如 drop database school;。use 数据库名;,用于指定当前要操作的数据库,如 use school;。create database `mydb` default character set utf8; use `mydb`; drop database `mydb`;
创建表:使用 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='课程表';
drop table 表名;,会删除表及其所有数据,如 drop table student;。插入数据:使用 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);
删除表与清空数据:使用 delete from 语句删除表中数据,可通过 where 子句设置条件,
例如:
delete from `student` where id = 3; -- 删除id为3的学生 delete from `student` where name = '李四'; -- 删除姓名为李四的学生 delete from `student` where age > 20; -- 删除年龄大于20的学生
清空数据表:
truncate table 表名;,如 truncate table student;,清空学生表数据,自增字段置 1。delete from 表名;,如 delete from student;,逐行清空学生表数据,自增字段从之前的值继续。示例:
drop table `student`; -- 删除表结构与数据 truncate table `student`; -- 清空数据(重置自增) delete from `student`; -- 逐行删除(可加 where)
更新数据:使用 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
查询数据:使用 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 是按如下顺序:
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 | 返回指定范围的记录,例如分页查询。 |
select在前”,但实际执行时select在中间阶段(第7步),因此 select 中定义的别名不能在 where 中使用,但可在order by中使用。where和having的区别:where过滤行(未分组时),having过滤组(已分组后),且having可使用聚合函数。where尽早过滤数据,减少后续分组/排序的计算量。示例:
假设有两张表:
student(学生表):id(学号)、name(姓名)、class(班级)score(成绩表):stu_id(关联学生 id)、subject(科目)、score(分数)查询每个班级中数学平均分≥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 阶段
student(别名s)和score(别名sc)作为初始表。② on 阶段
on s.id = sc.stu_id过滤笛卡尔积,只保留学生id匹配的行(关联有效数据)。③ join 阶段
join合并,此时结果集仅包含student和score中id匹配的记录(内连接效果)。s.id、s.name、s.class、sc.stu_id、sc.subject、sc.score。④ where 阶段
sc.subject = '数学'过滤行,只保留数学科目的记录。avg(sc.score)(聚合函数),因为尚未分组。⑤ group by 阶段
s.class, s.name, sc.score分组(此处分组字段包含分数,实际可简化为按班级+学生分组,此处为演示)。⑥ having 阶段
avg(sc.score) ≥ 80筛选分组,只保留数学平均分≥80的组。⑦ select 阶段
s.class、s.name、sc.score。⑧ distinct 阶段
distinct,如果有在这阶段对select的结果去重。⑨ order by 阶段
sc.score desc对结果排序(分数从高到低)。⑩ limit 阶段
limit 2只保留前2条记录。| class | name | score |
|---|---|---|
| 高一1班 | 张三 | 95 |
| 高二2班 | 李四 | 90 |
到此这篇关于mysql 增删改查操作与 sql 执行顺序详解的文章就介绍到这了,更多相关mysql增删改查内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论