子查询在一个select中出现多个嵌套查询语句

1、在where子句中使用子查询(一般返回"单行单列" "单行多列" "多行单列"(可以提供in、any、all ))

示例1:查找低于平均工资的雇员信息(返回单行单列)

select * from emp where sal < (select avg(sal) from emp)

示例2:查找出公司最早雇佣的雇员信息(返回单行单列)

select * from emp where hiredate =(select min(hiredate) from emp) 

示例3:与scott从事同一个工作,且工资相同(返回多行单列)--但是一般不这么使用

select * from emp
where ((job, sal)= (select job, sal from emp where ename='SCOTT')) and (ename != 'SCOTT')

在子查询返回多行单列的时候,可以使用in、any、all 进行比较

⑴   in和not in(不能与null一起使用)的用法

示例:查询和职位是MANAGER工资不同的员工信息

select * from emp
where sal not in (select sal from emp where job='MANAGER') ;

⑵  any的用法(  “>any”大于最小的 “<any”小于最大的)

示例1:查询和职位是MANAGER工资相同的员工信息(”=any”和in一样用法)

select * from emp
where sal =any (select sal from emp where job='MANAGER') ;

示例2:查询比职位是MANAGER工资最低工资还高的员工信息(”>any”就是比最小的大)

select * from emp
where sal >any (select sal from emp where job='MANAGER') ;

示例3:查询比职位是MANAGER工资最高工资还低的员工信息(”<any”就是比最大的小)

select * from emp
where sal <any (select sal from emp where job='MANAGER') ;

⑶  all的用法(“>all”比最大的大 “<all”比最小的小)

示例1:查询比职位是MANAGER工资都高的员工信息(”>all”就是比最大的还大)

select * from emp
where sal >all (select sal from emp where job='MANAGER') ;

示例2:查询比职位是MANAGER工资都低的员工信息(”<all”就是比最小的还小)

select * from emp
where sal <all (select sal from emp where job='MANAGER') ;

2、在having子句中使用子查询,使用的情况只有在子查询返回单行单列,并且使用统计函数的情况

示例1:查询出高于公司平均工资的员工的职位名称,职位人数,平均工资

select job, count(empno), avg(sal)
from emp
group by job
having avg(sal) > (select avg(sal) from emp) ;

3、在select子句中使用子查询(返回单行单列,不过一般不使用)

示例1:查询每个雇员的编号、姓名、职位、部门名称

使用多表查询:

select e.empno, e.ename, e.job, d.dname
from emp e, dept d
where e.deptno=d.deptno(+) ;

使用select子查询:

select e.empno, e.ename, e.job, (select dname from dept d where e.deptno=d.deptno) dname
from emp e ;

4、在from子句中使用子查询(返回多行多列)

示例1:查询每个部门名称、位置、部门人数

使用多表查询:

select d.dname, d.loc, count(empno)
from emp e, dept d
where e.deptno=d.deptno(+)
group by d.dname, d.loc ;

使用from子查询:

  |-查询部门的名称、位置、编号

select deptno, dname, loc from dept ; 

  |-查询部门的编号和部门人

select  deptno, count(empno)
from emp
group by deptno ;

  |-实现在from的子查询,相当与将两张表做多表连接查询

select d.dname, d.loc, temp.count
from dept d, (select deptno, count(empno) count from emp group by deptno ) temp
where d.deptno=temp.deptno(+) ;

注意:1、当子查询返回单行单列、多行单列、单行多列的情况,在where子句中实现子查询

   2、having子句中使用子查询,使用的情况只有在子查询返回单行单列,并且使用统计函数的情况

     3、当子查询返回多行多列的情况,在from子句中实现子查询

     4、一般不在select子句中实现子查询

