MySQL笔记3——SQL排序语句\分组函数

1、升序(asc)

select 段名1,段名.. from 表名 order by 要排序的字段 asc;

2、排序(desc)

select 段名1,段名.. from 表名 order by 要排序的字段 desc;

①示例:对工资升序排列:
在这里插入图片描述

3、多字段排序

select 段名1,段名.. from 表名 order by 要排序的字段1 排序规则,字段2 排序规则,字段n,排序规则;

只有前一个字段相等时,才会对后面的字段排序,以此类推
①、工资按升序排,工资一样的按姓名降序排

 select ename,sal from emp order by sal asc,ename desc;

在这里插入图片描述
②、查找工作岗位是salesman,并且按照工资升序排序
在这里插入图片描述

上述语句的执行顺序
select
	字段 				顺序③
from
	表名 				顺序①
where
	条件 				顺序②
order by
	要排序的字段 			顺序④

4、分组函数

分组函数一般都会个group by联合使用。

①、多函数处理函数(输入多行输出一行) count、sum、avg、max、min

select 分组函数(字段) from 表名;
分组函数作用示例
count计数select count(ename) from emp;找出员工总和
sum求和select sum(sal) from emp;找出工资总和
avg取平均值select avg(sal) from emp;
max最大值select max(sal) from emp;
min最小值select min(sal) from emp;
  • 分组函数都是多行处理函数,即输入多行输出一行
  • 分组函数自动忽略NULL

示例1:

在这里插入图片描述
统计有津贴的人数
在这里插入图片描述
可以看到0被算进去了,但是NULL被忽略了。

  • 数据库中只要NULL参与了运算(+ - * /),其结果一定是NULL

示例2:求员工的年薪

在这里插入图片描述
可以看到为NULL的值是因为这些人员的津贴(comm字段)为空,comm字段参与了计算因此值也为Null。详见示例3的改进版

分组函数也可以组合使用

在这里插入图片描述

②、单行处理函数(输入一行输出一行)

ifnull空处理函数

可以对**字段的NULL值进行预处理,非NULL不变
ifnull(字段,要处理成什么样)
示例3:

将津贴(comm字段)的NULL替换为0
在这里插入图片描述
对示例2的改进
在这里插入图片描述

  • 分组函数不可以直接使用在where子句中使用,因为分组函数只能在group by执行结束后才能执行。而group by是在where执行之后才能执行的。执行关系顺序:where->group by->分组函数
示例4:

查询薪资大于平均薪资的员工
在这里插入图片描述
上述代码直接报错,是因为分组函数不能使用在where字句中。
正确解法:

select sal from emp where sal >(select avg(sal) from emp);

在这里插入图片描述

④count(*)和count(具体的某个字段)的区别?

count(*):不是统计某个字段中数据的个数,而是统计总记录条数
count(字段):统计字段中不为NULL的元素个数。

③分组查询函数group by和having

group by:对某个/某些字段进行分组
having :是对分组后的数据再次过滤

注意:分组函数多和group by联合使用,这也是为什么被称为分组函数的原因。并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。当一条SQL语句中没有group by的话整张表中的数据自成一组。

示例5:

求每个部门的最高薪资

分析:先按照部门分组,再找出最大值
select max(sal),deptno from emp group by deptno;

在这里插入图片描述
求每个工作岗位的薪资
在这里插入图片描述

当一条SQL语句中有group by的话只允许select后面出现参与分组的字段以及分组函数。其他字段不允许出现,否侧出错。。例如这条语句
select ename,job,max(sal) from emp group by job;group by后面只出现job字段,因此select后面也只能出现job字段和分组函数。而ename字段是不允许出现在这里的。

求每个岗位的平均薪资
在这里插入图片描述

⑤多个字段联合分组

找出每个部门不同工作岗位的最高薪资,并按照部门编号排序
在这里插入图片描述

⑥having使用

分组后在按照照条件过滤

示例:找出每个部门的最高薪资,要求显示薪资大于2900的数据
在这里插入图片描述

  • 能使用where先过滤的情况下,先使用where过滤后在分组查询。因为先分组后使用having过滤效率低
  • 对有些情况下,where不能先过滤的情况下,就只能使用having过滤了。例如下面的例子

找出每个部门的平均薪资,要求显示平均薪资大于2900的数据
在这里插入图片描述

5、一条完整的SQL语句

中间可以省略掉部分(例如wheregroup byhaving等等),但是顺序一定不能写反!!!!!!!
select...
from...
where...
group by...
having...
order by...

执行顺序:
先执行from查表,使用where条件过滤筛选出有价值的信息,再使用order by 进行分组,分组后再使用having筛选出有价值的信息,然后查出来,最后排序输出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值