oracle高级查询(实例基于scott用户四张表)

分组查询

多表查询

子查询

综合实例

=======================================================================

scott用户的四张表(emp,dept,bonus,salgrade)

没有这四张表的可参考http://blog.csdn.net/love_legain/article/details/54311040进行创建

-------------------------------------------

desc emp

名称 空值 类型

-------- -------- ------------

EMPNO NOT NULL NUMBER(4)

ENAME VARCHAR2(10)

JOB VARCHAR2(9)

MGR NUMBER(4)

HIREDATE DATE

SAL NUMBER(7,2)

COMM NUMBER(7,2)

DEPTNO NUMBER(2)

---------------------------------------------

desc dept

名称 空值 类型

------ -------- ------------

DEPTNO NOT NULL NUMBER(2)

DNAME VARCHAR2(14)

LOC VARCHAR2(13)

------------------------------------------------

desc salgrade

名称 空值 类型

----- -- ------

GRADE NUMBER

LOSAL NUMBER

HISAL NUMBER

------------------------------------------------

desc bonus

名称 空值 类型

----- -- ------------

ENAME VARCHAR2(10)

JOB VARCHAR2(9)

SAL NUMBER

COMM NUMBER

=============================分组查询==================================

①分组函数的概念

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

②分组函数的使用

--select AVG(sal),sum(sal) from emp;

-- select max(sal),min(sal) from emp;

--select count(*) from emp;

--select count (distinct DEPTNO) from emp;

wm_concat:行转列

select deptno,wm_concat(ename) from emp group by deptno--11gr2和12C上已经摒弃了wm_concat函数

在分组函数中使用nvl函数:nvl函数使分组函数无法忽略空值

select count(*),count(NVL(comm,0)) from emp;

③使用group by子句数据分组

select deptno,avg(sal) from emp group by deptno;

注意:在select列表中所有未包含在组函数中的列都应该包含在group by子句中

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

④使用having子句过滤分组结果集

不能再where子句中使用分组函数

可以在having子句中使用分组函数

select deptno,avg(sal) from emp group by deptno having deptno=10;

select deptno,avg(sal) from emp where deptno=10 group by deptno;

⑤在分组查询中使用order by子句

⑥group by语句得增强

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

+

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

+

select sum(sal) from emp;

=

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

sql*plus的报表功能

================================多表查询================================

①什么是多表查询

从多个表中获取数据

②笛卡尔积

③等值连接

select e.empno,e.ename,e.sal,d.dname from emp e,dept d where e.deptno=d.deptno;

④不等值连接

select e.empno,e.ename,e.sal,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;

⑤外连接

核心:通过外链接,把链接不成立的记录,任然包含在最后的结果中

左外连接:当连接条件不成立的时候,等号左边的表依然被包含

右外连接:当连接条件不成立的时候,等号右边的表依然被包含

select d.deptno部门号,d.dname部门名称,count(e.empno)人数 from emp e,dept d where e.deptno(+)=d.deptno group by d.deptno,d.dname;--右外连接

⑥自连接

核心:通过别名,将同一张表视为多张表

select e.ename员工姓名,b.ename老板姓名 from emp e,emp b where e.mgr=b.empno;

自连接存在的问题:不适合操作大表

⑦解决方法:层次查询

select level,empno,ename,sal,mgr from emp connect by prior empno=mgr start with mgr is null order by 1;

==============================子查询===================================

①子查询概述

--查询比scott工资高的员工信息

select * from emp where sal>(select sal from emp where ename=‘scott‘);

②子查询的使用

可以使用子查询的位置:where,select,having,from

主查询和子查询可以不是同一张表

select * from emp where deptno=(select deptno from dept where dname=‘SALES‘);

select e.* from emp e,dept d where e.deptno=d.deptno and d.dname=‘SALES‘;

一般不在子查询中,使用排序,但在top-n分析问题中,必须对子查询排序

--rownum行号 伪列

select rownum,empno,ename,sal from (select * from emp order by sal desc) where rownum <= 3;

行号永远按照默认的顺序生成

行号只能使用,>=

