您的位置:首页 > 数据库 > Oracle

Oracle分组查询

2015-08-25 16:28 218 查看
首先要明白的一点:数据重复的时候分组才有意义。

分组查询语法:

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;
第一步:找到所有部门的经理

<span style="font-size:18px;">SELECT deptno,MIN(sal)
FROM emp
WHERE job='MANAGER'
GROUP BY deptno;</span>
第二步:找到姓名,但是以上的子查询,不能再出现其他的字段

<span style="font-size:18px;">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';</span>


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

<span style="font-size:18px;">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;</span>


第四步:统计部门人数

<span style="font-size:18px;">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;</span>



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: