组函数及分组统计[通俗易懂]

组函数及分组统计

大家好,又见面了,我是全栈君。

分组函数

SQL中经常使用的分组函数

    Count(): 计数

    Max():求最大值

    Min():求最小值

    Avg():求平均值

    Sum():求和

-- 统计emp表中的人数
select count(*) from emp; 

-- 统计获得奖金的人数
select count(comm) from emp;

-- 求全部雇员的最低工资
select min(sal) from emp;

-- 求全部雇员的最高工资
select max(sal) from emp;

-- 求部门编号为20的雇员的平均工资和总工资
select avg(sal),sum(sal) from emp where deptno = 20;

分组统计查询

语法格式

SELECT {DISTINCT}*|查询列1 别名1,查询列2 别名2……

FORM 表名称1 别名1,表名称2 别名2,……

{WHERE 条件表达式}

{GROUP BY 分组条件}

{ORDERBY  排序字段 ASC|DESC,排序字段 ASC|DESC,……}

-- 统计出每一个部门的人数
select deptno,count(empno) from emp group by deptno;

-- 求出每一个部门的平均工资
select deptno, avg(sal) from emp group by deptno;

统计每一个部门的最高工资,以及获得最高工资的雇员姓名

假设写成

SELECT ename,max(sal)
 FROM emp
 GROUP BY deptno

Oracle会提示第 1 行出现错误:

ORA-00979: 不是 GROUP BY 表达式

以上代码在运行过程中出现错误,是由于:

1. 假设程序中使用了分组函数。则在下面两种情况下能够正常查询结果:

      程序中存在了GROUP BY,并指定了分组条件。这样能够将分组条件一起查询出来

      假设不使用GROUP BY,则仅仅能单独地使用分组函数

2.使用分组函数时,查询结果列不能出现分组函数和分组条件之外的字段


综上所述,我们在进行分组统计查询时有遵循这样一条规律:

出如今字段列表中的字段。假设没有出如今组函数中。就必然出如今GROUP BY 语句的后面


-- 统计出每一个部门的最高工资。及最高工资的雇员姓名
select deptno, ename,sal from emp where sal in(select max(sal) from emp group by deptno);

组函数及分组统计[通俗易懂]

-- 查询出每一个部门的部门名称。及每一个部门的雇员人数
select d.dname, count(e.empno)
from emp e, dept d
where e.deptno = d.deptno
group by d.dname

求出平均工资大于2000的部门编号和平均工资

刚開始学习的人非常easy错误地写成将工资大于2000的条件写在where的后面

SELECT deptno,avg(sal)  FROM emp  WHERE avg(sal)>2000   GROUP BYdeptno<span style="font-family:SimSun;"></span>

系统出现例如以下错误提示:

ORA-00934: 此处不同意使用分组函数

-- 求出平均工资大于2000的部门编号和平均工资
select e.deptno, avg(sal)
from emp e, dept d
where e.deptno = d.deptno
having avg(sal) > 2000
group by e.deptno;

规则:WHERE 仅仅能对单条记录限制(过滤),having是对分组进行过滤

分组函数仅仅能在分组中使用。不能在WHERE语句之中出现。假设要指定分组条件,则仅仅能通过另外一种条件的指令:HAVING

-- 显示非销售人员工作名称以及从事同一工作雇员的月工资总和,而且要满足从事同一工作的雇员的月工资合计大于$5000,输出结果按月工资合计升序排列
select e.job, sum(e.sal) sum_sal
from emp e
where e.job <> 'SALESMAN'
group by e.job
having sum(e.sal) > 5000
order by sum_sal;

分组的简单原则:
     仅仅要一列上存在反复内容才有可能考虑到用分组查询

注意:

     分组函数能够嵌套使用,可是在组函数嵌套使用的时候不能再出现分组条件的列名

例:求平均工资最高的部门编号、部门名称、部门平均工资

第一步:

select deptno, avg(sal) from emp group by deptno;

组函数及分组统计[通俗易懂]

第二步:

select deptno, max(avg(sal)) from emp group by deptno;

ORA-00937: 不是单组分组函数

第三步:去掉查找结果中的deptno列

select max(avg(sal)) from emp group by deptno;

组函数及分组统计[通俗易懂]

逐步完毕后:

select d.deptno, d.dname, t.avg_sal
  from dept d,
   (select deptno,avg(sal) avg_sal
      from emp
       group by deptno having avg(sal)=
          (select max(avg(sal)) from emp group by deptno) 
   ) t
where t.deptno=d.deptno;


组函数及分组统计[通俗易懂]

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115656.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 查看Linux系统版本内核命令大全

    查看Linux系统版本内核命令大全目录命令一:查看当前系统发行版本详细信息命令二:查看当前系统内核信息命令三:查看当前系统版本信息命令四:查看CPU相关信息命令五:查看系统位数Linux系统内核、发行版本有很多,那么如何查看当前Linux系统的内核信息、Linux系统发行版本等信息呢?Linux百科网分享查询Linux系统详细信息的方法:命令一:查看当前系统发行版本详细信息LSB是LinuxStandardBase的缩写,lsb_release命令用来显示LSB和特定版本的相关信息执行命令:lsb_

    2022年10月12日
    0
  • java中session的用法与原理

    java中session的用法与原理https://www.cnblogs.com/xdp-gacl/p/3855702.htmlsession简介在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的s…

    2022年7月12日
    12
  • U盘量产检查闪存编码失败_北信源安全u盘忘记密码

    U盘量产检查闪存编码失败_北信源安全u盘忘记密码没什么特殊的想法就是看自己很久没有更新关于题解类的文章了而已(其实这是我好久之前做的,只是把它从洛谷博客搬到了这里而已)题目首先分析题目要二分他长成这个亚子太二分了所以就要二分最好是先排一下序吧这样我们在输入的时候就能顺便处理出l和r的值,考虑我们二分的是一个接口的大小,所以我们的答案肯定是在最大的接口和最小的接口之间啊,所以这样做是可…

    2022年10月12日
    1
  • layui弹出层使用方法总结

    layui弹出层使用方法总结layui的模态窗口很强大,但是使用的时候要声明很多东西,并且对于窗口之间的参数传递也没有做具体的说明,所以基于layui弹出层的api进行了一些简单的封装,使用起来更加顺手,先上代码functionOpenDialog(id,title,url,width,height,callback,params){layui.use(‘layer’,function(){…

    2022年5月5日
    122
  • PHP json_decode 出错

    PHP json_decode 出错json串中有时会包含json_decode解析不了的字符串,可以使用下面封装好的来处理。下载地址:Services_JSON

    2022年7月17日
    8
  • css知多少(3)——样式来源与层叠规则

    css知多少(3)——样式来源与层叠规则

    2021年9月4日
    69

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号