Oracle-子查询

来源:互联网 发布:男士乳液推荐知乎 编辑:程序博客网 时间:2024/06/15 17:44

Oracle-子查询

子查询就是位于SELECT、UPDATE、或DELETE语句中内部的查询
本文中涉及到的表:
T1

概述

在MySQL文档中给出的子查询的优势:
1)子查询允许结构化的查询,这样就可以把一个语句的每个部分隔离开。
2)有些操作需要复杂的联合和关联。子查询提供了其它的方法来执行这些操作。
3)在许多人看来,子查询是可读的。实际上,子查询给予人们调用早期SQL“结构化查询语言”的原本的想法,这是子查询的创新。

其实使用子查询可以将一些未知事物查出来, 其实就是帮助我们把未知的分解成已知的,就像问题分步走一样。
例如这个问题: 查询工资比SMITH高的员工信息 —> 要想的到我们想要查询的员工信息,我想我们应该先查询出来SMITH的工资。
我们对这个问题进行分解:
第一:查询SMITH的工资?
select sal from emp where ename = ‘SMITH’; //我们得到SMITH的工资为1250, 然后问题就变为了下一步!
第二:查询工资比1250高的员工信息?
select * from emp where sal > 1250;

然后我们利用子查询将这两步查询合成一个SQL语句。
select *
from emp
where sal > (
select sal
from emp
where ename = ‘WARD’
);

NT:子查询即可与父查询针对同一张表,也可以不针对同一张表
并且子查询与父查询在传统参数时,数量、类型、含义要相同

子查询的规则

1)将子查询括在括号中
2)将子查询放置在比较条件的右侧
3)只有在执行排序Top-N分析时,子查询中才需要使用ORDER BY 子句
4)单行运算符用于单行子查询,多行运算符用于多行子查询

单行子查询

就是子查询只会返回一个结果, 例如一个子查询返回数值800. 我们的父查询可以使用这些符号来进行比较 =、<>、>=、<=

例如: 查询工资最低的员工信息
第一:查询出工资最低是多少?
select min(sal) from emp; //结果为800
第二:查询工资为800的员工信息?
select * from emp where sal = 800;
子查询:
select *
from emp
where sal = (
select min(sal)
from emp
);

多行子查询

子查询会返回多于一个结果,例如一个子查询返回:30,20。父查询用in/any/all这些符号来比较

->in接收子查询结果
例如:查询部门名为’ACCOUNTING’或’SALES’的员工信息
select *
from emp
where deptno in (
select deptno
from dept
where dname in (‘ACCOUNTING’,’SALES’)
);

->any接收子查询结果
在oracle看来小于any即小于any集合中的最大值。
例如:查询工资比20号部门【任意any】一个员工工资【低<】的员工信息
select *
from emp
where sal

子查询与多表查询

在有些情况下,子查询可以解决的问题,多表查询也是可以解决的,那么他们之间如何选择呢?
看下图:
这里写图片描述

即在Oracle下,我们应优先考虑多表查询。

0 0
原创粉丝点击