1、排序
语法模式:
select 字段名1,字段名2,字段名3,....
from 表名
order by 字段名k;
注:① 默认为升序排列; ② 升序 order by 字段名k asc ; 降序 order by 字段名k desc
举例:
(1)按照工资升序找出员工名和薪资?
select ename ,sal from emp order by sal;//升序
select ename ,sal from emp order by sal asc;//升序
select ename ,sal from emp order by sal desc;//降序
(2)按照工资的降序排,当工资相同的时候再按名字的升序排列。
select ename ,sal from emp order by sal desc, ename asc;
注意:多个因素排序的时候,越靠前的字段越能起到主导作用。只有当前面的无法完成排序的时候,才会启用后面的字段
(3)找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序来排列。
select
ename,job,sal
from
emp
where
job='SALESMAN'
order by
sal desc;
注意:
select 3
*
from 1
emp
where 2
条件
order by 4
...
order by 是最后执行的。
2、分组函数
分别有:
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
记住:所有分组函数都是对一组数据进行操作的
①找出工资总和
select sum(sal) from emp;
②找出最高工资?
select max(sal) from emp;
③找出最低工资?
select min(sal) from emp;
④找出平均工资?
select avg(sal) from emp;
⑤找出总人数?
select count(*) from emp;
select count(ename) from emp;
多行处理函数特点:输入多行,最终输出一行。
(1)分组函数自动忽略null.
select count(comm) from emp ;
select sum(comm) from emp where comm is not null;//不需要额外添加where条件,sum函数自动忽略null.
(2)找出工资高于平均工资的员工?
select avg(sal) from emp;//平均工资
select ename from emp where sal > avg(sal);ERROR 1111 (HY000): Invalid use of group function
思考以上错误信息,无效的使用了分组函数?
原因:
SQL语句当中有一个语法规则,分组函数不可直接使用在where子句当中,因为group by 是在where之后才会执行。
select 5
..
from 1
..
where 2
..
group by 3
..
having 4
..
order by 6
..
(4) count(*)与count(某个字段),他们有什么区别?
count(*): 不是统计某个字段中数据的个数,而是统计数据总条数(和某个字段无关)
count(某个字段):表示统计comm字段不为null的数据总数量
(5)分组函数可以组合起来用:
select count(*),sum(sal),avg(sal),max(sal),min(sal),avg(sal) from emp;
(6)找出工资高于平均工资的员工
第一步,找出平均工资
select avg(sal) from emp;
第二步,找出工资高于平均员工的员工
select ename,sal from emp where sal > (select avg(sal) from emp);
3、单行处理函数
什么是单行处理函数?
输入一行,处理一行。计算每个员工的年薪?
select ename,(sal+comm) * 12 as yearsal from emp;
重点: 在数据库运算中,只要有null参与运算,结果都是null;
使用 ifnull 函数:( ifnull()空处理函数,属于单行处理函数)
select ename,(sal+ifnull(comm,0)) * 12 as yearsal from emp;
4、group by 和 having
group by :按照某个字段或者某些字段进行分组。
having :having是对数据进行再次过滤
案例:
(1)找出每个工作岗位的最高薪资。
select max(sal),job from emp group by job;
注意:分组函数一般都会和group by 联合使用,这也是为什么它被称为分组函数的原因, 并且任何一个分组函数(count sum avg max min)都是在group by 语句执行之后才会执行的,
当一条sql语句没有group by 的话,整张表自称一组。
select ename,max(sal),job from emp group by job;
以上在MySQL中,查询结果是有的,但是结果毫无意义,在oracle数据库当中会报错,语法错误。
oracle的语法规则比MySQL语法规则更加严谨
记住一个规则,当一条语句中有group by 的话,select后面只能跟分组函数和参与分组的字段。
(2)每个工作岗位的平均薪资?
select job,avg(sal) from emp group by job;
(3)多个案例能不能联合起来一块分组?
案例:找出每个部门不同岗位的平均薪资
select deptno,job,avg(sal) from emp group by job,deptno;
(4)找出每个部门的最高薪资,要求显示薪资大于2900的数据
第一步,找出每个部门的最该薪资
select max(sal),deptno from emp group by deptno;
第二步,找出薪资大于2900的
select max(sal),deptno from emp group by deptno having max(sal) >2900;//这种方式效率低
这条语句的最佳写法为; select max(sal),deptno from emp where sal > 2900 group by deptno;
(5)找出每个部门的平均薪资,要求显示薪资大于2000的数据
第一步,找出每个部门平均薪资
select avg(sal),deptno from emp group by deptno;
第二步,要求显示薪资大于2000的数据
select avg(sal),deptno from emp group by deptno having avg(sal) > 2000;
where后面不能使用分组函数:
select avg(sal),deptno from emp group where avg(sal) > 2000 by deptno;//错误了
这种情况下,只能使用having过滤
5、总结一个完整的DQL语句
select
... 5
from
... 1
where
... 2
group
... 3
having
... 4
order by
... 6
参考:动力节点数据库课程