子查询其实就是指嵌入到其他语句中的select语句,也称其为嵌套查询。
值得注意的在DDL语句中应用子查询的时候子查询可以使用order by 子句。
但是在DML语句中的where子句,set子句中,子查询是不能使用order by子句的。   简单例子:查询工作和SMITH一样的所有员工的信息(不包含SMITH)
  select ename ,sal from emp e where job =
  (select job from emp where ename = 'SMITH')
  and e.ename <> 'SMITH'; 子查询分类
 单行子查询
  只返回一条记录的子查询 ,就可上述例子一样
--返回工资比SMITH多的员工和工资情况
  select ename ,sal from emp where   sal>   (   select sal from emp where ename ='SMITH'   ) ;   能够用于当行子查询的操作符有>、<、=、like等等 多行子查询
  多行子查询返回的是一个记录组,也就是多条记录,这种情况对于子查询的操作就
  应该是in、any、all,exits 等。直接一个实例来看
  --查询各部门中员工工资最高的员工信息
  select ename ,deptno,sal,job from emp e   where not exists   (   select ename,deptno,job from emp   where deptno = e.deptno   and   sal > e.sal   )
  order by deptno
  ;   多行子查询的一些操作符的使用示例:
  --in操作符的使用
  --查询员工的职业类型在部门10中有的员工的信息
  select ename,job,sal,deptno from emp where job   in   (   select distinct job from emp where deptno =10   )
  ;
  ALL操作符:
  --ALL操作符的使用
  --查询员工的工资大于30号部门的所有员工的信息
  select ename,sal,deptno from emp   where sal > all   (   select sal from emp where deptno=30   )
  ;
  --">all"表示大于最大的,"
  ANY操作符:
  --ANY操作符的使用
  --只要员工的工资存在这种情况:
  --即他的工资情况比30部门的其中一个人的工资多就查询出来   select ename,sal,deptno from emp   where sal>any   (   select sal from emp where deptno = 30   )
  ;   “>ANY”意味着大于最小值,"   多列子查询
  指的是子查询语句返回的是多列。
  例如查询:某个名叫SMITH的员工,但是由于员工的名字可能出现重复,因此需要结合其工作和部门id进行判断。
  --多列子查询实例
  select ename ,job ,deptno from emp
  where (ename,job,deptno) =   (
  select ename, job,deptno from emp   where ename='SMITH'   )
  ;--这里主要在于说明多列子查询的使用,并不注重其实际意义
  ● 成对比较
  --成对比较
  select ename ,sal,comm ,deptno from emp
  where (sal,nvl(comm,-1)) in   (
  select sal,nvl(comm,-1) from emp
  where deptno = 30   );
  ● 非成对比较
  --非成对比较
  elect ename ,sal,deptno,comm from emp
  where sal in   (
  select sal from emp
  where deptno = 30
  )
  and nvl(comm,-1) in   (
  select nvl(comm,-1) from emp
  where deptno = 30   );   其他子查询
  1、相关子查询
  是指需要引用主查询表列的子查询 语句。相关子查询是通过exists 来实现的 。
  --查询在NEW YORK工作的员工的信息
  select ename ,job ,sal ,deptno from emp
  where exists
 (
  select 1 from dept
  where dept.deptno = emp.deptno   and dept.loc ='NEW YORK'
  );
   --相关子查询的执行过程:   相关子查询会引用外部查询的一列或多列,在执行的时候外部查询的每一行被一次一行的   传递给子查询,子查询依次读取外部查询传递过来的每一个值,并将其用到子查询上,直到外部   查询的所有行都用完为止,然后返回查询结果。   2、FROM子句中的子查询
  在from子句中使用子查询的时候子查询会被当做一个view对待,需要给子查询指定别名。
  --查看比本部门平均工资高的员工信息
  select ename,job,sal from emp ,   (
  select deptno,avg(sal) as avgsal from emp
  group by deptno
  ) tmp_dept
  where emp.deptno=tmp_dept.deptno and sal >tmp_dept.avgsal;
  3、DML语句中使用子查询  
  --DML语句中使用子查询
  --insert中
  insert into employee (id,name,title,salary)
  select emptno,ename ,job,sal from emp;
  --update中
  update emp set (sal,comm)=   (
  select sal,comm from emp
where ename =SMITH ) where job = ( select job from emp where ename =SMITH ) ; --去除销售部门 delete from emp where deptno = ( select deptno from dept where dname =SALES ) ; --DML语句中使用子
  where ename ='SMITH'
  )
  where job =
  (
  select job from emp where ename ='SMITH'   )
  ;
  --去除销售部门
  delete from emp where deptno =   (
  select deptno from dept
  where dname ='SALES'
  );
4、在DDL语句中使用子查询
  通过select子查询来实现创建视图的方式来说明其使用方法
  需要注意的是在执行下面的sql语句之前,要对scott用户赋予创建视图的权利
  SQL>conn / as sysdba
  SQL>grant create view to scott;
  --创建视图并查询视图
  create or replace view dept10 as
  select empno,ename ,job,sal,deptno from emp
  where deptno = 10 order by empno;
  select * from dept10;

  

Oracle---SQL子查询---详解的更多相关文章

  1. Mysql高手系列 - 第12篇:子查询详解

    这是Mysql系列第12篇. 环境:mysql5.7.25,cmd命令中进行演示. 本章节非常重要. 子查询 出现在select语句中的select语句,称为子查询或内查询. 外部的select查询语 ...

  2. oracle 子查询详解 in和exists的区别

    sql允许多层嵌套,子查询是嵌套在其他查询中的查询.我们可以把子查询当做一张表来看到,即外层语句可以把内嵌的查询结果当做一张表使用. 子查询查询结果有三种情况 不返回查询记录.若子查询不返回记录则主查 ...

  3. Oracle SQL优化规则详解

    1. 选用适合的Oracle优化器 Oracle的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.o ...

  4. SQL常规查询详解

    一.交叉连接(cross join) 交叉连接(cross join):有两种,显式的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的. 语句1:隐 ...

  5. 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结

    为什么说JAVA中要慎重使用继承   这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...

  6. Oracle的exp/imp详解

    原文地址:Oracle的exp/imp详解 作者:jxlazzw 备份概述 逻辑备份:备份可分为两类 ,物理备份和逻辑备份 物理备份:该方法实现数据库的完整恢复,但需要极大的外部存储设备,例如磁带库, ...

  7. oracle中imp命令详解 .

    转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...

  8. oracle expdp/impdp 用法详解

    http://hi.baidu.com/hzfsai/item/4a4b3fc4b1cf7e51ad00efbd oracle expdp/impdp 用法详解 Data Pump 反映了整个导出/导 ...

  9. sql各种连接详解

      迁移时间:2017年6月1日16:33:58 CreateTime--2016年9月14日11:19:00Author:Marydon sql各种连接详解 参考链接: http://www.jb5 ...

随机推荐

  1. PAT 1060. 爱丁顿数(25)

    英国天文学家爱丁顿很喜欢骑车.据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数”E,即满足有E天骑车超过E英里的最大整数E.据说爱丁顿自己的E等于87. 现给定某人N天的骑车距离,请你算出对应的爱 ...

  2. 【oracle案例】ORA-01722

    1.1.   ORA-01722 日期:2014-06-05 14:09 环境:測试环境   [情景描写叙述] 在数据库的升级过程中,运行SQL> @?/rdbms/admin/catupgrd ...

  3. 关于ionic开发中遇到的坑与总结

    这次是第二次使用ionic开发混合app,今天算是对这个框架做一个总结,基础的我就不再重复了,网上都有教程.我就说说自己的心得和遇见的各种坑, 之后会陆续补充,想到什么说什么吧. 1.关于ionic效 ...

  4. (转载)《C#高级编程》读书笔记

    C#类型的取值范围 名称 CTS类型 说明 范围 sbyte System.SByte 8位有符号的整数 -128~127(−27−27~27−127−1) short System.Int16 16 ...

  5. php输入输出

    php是服务器脚本语言,js是客户端脚本语言 php用表单接收数据,echo 输出数据,$定义变量. <?php echo $_POST["sub"]; // POST后是表 ...

  6. 第一天 格式化操作符 条件、for、while、break、continue语句

    python2和3的区别: 2中的print 不必加括号 3中的print变为函数 要加括号   2中的input不能输入字母(输入的字母被认为是变量,而之前又没定义,所以报错),默认只能计算数字,要 ...

  7. TMS Scripter importtool的使用

    uses ap_DateUtils; showmessage(dayof(now)); //注册delphi对象或变量 : IDEScripter1   IDEScripter1.AddConstan ...

  8. php: +1天, +3个月, strtotime(): +1 day, +3 month

    php: +1天, +3个月, strtotime():  +1 day, +3 month 比如,我现在当前时间基础上+1天: strtotime("+1 day"); 比如我现 ...

  9. Selenium-几种等待方式

    强制等待 一直使用的time.sleep(5),可以放在任意地方,不好的地方,不太准确确定时间 隐形等待 driver.implicitly_wait(5) 设置了一个最长等待时间,如果在规定时间内网 ...

  10. hbase_异常_02_hbase无法访问16010端口

    一.异常现象 上一个异常解决了之后,已经能正常启动hbase了,也能正常使用hbase shell  ,但是无法通过浏览器访问 16010端口. 二.异常原因 1.原因一 hbase 1.0 以后的版 ...