一般先执行子查询,再执行主查询,但相关子查询除外

select empno,ename,sal,(select avg(sal)from emp where deptno=e.deptno) avgsal from emp e where sal>(select avg(sal)from emp where deptno=e.deptno);

单行子查询和多行子查询

操作符(多行)

in等于列表中的任何一个

any和子查询返回的任意一个值比较

all和子查询返回的所有值比较

操作符(单行)

= equal to

> greater than

>=greater than or equal to

<= less than or equal to

<>not equal to

select * from emp where job=(select job from emp where empno=7566) and sal >(select sal from emp where empno=7782);

select * from emp where sal=(select min(sal) from emp);

--查询最低工资大于20号部门最低工资的部门号和部门的最低工资

select deptno,min(sal) from emp group by deptno having min(sal) > (select min(sal) from emp where deptno=20);

--查询部门名称是SALES和ACCOUNTING的员工信息

select * from emp where deptno in (select deptno from dept where dname=‘SALES‘ or dname=‘ACCOUNTING‘);

select e.* from emp e,dept d where e.deptno=d.deptno and (d.dname=‘SALES‘ OR d.dname=‘ACCOUNTING‘);

SELECT * from emp where sal>any(select sal from emp where deptno=30);

--等价于

select * from emp where sal >(select min(sal) from emp where deptno=30);

子查询对控制问题

--查询不是老板的员工

select * from emp where empno not in (select mgr from emp where mgr is not null);

===================================综合实例=============================

实例一

分页查询显示员工信息:显示员工号,姓名,月薪

-每页显示四条记录

-显示第二页的员工

-按照月薪降序排列

select r,emp,ename,sal

from(select rownum r,empno,ename,sal

from(select rownum,empno,ename,sal from emp order by sal desc) e1 where rownum <=8) e2

where r>=5;

--oracle分页通过子查询实现

实例二

找到员工表中薪水大于本部门平均薪水的员工

select e.empno,e.name,e.sal,d.avgsal from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) d where e.deptno=d.deptno and e.sal>d.avgsal;

实例三

按部门统计员工人数,按照如下格式输出(员工的入职年份已知)

total 1980 1981 1982 1987

14  1  10    1    2

select count(*) total,

sum(decode(to_char(hiredate,‘YYYY‘),‘1980‘,1,0)) "1980",

sum(decode(to_char(hiredate,‘YYYY‘),‘1981‘,1,0)) "1981",

sum(decode(to_char(hiredate,‘YYYY‘),‘1982‘,1,0)) "1982"

from emp;

--使用子查询方式

select

(select count(*) from emp) total,

(select count(*) from emp where to_char(hiredate,‘yyyy‘)=‘1980‘) "1980",

(select count(*) from emp where to_char(hiredate,‘yyyy‘)=‘1981‘) "1981",

(select count(*) from emp where to_char(hiredate,‘yyyy‘)=‘1982‘) "1982"

from dual;

原文:http://www.cnblogs.com/gawain-ma/p/7240085.html

