文章目录

  • 1、升序(asc)
  • 2、排序(desc)
  • 3、多字段排序
  • 4、分组函数
  • ①、多函数处理函数(输入多行输出一行) count、sum、avg、max、min
  • 示例1:
  • 示例2:求员工的年薪
  • 分组函数也可以组合使用
  • ②、单行处理函数(输入一行输出一行)
  • ifnull空处理函数
  • 示例3:
  • 示例4:
  • ④count(*)和count(具体的某个字段)的区别?
  • ③分组查询函数group by和having
  • 示例5:
  • ⑤多个字段联合分组
  • ⑥having使用
  • 5、一条完整的SQL语句


1、升序(asc)

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

2、排序(desc)

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

①示例:对工资升序排列:

by group mysql 分组内数据排序 mysql分组排序语句_字段

3、多字段排序

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

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

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

by group mysql 分组内数据排序 mysql分组排序语句_分组函数_02


②、查找工作岗位是salesman,并且按照工资升序排序

by group mysql 分组内数据排序 mysql分组排序语句_字段_03

上述语句的执行顺序
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:

by group mysql 分组内数据排序 mysql分组排序语句_分组函数_04


统计有津贴的人数

by group mysql 分组内数据排序 mysql分组排序语句_字段_05


可以看到0被算进去了,但是NULL被忽略了。

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

示例2:求员工的年薪

by group mysql 分组内数据排序 mysql分组排序语句_分组函数_06


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

分组函数也可以组合使用

by group mysql 分组内数据排序 mysql分组排序语句_字段_07

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

ifnull空处理函数

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

将津贴(comm字段)的NULL替换为0

by group mysql 分组内数据排序 mysql分组排序语句_分组函数_08


对示例2的改进

by group mysql 分组内数据排序 mysql分组排序语句_字段_09

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

示例4:

查询薪资大于平均薪资的员工

by group mysql 分组内数据排序 mysql分组排序语句_分组函数_10


上述代码直接报错,是因为分组函数不能使用在where字句中。

正确解法:

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

by group mysql 分组内数据排序 mysql分组排序语句_分组函数_11

④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;

by group mysql 分组内数据排序 mysql分组排序语句_分组函数_12


求每个工作岗位的薪资

by group mysql 分组内数据排序 mysql分组排序语句_字段_13

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

求每个岗位的平均薪资

by group mysql 分组内数据排序 mysql分组排序语句_分组函数_14

⑤多个字段联合分组

找出每个部门不同工作岗位的最高薪资,并按照部门编号排序

by group mysql 分组内数据排序 mysql分组排序语句_升序_15

⑥having使用

分组后在按照照条件过滤

示例:找出每个部门的最高薪资,要求显示薪资大于2900的数据

by group mysql 分组内数据排序 mysql分组排序语句_字段_16

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

找出每个部门的平均薪资,要求显示平均薪资大于2900的数据

by group mysql 分组内数据排序 mysql分组排序语句_分组函数_17

5、一条完整的SQL语句

中间可以省略掉部分(例如where、group by、having等等),但是顺序一定不能写反!!!!!!!
select		⑤
...
from		①
...
where		②
...
group by	③
...
having		④
...
order by	⑥
...

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