Oracle高级查询-更新中

前端之家收集整理的这篇文章主要介绍了Oracle高级查询-更新中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

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

sql窗口修改已执行的sql

ed表示编辑上个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大的值

分组函数的嵌套

栗子: 求部门平均工资的最大值

  1. 先求出部门的平均工资
  2. 再求出平均工资中的最大值
select max(avg(sal)) from emp group by deptno;

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


group by语句的增强rollup()


多表连接

查询

案例

猜你在找的Oracle相关文章