Oracle---SQL子查询---详解
子查询其实就是指嵌入到其他语句中的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子查询---详解的更多相关文章
- Mysql高手系列 - 第12篇:子查询详解
这是Mysql系列第12篇. 环境:mysql5.7.25,cmd命令中进行演示. 本章节非常重要. 子查询 出现在select语句中的select语句,称为子查询或内查询. 外部的select查询语 ...
- oracle 子查询详解 in和exists的区别
sql允许多层嵌套,子查询是嵌套在其他查询中的查询.我们可以把子查询当做一张表来看到,即外层语句可以把内嵌的查询结果当做一张表使用. 子查询查询结果有三种情况 不返回查询记录.若子查询不返回记录则主查 ...
- Oracle SQL优化规则详解
1. 选用适合的Oracle优化器 Oracle的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.o ...
- SQL常规查询详解
一.交叉连接(cross join) 交叉连接(cross join):有两种,显式的和隐式的,不带on子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的. 语句1:隐 ...
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
为什么说JAVA中要慎重使用继承 这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...
- Oracle的exp/imp详解
原文地址:Oracle的exp/imp详解 作者:jxlazzw 备份概述 逻辑备份:备份可分为两类 ,物理备份和逻辑备份 物理备份:该方法实现数据库的完整恢复,但需要极大的外部存储设备,例如磁带库, ...
- oracle中imp命令详解 .
转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...
- oracle expdp/impdp 用法详解
http://hi.baidu.com/hzfsai/item/4a4b3fc4b1cf7e51ad00efbd oracle expdp/impdp 用法详解 Data Pump 反映了整个导出/导 ...
- sql各种连接详解
迁移时间:2017年6月1日16:33:58 CreateTime--2016年9月14日11:19:00Author:Marydon sql各种连接详解 参考链接: http://www.jb5 ...
随机推荐
- JVM性能优化, Part 5 Java的伸缩性
很多程序员在解决JVM性能问题的时候,花开了很多时间去调优应用程序级别的性能瓶颈,当你读完这本系列文章之后你会发现我可能更加系统地看待这类的问题.我说过JVM的自身技术限制了Java企业级应用的伸缩性 ...
- 【WEB】高并发Web服务的演变-节约系统内存和CPU
目前主流浏览器通常可以存在2-6个并发. 连接和请求,占据了服务器的大量CPU和内存等资源.在资源数目超过100+的网站页面中,使用更多的下载连接,非常有必要. 缓解“高并发”的压力的手段. 一. W ...
- python基础1 ---python简介
python基础 一.python前言 1.什么是编程语言 编程语言是程序员与计算机之间沟通的介质. 2.编程语言的分类 机器语言:机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集 ...
- 每天一个Linux命令(29)du命令
du命令是对文件和目录磁盘使用的空间的查看. (1)用法: 用法: du [选项] [文件] (2)功能: 功能: 报告磁盘空间使用情况 (3) ...
- 【九】MongoDB管理之安全性
要保证一个安全的MongoDB运行环境,DBA需要实施一些控制保证用户或应用程序仅仅访问它们需要的数据.这些措施包括但不限于: 认证机制 基于角色的访问控制 加密 审计 一.认证机制 认证是验证客户端 ...
- 【四】MongoDB索引管理
一.索引介绍 在mongodb中,索引用来支持高效查询.如果没有索引,mongodb必须在整个集合中扫描每个文档来查找匹配的文档.但是如果建立合适的索引,mongodb就可以通过索引来限制检查的文档数 ...
- 第一篇 css导入方式 及选择器
一 推荐资料 推荐书籍 css Zen Garden 中文(css禅意花园) 二.css样式 1.css样式表特征 继承性 大多数css的样式规则可以被继承 层叠性 1)可以定义 多个样式 2)不冲 ...
- ibdata1文件非常大如何解决,ibdata单独存储
启用独立表空间innodb_file_per_table(如果这个参数没有开启,mysql会将数据.索引.元数据都存入到ibdata中的) 数据表 表索引 MVCC(多版本并发控制)数据 回滚段 撤销 ...
- ajax技术返回json如何处理
json只是一种文本字符串. Smarty是一个使用PHP写出来的模板引擎. ajax如何处理json数据格式 ①json的格式如下: "{属性名:属性值,属性名:属性值}". 因 ...
- 数据库+maven
1.mysql <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-ja ...