Oracle 子查询(复杂select语句)
在执行数据操作时,如果某个操作需要依赖于另外一个 select语句的查询结果,那么就可以把 select 语句迁入到该操作语句中,这样就形成了一个子查询。实际应用中,表与表之间相互关联,相互依存,这样就可以根据数据之间的关系使用相应的子查询,从而实现复杂的查询。
一、子查询
子查询是在 SQL 语句内的另外一条 select 语句,也被称为内查询或是 内select语句。在select、insert、update 或delete 命令中允许是一个表达式的地方都可以包含子查询,子查询也可以包含在另外一个子查询里面中。
EG:
SQL > select empno,ename,job from emp
where deptno = (select deptno from dept where dname="research");
表示在emp表中查询部门名称为(dname)为“research” 的员工信息。
分析:原来在 emp 表中不存在 dname 字段,但 emp 表中存在 depno字段(部门代码);dname 字段原本存在 dept 表中,并且 deptno 字段也存在 dept表中,所有 deptno 为两个表之间的关联字段,这样就可以通过多表关联查询来实现。等同于下面的多表查询:
SQL > select empno,ename,job from emp join dept on emp.deptno = dept.deptno
where dept.dname = 'research';
从上可以看出,相比于多表关联查询,子查询更加灵活、功能更强大,而且更容易理解。但是多表关联查询的效率要高于子查询。
在执行子查询操作的语句中,子查询也称为内查询,包含子查询的查询语句也被称为外查询或主查询。
在执行查询时,外查询语句检索一行,子查询语句需要检索一遍数据,然后判断外查询语句的条件是否满足。如果满足,则外查询语句将检索到数据行添加到结果集中,如果条件不满足,则外查询语句继续检索下一行数据,所有子查询相对多表关联查询要慢。
注意:
- 子查询语句必须用括号 "()" 括起来。
- 子查询中不能包括 order by 子句。
- 子查询运行嵌套多层,但不能超过255层。
二、单行子查询
单行子查询是指返回一行数据的子查询语句。当在 where 子句中引用单行子查询时,可以使用当行比较运算符(=、>、<、>=、<=和<>)。
EG:
SQL > select empno,ename,sal from emp
where sal > (select min(sal) from emp) and sal < (select max(sal) from emp);
注意:
- 内层子查询的执行结果如果为空值,那么外层的 where 子句就始终不会满足条件,这样的查询结果就必然为空值
- 执行单行子查询时,要注意子查询的返回结果必须是一行数据,否则 Oracle 系统会提示无法执行。
- 子查询中不能包含 order by 子句,如果非要进行排序的话,那么只能在外查询语句中使用 order by 子句。
三、多行子查询
多行子查询是指返回多行数据的子查询语句。当在 where 子句中使用多行子查询时,必须使用多行运算符(in、any、all)。
1、使用 in 运算符
当在多行子查询中使用 in 运算符时,外查询会尝试与子查询结果中的任何一个结果进行匹配,只要有一个匹配成功,则外查询返回当前检索的记录。
EG:
SQL > select empno,ename,job
from emp where deptno in
(select deptno from dept where dname<>'sales');
2、使用 any 运算符
any 运算符必须与单行比较运算符结合使用,并且返回行只要匹配子查询的任何一个结果即可。
EG:
SQL > select deptno,ename,sal from emp where sal > any
(select sal from emp where deptno = 10) and deptno <> 10;
表示从emp表中,查询工资大于部门编号为10的任意一个员工工资即可的其他部门的员工信息。
3、使用 all 运算符
all 运算符必须与单行运算符结合使用,并且返回行必须匹配所有子查询结果。
EG:
SQL > select deptno,ename,sal from emp where sal > all
(select sal from emp where deptno = 30);
表示从emp表中,查询工资大于部门编号为 30 的所有员工工资的员工信息。
四、关联子查询
在单行子查询和多行子查询中,内查询和外查询是分开执行的,也就是说内查询的执行与外查询的执行时没有关系的,外查询仅仅是使用内查询的最终结果。在一些特殊需求的子查询中,内查询的执行需要借助于外查询,而外查询的执行又离不开内查询的执行,这时,内查询和外查询是相互关联的,这种子查询就被称为关联子查询。
EG:
SQL > select empno,ename,sal from emp f
where sal > (select avg(sal) from emp where job = f.job)
order by job;
表示在emp表中,使用“关联子查询”检索工资大于同职位的平均工资的员工信息。
注意:
- 在执行关联子查询的过程中,必须遍历数据表中的每条记录,因此如果被遍历的数据表中有大量的数据记录,则关联子查询的执行速度会比较慢。
- 关联字查询不仅仅可以作为 select 语句的子查询,也可以作为 insert 、 update或 delete 语句的关联子查询。
Oracle 子查询(复杂select语句)的更多相关文章
- sql子查询 嵌套SELECT语句
嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值.子查询不但能够出现在Where子句中,也能够出现在from子句中,作为一个临时表使用,也能够出现在sele ...
- Oracle 子查询
1.子查询在SELECT.UPDATE.DELETE语句内部可以出现SELECT语句.内部的SELECT语句结果可以作为外部语句中条件子句的一部分,也可以作为外部查询的临时表.子查询的类型有: ① 单 ...
- Oracle子查询相关内容(包含TOP-N查询和分页查询)
本节介绍Oracle子查询的相关内容: 实例用到的数据为oracle中scott用户下的emp员工表,dept部门表,数据如下: 一.子查询 1.概念:嵌入在一个查询中的另一个查询语句,也就是说一个查 ...
- Oracle子查询之高级子查询
Oracle 高级子查询 高级子查询相对于简单子查询来说,返回的数据行不再是一列,而是多列数据. 1,多列子查询 主查询与子查询返回的多个列进行比较 查询与141号或174号员工的manager_id ...
- Oracle子查询中any、some、all之间的区别
用some,any和all对子查询中返回的多行结果进行处理. 下面我们来简单介一下这几个关键词的含义. * Some在此表示满足其中一个的意义,是用or串起来的比较从句. * Any也表示满足其中一个 ...
- oracle数据库查询日期sql语句(范例)、向已经建好的表格中添加一列属性并向该列添加数值、删除某一列的数据(一整列)
先列上我的数据库表格: c_date(Date格式) date_type(String格式) 2011-01-01 0 2012-03-07 ...
- oracle 子查询的几个种类
1.where型子查询: select cat_id,good_id,good_name from goods where good_id in (selct max(good_id) from go ...
- oracle 子查询和组合函数
oracle 子查询和组合函数 --查询与"SCOTT"在同一个部门的员工 select empno,ename,deptno from emp where deptno in ( ...
- 一道Oracle子查询小练习
一道Oracle子查询小练习 昨天晚上躺在床上看Oracle(最近在学习这个),室友说出个题目让我试试.题目如下: 有如下表结构,请选择出成绩为前三名的人的信息(如果成绩相同,则算并列),表名为t ...
随机推荐
- npm版本管理 命令
npm采用了semver规范作为依赖版本管理方案.semver 约定一个包的版本号必须包含3个数字 MAJOR.MINOR.PATCH 意思是 主版本号.小版本号.修订版本号 MAJOR 对应大的版本 ...
- index row size 2720 exceeds maximum 2712 for index "xxx" ,Values larger than 1/3 of a buffer page cannot be indexed.
记录一个bug情况: 我有个表NewTable,复合主键(slaveid,resid,owner) CREATE TABLE "public"."NewTable&quo ...
- python爬虫案例:使用XPath爬网页图片
用XPath来做一个简单的爬虫,尝试爬取某个贴吧里的所有帖子,并且将该这个帖子里每个楼层发布的图片下载到本地. # -*- coding:utf-8 -*- import urllib import ...
- SpringBoot项目实现配置实时刷新功能
需求描述:在SpringBoot项目中,一般业务配置都是写死在配置文件中的,如果某个业务配置想修改,就得重启项目.这在生产环境是不被允许的,这就需要通过技术手段做到配置变更后即使生效.下面就来看一下怎 ...
- CentOS离线状态下安装Python3.7.0
1.下载python安装包以及依赖的包 python安装包:Python-3.7.0 下载地址:www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz ...
- python中urllib的urlencode与urldecode
当url地址含有中文,或者参数有中文的时候,这个算是很正常了,但是把这样的url作为参数传递的时候(最常见的callback),需要把一些中文甚至'/'做一下编码转换. urlencode urlli ...
- 【翻译】Flink Table Api & SQL —Streaming 概念 ——时间属性
本文翻译自官网: Time Attributes https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/str ...
- 【Python学习之二】Python基础语法
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 python3.6 一.Python的注释及乱码1.单行注释:以#开头 ...
- 使用vue开发微信公众号,解决微信缓存
1.页面加入标红的代码,让页面不缓存 <!DOCTYPE html> <html manifest="IGNORE.manifest"> <head& ...
- layui父页面执行子页面方法
parent.window[layero.find('iframe')[0]['name']].子页面方法(); layero.find('iframe')[0].contentWindow.子页面方 ...