加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Oracle高级查询-更新中

发布时间:2020-12-12 15:46:20 所属栏目:百科 来源:网络整理
导读:概述 高级查询在数据库的开发过程中应用广泛,本博文将从分组查询、多表查询和子查询三个方面介绍Oracle的高级查询,最后典型案例的应用。 sql窗口修改已执行的sql ed表示编辑上个sql / 表示执行上个sql 分组查询 分组函数的概念 分组函数作用于一组数据,并

概述

高级查询在数据库的开发过程中应用广泛,本博文将从分组查询、多表查询和子查询三个方面介绍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()


多表连接

子查询

案例

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读