oracle联合分组查询,Oracle分组查询

本文详细介绍了SQL中的分组查询和聚合函数的使用,通过实例演示了如何查询各部门经理的最低薪资、姓名、部门名称以及部门人数。强调了在进行分组查询时的注意事项,如GROUP BY不能使用字段别名,以及在多字段分组中如何解决单字段分组的局限性。同时,提供了逐步构建查询语句的过程,从单表到多表联查,再到统计部门人数,展示了一种完整的SQL查询解决方案。
摘要由CSDN通过智能技术生成

首先要明白的一点:数据重复的时候分组才有意义。

分组查询语法:

SELECT [DISTINCT] *|分组字段1 [别名] [,分组字段2 [别名] ,…] | 统计函数

FROM 表名称 [别名], [表名称 [别名] ,…]

[WHERE 条件(s)]

[GROUP BY 分组字段1 [,分组字段2 ,…]]

[ORDER BY 排序字段 ASC | DESC [,排序字段 ASC | DESC]];

特别说明的几点(非常重要):

1,GROUP BY 分组字段不能用字段别名;

2,没有分组时

统计函数可以单独用于SELECT之后,但是不能再出现其他字段;

3,单字段分组时

SELECT之后就只能用统计函数和GROUP BY之后的字段;

4,多字段分组时

涉及到的两个问题:

①跨表间的关联字段;-->消除笛卡儿积

②需要解决单字段分组时的局限性(如上第3点),解决方法:一般情况是在FROM后嵌套子查询-->构建临时表。举例如下:

列出各个部门的MANAGER(经理)的最低薪金、姓名、部门名称、部门人数。

1、确定所需要的数据表:

emp表:找到经理的薪金、姓名;

dept表:部门名称;

emp表:统计部门人数;

2、确定已知的关联字段:emp.deptno=dept.deptno;

第一步:找到所有部门的经理

SELECT deptno,MIN(sal)

FROM emp

WHERE job='MANAGER'

GROUP BY deptno;

第二步:找到姓名,但是以上的子查询,不能再出现其他的字段

SELECT e.ename,e.sal

FROM emp e,(

SELECT deptno dno,MIN(sal) sal

FROM emp

WHERE job=’MANAGER’

GROUP BY deptno) temp

WHERE e.deptno=temp.dno AND e.sal=temp.sal AND e.job='MANAGER';

第三步:加入部门的名称信息

SELECT e.ename,e.sal,d.dname

FROM emp e,(

SELECT deptno dno,MIN(sal) sal

FROM emp

WHERE job='MANAGER'

GROUP BY deptno) temp,dept d

WHERE e.deptno=temp.dno AND e.sal=temp.sal AND e.job='MANAGER'

AND e.deptno=d.deptno;

第四步:统计部门人数

SELECT e.ename,e.sal,d.dname,res.count

FROM emp e,(

SELECT deptno dno,MIN(sal) sal

FROM emp

WHERE job=’MANAGER’

GROUP BY deptno) temp,dept d,(

SELECT deptno dno,COUNT(empno) count

FROM emp

GROUP BY deptno) res

WHERE e.deptno=temp.dno AND e.sal=temp.sal AND e.job='MANAGER'

AND e.deptno=d.deptno AND res.dno=d.deptno;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值