(三)排序和分组

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


参考:动力节点数据库课程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值