文章目录
- 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;
①示例:对工资升序排列:
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语句
中间可以省略掉部分(例如where、group by、having等等),但是顺序一定不能写反!!!!!!!
select ⑤
...
from ①
...
where ②
...
group by ③
...
having ④
...
order by ⑥
...
执行顺序:
先执行from查表,使用where条件过滤筛选出有价值的信息,再使用order by 进行分组,分组后再使用having筛选出有价值的信息,然后查出来,最后排序输出。