Oracle 分组查询与筛选
1. 分组查询
-
关键字:group by 分组字段名,分组字段名 ……
-
注意1:使用分组之后,在select语句中只允许出现分组字段名和多行函数 (实现了普通字段和多行函数一起出现)
-
注意2:如果是多字段分组,则先按照第一字段分组,然后每个小组继续按照第二字段进行分组,以此类推
-
注意3:where语句中不允许出现多行函数。
-- 查询最高工资和员工数 select max(sal),count(*) from emp; -- 查询不同部门的最高工资,每个部门人数 select deptno,max(sal),count(*) from emp group by deptno order by deptno;
-- 查询不同工作岗位员工数 select job, count(*) from emp group by job;
-- 查询不同部门不同岗位员工数 select deptno,job,count(*) from emp group by deptno,job order by deptno;--先分组,对每个组中的岗位在进行分组
-
2.分组筛选
-
关键字:having
-
作用:针对分组进行分组后的数据筛选,允许使用多行函数。
-
注意:having关键字必须和分组结合使用,不允许单独使用
-
where与having的比较:
-
where子句不允许出现多行函数,having允许出现多行函数
-
where子句和having都可以使用普通字段进行筛选选,但where的效率更高
-
执行顺序
- where执行顺序:from–>where–>group by–>select–>order by;
- having执行顺序: from–>group by–>having–>order by
-
结论:在分组语句中,使用where进行字段级别的筛选,使用having进行多行函数的筛选
-
-- 查询不同部门的不同岗位的并且人数大于1的信息 select deptno,job,count(*) from emp group by deptno,job having count(*)>1 order by deptno;
-- 查询部门号大于10的不同部门的不同工作岗位的人数 -- having select deptno,job,count(*) from emp group by deptno,job having deptno > 10 order by deptno; -- where select deptno,job,count(*) from emp where deptno>10 group by deptno,job order by deptno;
-