【MySQL】基本查询(2)
作者:爱写代码的刚子
时间:2024.3.27
前言:本篇博客将会介绍Update,Delete,插入查询结果,聚合函数以及group by子句的使用
语法:
UPDATE table_name SET column = expr [, column = expr ...] [WHERE ...] [ORDER BY ...] [LIMIT ...]
对查询到的结果进行列值更新
案例:
语法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
注意:删除整表操作要慎用!
所以delete操作不会将AUTO_INCREMENT清空
语法:
TRUNCATE [TABLE] table_name
这个关键字直接将表清空,不走事务,delete走事务
TRUNCATE不会将自己的操作记录在日志里!,比delete快
注意:这个操作慎用
关于持久化方式:
语法:
INSERT INTO table_name [(column [, column ...])] SELECT ...
案例:删除表中的重复记录,重复的数据只能有一份
【问题】:为什么最后是通过rename方式进行的?
就是单纯的想等一切都就绪了,然后统一放入、更新、生效等。(因为有可能有其他用户在访问该数据库)
函数 | 说明 |
---|---|
COUNT([DISTINCT] expr) | 返回查询到的数据的 数量 |
SUM([DISTINCT] expr) | 返回查询到的数据的 总和,不是数字没有意义 |
AVG([DISTINCT] expr) | 返回查询到的数据的 平均值,不是数字没有意义 |
MAX([DISTINCT] expr) | 返回查询到的数据的 最大值,不是数字没有意义 |
MIN([DISTINCT] expr) | 返回查询到的数据的 最小值,不是数字没有意义 |
COUNT:
案例:
能否对math去重然后再统计?:
这样写表示对res去重
SUM
案例:
AVG
案例:
MIN和MAX
案例:
分组的目的是为了进行分组(按需求,指定列名,实际是用该列的不同的行数据进行分组的)之后,方便进行聚合统计
分组,不就是把一组按照条件拆成了多个组,进行各自组内的统计(分组不就是把一张表按照条件在逻辑上拆成了多个子表,然后分别对各自的子表进行聚合统计)
思想:先分组,再聚合
在select中使用group by 子句可以对指定列进行分组查询
select column1, column2, .. from table group by column;
案例:
select deptno,avg(sal),max(sal) from EMP group by deptno;
分组的条件deptno,组内一定是相同的!可以被聚合压缩
select avg(sal),min(sal),job, deptno from EMP group by deptno, job;
因为ename不在分组条件里面,无法进行分组,无法进行压缩和聚合。
显示平均工资低于2000的部门和它的平均工资
select avg(sal) from EMP group by deptno
select avg(sal) as myavg from EMP group by deptno having myavg<2000; --having经常和group by搭配使用,作用是对分组进行筛选,作用有些像where。
having是对聚合后的统计数据,条件筛选。
执行顺序,构建对“结果”的理解
因为:即使没被分组,也可以看成是一组数据(但是我们选择禁止这样使用)
where:对具体的任意列进行条件筛选
having:对分组聚合之后的结果进行条件筛选
执行顺序:
from->where->group->聚合统计+重命名->having
所以where和having的区别在于条件筛选的阶段是不同的!
【附】:
SQL查询中各个关键字的执行先后顺序 from > on> join > where > group by > with > having > select > distinct > order by > limit
- 不要单纯的认为,只有在磁盘上表结构导入到mysql,真实存在的表,才叫做表
- 中间筛选出来的,包括最终结果,全部都是逻辑上的表!“MySQL一切皆表”,未来只要我们能够处理好单表的CURD,所有的sql场景,我们全部都能用统一的方式进行