oracle高级查询功能,Oracle高级查询-更新中

概述

高级查询在数据库的开发过程中应用广泛,本博文将从分组查询、多表查询和子查询三个方面介绍Oracle的高级查询,最后典型案例的应用。

sql窗口修改已执行的sql

ed表示编辑上个sql

/ 表示执行上个sql

0818b9ca8b590ca3270a3433284dd417.png

分组查询

分组函数的概念

分组函数作用于一组数据,并对一组数据返回一个值。

0818b9ca8b590ca3270a3433284dd417.png

分组函数的语法

0818b9ca8b590ca3270a3433284dd417.png

常用分组函数

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

0818b9ca8b590ca3270a3433284dd417.png

wm_concat不同版本的区别

0818b9ca8b590ca3270a3433284dd417.png

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

0818b9ca8b590ca3270a3433284dd417.png

语法

0818b9ca8b590ca3270a3433284dd417.png

在select列表中所有未包含在函数中的列都应该包含在group by子句中,否则会抛出 ora-00937 not a singel-group group function。

select a, b, c ,avg(d) from table_name group by a, b ,c ;

包含在group by子句中的列,不必包含在select列表中。

select avg(sal) from emp group by deptno;

使用多个列分组

0818b9ca8b590ca3270a3433284dd417.png

按照部门、不同的职位,统计员工的工资总和。

select deptno, job, sum(sal) from emp group by deptno, job order by deptno;

0818b9ca8b590ca3270a3433284dd417.png

先按照deptno分组,再按照job分组,如果都一样,则是同一组数据。

过滤分组-having子句的使用以及和where的区别

0818b9ca8b590ca3270a3433284dd417.png

having子句语法

0818b9ca8b590ca3270a3433284dd417.png

having子句和where的区别

where子句中不能使用组函数,having后可以使用;

当where和having可以通用的情况下,优先使用where,效率更高

where 先过滤后分组

having 先分组后过滤

优先使用where

举例:

0818b9ca8b590ca3270a3433284dd417.png

在分组函数中使用order by

0818b9ca8b590ca3270a3433284dd417.png

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列表中。

group by语句的增强rollup()

0818b9ca8b590ca3270a3433284dd417.png

多表连接

子查询

案例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值