Oracle 数据库基础学习 (六) 子查询的更多相关文章

  1. 数据库Mysql的学习(六)-子查询和多表操作

    )*0.05 WHERE card_id ='20121xxxxxx'; //子查询就是一个嵌套先计算子查询 SELECT * FROM borrow WHERE book_id =(SELECT b ...

  2. Oracle 数据库 基础学习 (一) SQL基本知识

    Oracle 从零开始,不知所措.要掌握一种技能,最好的方式是先学会怎么使用它,然后再深入学习,先有样子,再有技术.   一,什么是数据库? 为什么需要数据库? 数据库实质上是一个信息的列表,或者是一 ...

  3. Oracle 数据库基础学习 (七) SQL语句综合练习

    一.多表查询综合练习 1.  列出高于在30部门工作的所有人员的薪金的员工的姓名.部门名称.部门编号.部门人数 分析: 需要的员工信息: |-emp表:姓名.部门编号 |-dept表:部门名称.部门编 ...

  4. Oracle 数据库基础学习 (五) 多表查询

    多表查询:查询结果需要用到两个或者以上表,此时需要多表连接,产生多表查询 1.内连接(等值连接) 示例:将两个表内容连接显示 select * from dept d, emp e where d.d ...

  5. Oracle 数据库基础学习 (三) Oracle 四个表结构

    Oracle 四个表的 emp dept  salgrade  bunus 的结构,记住有利于后期SQL语句的学习 雇员表(emp) No. 字段 类型 描述 1 empno NUMBER(4) 表示 ...

  6. Oracle 数据库基础学习 (四) group by的使用

      group by分组查询 示例:要求查询出每个部门的编号,人数,以及最高和最低工资  select deptno, count(empno), max(sal), min(sal) from em ...

  7. Oracle 数据库基础学习 (二) 学习小例子:创建一个表,记录商品买卖的情况

      运行环境:Oracle database 11g + PL/SQL Developer ex: --创建一个表 create table plspl_test_product( --加入not n ...

  8. Oracle 数据库基础学习 (八) PL/SQL综合练习

    1.定义游标:列出每个员工的姓名.部门名称并编程显示第10个到第20个记录. declare cursor zemp_cursor is (select temp.ename, temp.dname ...

  9. Mysql数据库基础学习笔记

    Mysql数据库基础学习笔记 1.mysql查看当前登录的账户名以及数据库 一.单表查询 1.创建数据库yuzly,创建表fruits 创建表 ) ) ,) NOT NULL,PRIMARY KEY( ...

随机推荐

  1. Atitit j2ee5 jee5 j2ee6 j2ee7 jee6 jee7 新特性

    Atitit j2ee5 jee5 j2ee6 j2ee7 jee6 jee7 新特性 Keyword Java ee5 ,Java ee6,Java ee7  j2ee5 jee5 j2ee6 j2 ...

  2. Atitit 判断判断一张图片是否包含另一张小图片

    Atitit 判断判断一张图片是否包含另一张小图片 1. keyword1 2.  模板匹配是在图像中寻找目标的方法之一(切割+图像相似度计算)1 3. 匹配效果2 4. 图片相似度的算法(感知哈希算 ...

  3. iOS开发——网络使用技术OC篇&网络爬虫-使用正则表达式抓取网络数据

    网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...

  4. Cocos2d-x 3.2 学习笔记(六)Layer

    Layer 游戏中的背景容器,Layer类是Node类的一个子类,它实现了触屏事件代理(TouchEventsDelegate)协议. LayerColor是Layer的一个子类,它实现了RGBAPr ...

  5. 如何使用office2010插入屏幕截图

    当我们习惯了用QQ的屏幕截图之后,当某一天我们在一台没有装QQ的办公电脑上,它装着office2010,我们可以实现用office来截图吗?其实Office2010深藏着犀利的截图工具. 插入图片到文 ...

  6. JS实现单击按钮后弹出新的窗口页面

    点击按钮后,弹出指定大小的页面窗口. 效果图: 源码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...

  7. AngularJS入门心得1——directive和controller如何通信

    粗略地翻了一遍<JavaScript DOM编程艺术>,就以为可以接过AngularJS的一招半式,一个星期过去了,我发现自己还是Too Young,Too Simple!(刚打照面的时候 ...

  8. 实例演示Android异步加载图片(转)

    本文给大家演示异步加载图片的分析过程.让大家了解异步加载图片的好处,以及如何更新UI.首先给出main.xml布局文件:简单来说就是 LinearLayout 布局,其下放了2个TextView和5个 ...

  9. 使用python selenium webdriver模拟浏览器

    selenium是进行web自动化测试的一个工具,支持C,C++,Python,Java等语言,他能够实现模拟手工操作浏览器,进行自动化,通过webdriver驱动浏览器操作,我使用的是chrome浏 ...

  10. java并发编程:并发容器之CopyOnWriteArrayList(转)

    原文:http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开大家都在共享同一个内容,当某个 ...