【MySQL】基本查询(表的增删改查)-- 详解(上)https://developer.aliyun.com/article/1515517?spm=a2c6h.13148508.setting.20.11104f0e63xoTy
三、Update
update table_name set column=expr [, column = expr ...] [where ...] [order by ...] [limit ...]
对查询到的结果进行列值更新。
⚪练习
(1)练习一 —— 将孙悟空同学的数学成绩变更为 80 分
- 数据更新
(2)练习二 —— 将曹孟德同学的数学成绩变更为 60 分,语文成绩变更为 70 分
- 一次更新多个列
(3)练习三 —— 将总成绩倒数前三的 3 位同学的数学成绩加上 30 分
- 更新值为原值基础上变更
注意:别名可以在 order by 中使用 。
(4)练习四 —— 将所有同学的语文成绩更新为原来的 2 倍
- 没有 where 子句,则更新全表。
注意 :更新全表的语句慎用。
四、Delete
1、删除数据
delete from table_name [where ...] [order by ...] [limit ...];
⚪练习
a. 练习一 —— 删除孙悟空同学的考试成绩
b. 练习二 —— 删除整张表数据
注意 :删除整表操作要慎用。
2、截断表
truncate [table] table_name;
- 截断整表数据,注意影响行数是 0,所以实际上没有对数据真正操作
- 再插入一条数据,自增 id 再重新增长
delete 和 truncate 的区别:
- 都可以清空表中的数据。
- delete from 是传统的删除,不会对计数器进行清空或重新置位,而 truncate 清空表会重置 auto_increment 项。
- truncate 是直接将表中数据清空,它不走事务,而 delete from 以及之前学的 sql 最终在运行时都要以事务的方式被包装,然后再让 MySQL 去运行。
注意 :这个操作慎用。
- 只能对整表操作,不能像 delete 一样针对部分数据操作。
- 实际上 MySQL 不对数据操作,所以比 delete 更快,但是 truncate 在删除数据时,并不经过真正的事物,所以无法回滚。
- 会重置 auto_increment 项。
五、插入查询结果
insert into table_name [(column [, column ...])] select ...;
⚪练习
(1)练习一 —— 删除表中的的重复复记录,重复的数据只能有一份
错误思路:
- 创建一张空表(no_duplicate_table,结构和 duplicate_table 一样)
- 将 duplicate_table 的去重数据插入到 no_duplicate_table
- 通过重命名表,实现原子的去重操作
为什么最后是通过 rename 方式进行的?
就是单纯的想等一切都就绪了,然后统一放入、更新、生效等。
六、聚合函数
⚪练习
(1)练习一 —— 统计班级共有多少同学
- 使用 * 做统计,不受 NULL 影响
- 使用表达式做统计
(2)练习二 —— 统计本次考试的数学成绩分数个数
- count(math) 统计的是全部成绩
- count(distinct math) 统计的是去重成绩数量
注意:
distinct 要写在括号内,因为我们是要对 math 去重,而不是对 count() 的结果去重。
NULL 不会计入结果。
(3)练习三 —— 统计数学成绩总分
- 不及格 < 60 的总分,没有结果,返回 NULL
- 数学的平均成绩
(4)练习四 —— 统计平均总分
(5)练习五 —— 返回英语最高分
(6)练习六 —— 返回 > 70 分以上的数学最低分
七、group by 子句的使用
分组的目的:为了进行分组后,方便进行聚合统计。
在 select 中使用 group by 子句可以对指定列进行分组查询:
select column1, column2, .. from table group by column;
1、准备工作,创建一个雇员信息表(来自 Oracle 9i 的经典测试表)
- emp 员工表
- dept 部门表
- salgrade 工资等级表
2、如何显示每个部门的平均工资和最高工资
指定列名,实际分组是用该列不同的行数来进行分组的。
分组的 deptno,组内一定是相同的。说明可以被聚合压缩。
分组就是把一组按照条件拆分成了多个组,进行各自组内的统计。
分组(“分表”),就是把一张表按照条件在逻辑上拆成了多个子表,然后分别对各自的子表进行聚合统计。
3、显示每个部门的每种岗位的平均工资和最低工资
4、显示平均工资低于 2000 的部门和它的平均工资
(1)统计出每一个部门的平均工资(结果先聚合出来)
(2)having 和 group by 配合使用,对 group by 结果进行过滤(对聚合的结果进行判断)
having 和 group by 的语义是一样的,having 相当于是对分组聚合统计后的数据,进行条件筛选。
having 经常和 group by 搭配使用,作用是对分组进行筛选,作用有些像 where。
having VS where 的区别与执行顺序是什么?
都能够做条件筛选,这是它们的共性。
但它们是完全不同的条件筛选,它们的条件筛选的阶段是不同的。
补充:不要单纯的认为,只有在磁盘上将表结构导入到 MySQL,真实存在的表才叫表。
中间筛选出来的,包括最终结果,全都是逻辑上的表。(MySQL 一切皆表)
只要我们能够处理好单表的 CURD,所有的 sql 场景就都能用统一的方式进行。
5、补充
SQL 查询中各个关键字的执行先后顺序:
from > on > join > where > group by > with > having > select > distinct > order by > limit