oracle高级查询案例,oracle高级查询(实例基于scott用户四张表)相关推荐

  1. 解锁scott用户,以及查看oracle中scott用户所拥有的四张表。

    scott是一个系统已经新建好的普通用户.默认状态是被锁定,DBA用户执行alter user scott account unlock;可以将其解锁. scott用户是一个示例用户,实际开发没有意义 ...

  2. oracle中join另一个表后会查询不出一些数据_阿里规定超过3张表,禁止JOIN,为何?

    一. 问题提出 <阿里巴巴JAVA开发手册>里面写超过三张表禁止join,这是为什么? 二.问题分析 对这个结论,你是否有怀疑呢?也不知道是哪位先哲说的不要人云亦云,今天我设计sql,来验 ...

  3. Laravel Query Builder 复杂查询案例:子查询实现分区查询 partition by

    案例 案例:[Laravel 在文章列表中附带上前10条评论?][1],在获取文章列表时同时把每个文章的前10条评论一同查询出来. 这是典型分区查询案例,需要根据 comments 表中的 post_ ...

  4. oracle重启root,案例:Oracle报错ORA-15025 ORA-27041 root用户操作rac导致节点宕机

    天萃荷净 运维DBA反映Oracle RAC环境中节点宕机,alert发现报错ORA-15025 ORA-27041,分析原因为使用root用户操作rac导致节点宕机 接到同事请求,说客户的linux ...

  5. oracle 转义 039,案例:Oracle报错ORA-19583 ORA-27206 ORA-06512

    天萃荷净 运维DBA工程师在巡检时发现alert日志存在错误ORA-19583 ORA-27206 ORA-06512,结合mos分析原因为RMAN备份导致报错 1.检查alert日志发现近期数据库出 ...

  6. oracle报609,案例:Oracle报错ORA-609 TNS-12537 TNS-12547 连接超时导致

    天萃荷净 生产数据库alert日志中出现错误信息ORA-609 TNS-12537 TNS-12547,分析原因为数据库inbound connect timeout默认为60导致 1.数据库aler ...

  7. oracle启动pmon,案例:Oracle启动报错ksuapc:ORA-1033 foreground process starts before PMON

    天萃荷净 Oracle数据库启动时报错:ksuapc:ORA-1033 foreground process starts before PMON,分析原因由于启动时有前台进程连接导致. 1.在11. ...

  8. oracle财务云案例,Oracle ERP云助力财务团队提升业务弹性

    近日,Oracle Fusion企业资源规划(ERP)云和Oracle Fusion企业绩效管理(EPM)云发布重要更新,这些重要更新可帮助财务团队充分利用AI.数字助手和分析等各方面的创新技术来提高 ...

  9. oracle SQL update一次性修改多个字段,数据来源于另一张表

    适应oracle update 表A set (表A.字段1,表A.字段2) = ( select 表B.字段1,表B.字段2 from 表B where 表A.字段3=表B.字段3 ) 完整一点最好 ...

最新文章

  1. C++中基类与派生类的构造函数和析构函数
  2. R语言使用compareGroups包compareGroups函数生成表统计表、createTable函数创建二元表、并导出结果到文档(doc、csv、xlsx、pdf)
  3. python 快速行进 算法 图像修补
  4. 在kde中让gvim自动最大化
  5. CV:基于人工智能算法实现人脸口罩的实时检测(结合无人机可,实现实时警告提醒)
  6. 【Python基础】Python 流程控制专题总结
  7. python 趋势线表达式_python绘制有箭头指示的趋势线
  8. C/C++线程基本函数
  9. Android自动化测试(UiAutomator)简要介绍
  10. php RabbitMQ使用
  11. REVERSE-PRACTICE-BUUCTF-23
  12. Java中高效判断数组中是否包含某个元素
  13. 账户配置 三: Gmail
  14. flush什么意思中文翻译_flush是什么意思
  15. Android 动态生成布局 (多层嵌套)
  16. actor模型 java框架,actor模型(actor模式优缺点)
  17. matlab更改安全密钥,Linux下设置安全密钥登录
  18. android开发手机字体大小设置,安卓代码动态设置字体大小
  19. php全角数字转半角,php代码中全角数字如何转半角
  20. 台式计算机怎么进行打印机共享,台式机共享打印机的方法

热门文章

  1. 沙龙报名 | 数据库技术探索及行业应用
  2. HadoopIO和javaIO的区别
  3. leetcode 838. Push Dominoes | 838. 推多米诺(分析每个状态)
  4. 数据结构: 试用判定树的方法给出在中序线索化二叉树上: (1) 如何搜索指定结点的在中序下的后继。 (2) 如何搜索指定结点的在前序下的后继。(3) 如何搜索指定结点的在后序下的后继。
  5. leetcode 225. 用队列实现栈(维护两个队列用于倒替元素,使用和1进行按位与,实现队列切换)
  6. 网络与IO知识扫盲(五):从 NIO 到多路复用器
  7. 【MySQL查询】复杂查询:别名、外键join
  8. 看动画学算法之:二叉堆Binary Heap
  9. io_uring设计理念及使用方式总结
  10. Leet Code OJ 268. Missing Number [Difficulty: Medium]