概述
高级查询在数据库的开发过程中应用广泛,本博文将从分组查询、多表查询和子查询三个方面介绍Oracle的高级查询,最后典型案例的应用。
sql窗口修改已执行的sql
分组查询
分组函数的概念
分组函数作用于一组数据,并对一组数据返回一个值。
分组函数的语法
常用分组函数
- avg
- sum
- min
- max
- count
- wm_contact 行转列
分组函数的使用
avg()/sum()
求出员工的平均工资和工资总和。
sql> select avg(sal),sum(sal) from emp ;
AVG(SAL) SUM(SAL)
---------- ----------
2073.21428 29025
min()/max()
sql> select min(sal),max(sal) from emp;
MIN(SAL) MAX(SAL)
---------- ----------
800 5000
sql>
count()
sql> select count(1) from emp;
COUNT(1) ----------
14
distinct 关键字
sql> select distinct(deptno) from emp;
DEPTNO ------
30
20
10
wm_concat()行转列
sql> select deptno 部门,wm_concat(ename) 部门总的员工 from emp group by deptno;
部门 部门总的员工
---- --------------------------------------------------------------------------------
10 CLARK,MILLER,KING
20 SMITH,FORD,ADAMS,SCOTT,JONES
30 ALLEN,JAMES,TURNER,BLAKE,MARTIN,WARD
wm_concat不同版本的区别
10.2.0.4以前,wm_concat返回的是varchar2,10.2.0.5开始,是CLOB.
nvl()/nvl2()
分组函数会自动忽略空值,nvl()函数可以使分组函数不忽略空值
NVL (expr1,expr2)
【功能】若expr1为NULL,返回expr2;expr1不为NULL,返回expr1。
NVL2 (expr1,expr2,expr3)
【功能】expr1不为NULL,返回expr2;expr2为NULL,返回expr3。
expr2和expr3类型不同的话,expr3会转换为expr2的类型
group by
语法
- 在select列表中所有未包含在函数中的列都应该包含在group by子句中,否则会抛出 ora-00937 not a singel-group group function。
select a,b,c,avg(d) from table_name group by a,c ;
- 包含在group by子句中的列,不必包含在select列表中。
select avg(sal) from emp group by deptno;
使用多个列分组
按照部门、不同的职位,统计员工的工资总和。
select deptno,job,sum(sal) from emp group by deptno,job order by deptno;
先按照deptno分组,再按照job分组,如果都一样,则是同一组数据。
过滤分组-having子句的使用以及和where的区别
having子句语法
having子句和where的区别
- where子句中不能使用组函数,having后可以使用;
- 当where和having可以通用的情况下,优先使用where,效率更高
where 先过滤后分组
having 先分组后过滤
优先使用where
举例:
在分组函数中使用order by
select deptno,avg(sal) from emp group by deptno order by avg(sal) ;--按表达式排序
select deptno,avg(sal) 平均工资 from emp group by deptno order by 平均工资 ;--按别名排序
select deptno,avg(sal) 平均工资 from emp group by deptno order by 2 ; --按序号排序,表示第二列。 如果只有2列,不能出现比2大的值
分组函数的嵌套
栗子: 求部门平均工资的最大值
- 先求出部门的平均工资
- 再求出平均工资中的最大值
select max(avg(sal)) from emp group by deptno;
包含在group by子句中的列,不必包含在select列表中。