Oracle-----子查询简介&where子句使用子查询

Oracle数据库 专栏收录该内容
37 篇文章 6 订阅

上一篇👉:Oracle-----多表查询与分组统计&having子句&分组案例


总目录👉震惊!史上最菜的Oracle 11g教程(大佬勿进)


🚴大家好!我是近视的脚踏实地,这篇文章主要是来学习Oracle的子查询简介以及学习在where子句后边使用子查询
     唯有行动  才能解除你所有的不安

1、子查询简介

在整个SQL查询语句过程中,子查询并不是具备特殊的语法,也就是说在整个SQL查询操作里面子句:select、from、where、group by、having、order by。所有如果非要给出子查询的语法,那么只能够进行拼凑。

【⑤选出所需要的数据列】select [distinct] * | 分组列 [别名],分组列 [别名],分组列 [别名]…,(
          
【⑤选出所需要的数据列】select [distinct] * | 分组列 [别名],分组列 [别名],分组列 [别名]…
          【①确定数据来源(行与列的集合)】from 表名称 [别名],表名称 [别名]…
          【②筛选数据行】[where 限定条件(s)]
          【③针对于筛选的行分组】[group by 分组字段,分组字段,分组字段…]
          【④针对于筛选的行分组】[having 分组过滤]
          【⑥数据排序】[order by 排序字段 [ASC | DESC],排序字段 [ASC | DESC],…])
【①确定数据来源(行与列的集合)】from 表名称 [别名],表名称 [别名]…,(
          
【⑤选出所需要的数据列】select [distinct] * | 分组列 [别名],分组列 [别名],分组列 [别名]…
          【①确定数据来源(行与列的集合)】from 表名称 [别名],表名称 [别名]…
          【②筛选数据行】[where 限定条件(s)]
          【③针对于筛选的行分组】[group by 分组字段,分组字段,分组字段…]
          【④针对于筛选的行分组】[having 分组过滤]
          【⑥数据排序】[order by 排序字段 [ASC | DESC],排序字段 [ASC | DESC],…])
【②筛选数据行】[where 限定条件(s),(
          
【⑤选出所需要的数据列】select [distinct] * | 分组列 [别名],分组列 [别名],分组列 [别名]…
          【①确定数据来源(行与列的集合)】from 表名称 [别名],表名称 [别名]…
          【②筛选数据行】[where 限定条件(s)]
          【③针对于筛选的行分组】[group by 分组字段,分组字段,分组字段…]
          【④针对于筛选的行分组】[having 分组过滤]
          【⑥数据排序】[order by 排序字段 [ASC | DESC],排序字段 [ASC | DESC],…])]
【③针对于筛选的行分组】[group by 分组字段,分组字段,分组字段…]
【④针对于筛选的行分组】[having 分组过滤,(
          
【⑤选出所需要的数据列】select [distinct] * | 分组列 [别名],分组列 [别名],分组列 [别名]…
          【①确定数据来源(行与列的集合)】from 表名称 [别名],表名称 [别名]…
          【②筛选数据行】[where 限定条件(s)]
          【③针对于筛选的行分组】[group by 分组字段,分组字段,分组字段…]
          【④针对于筛选的行分组】[having 分组过滤]
          【⑥数据排序】[order by 排序字段 [ASC | DESC],排序字段 [ASC | DESC],…])]
【⑥数据排序】[order by 排序字段 [ASC | DESC],排序字段 [ASC | DESC],…]

(所有可能出现的子查询都需要使用"()"声明。然后子查询可以出现在select后边,可以出现在from后边,可以出现在where后边,可以出现在having后边,那么子查询实际上就是所谓的查询嵌套,而且从理论上来讲,查询子句任意位置上都可以随意出现子查询。但是出现子查询最自多的位置:”where、from。所以现在针对于子查询的出现给出几个个人的参考使用方案:)

     where子句:子查询返回单行单列、单行多列、多行单列;
     having子句:子查询返回单行单列,而且要使用统计函数过滤
     from子句:子查询返回多行多列
     select子句:一般返回单行单列,并且需要某些查询的时候使用
(前三个使用子查询的频率是最高的。)

2、在where子句中使用子查询

where子句主要是进行数据的筛选,而且通过分析可以发现,单行单列(一个数据)、多行单列、单行多列都可以在where子句中出现。

2.1 子查询返回单行单列

2.1.1 范例1:要求查询出公司工资最低的雇员信息

范例1: 要求查询出公司工资最低的雇员信息
在这里插入图片描述
但是现在很明显,不可能拿出800这个数据直接使用,因为这个数据是需要统计出来的,而要想知道这个内容,可以利用min() 函数完成

第一步: 统计公司的最低工资,

select min(sal)
from emp;

在这里插入图片描述

第二步: 以上的查询会返回的一个单行单列的数据,本质上就是一个数值,如果说现在给了你数值,是不是可以直接利用where子句筛选所需要的数据行。

select * 
from emp
where sal=(
	select min(sal)
	from emp);

在这里插入图片描述

2.1.2 范例2:查找出公司雇佣最早的雇员

范例2: 查找出公司雇佣最早的雇员

第一步: 查找出最早的雇用日期,最早雇员一定是雇佣日期最小,那么使用 min() 函数完成

select min(hiredate)
from emp;

在这里插入图片描述
第二步: 以上的查询会返回的一个单行单列的数据,所以可以直接在where子句中使用

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

在这里插入图片描述

2.2 子查询返回单行多列(了解)

2.2.1 范例1:查找出公司雇佣最早的雇员

范例1: 查询出与scott工资相同,职位相同的所有雇员信息。
第一步: 现在需要进行同时比较的是工资与职位,现在很明显首先应该查询到scott的工资与职位。

select sal,job
from emp
where ename = 'SCOTT';

在这里插入图片描述
第二步: 此时返回了单行两列的数据信息,而要进行比较的时候肯定是同时满足。

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

在这里插入图片描述
如果不想显示scott

select * 
from emp
where (sal,job)=(
	select sal,job
	from emp
	where ename = 'SCOTT')
	and ename<>'SCOTT';

在这里插入图片描述

2.3 子查询返回多行单列(重点)

如果说子查询返回了多行单列的数据,那么实质是上就相当于告诉用户用户一个数据的操作范围。而如果要想进行范围的判断,在where子句里面提供有三个主要的运算符:in、any、all

2.3.1 范例1(in操作):查询出具备跟经理一样工资的雇员

in操作指的是内容可以在指定的范围之中存在

范例1: 查询出具备跟经理一样工资的雇员

第一步: 查询出经理的工资

select sal
from emp
where job = 'MANAGER';

在这里插入图片描述
第二步: 以上返回的是多行单列的数据,多行单列就相当于给出了一个查询范围,则要在这个范围内可以使用in操作。

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

在这里插入图片描述
对于in操作还可以使用not in 进行

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

在这里插入图片描述
可是在讲解not in操作的时候曾经说过一个问题,不能够为null,现在这一概念此处照样可以使用。

比如查询佣金的时候是有null的

select comm from emp;

在这里插入图片描述
如果这么使用not in 结果肯定是未选定行,也就是查询不到

select comm 
from emp
where comm not in(
	select comm from emp);

在这里插入图片描述
一定要保证子查询里边没有null。

2.3.2 any操作

对于any操作实质上有三种子语法:
     1、=any: 功能上与in是完全没有任何区别的

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

在这里插入图片描述
     2、>any: 比子查询返回的最小的内容要大

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

在这里插入图片描述
     3、<any: 比子查询中返回最大的值要小

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

在这里插入图片描述

2.3.3 all操作

对于all操作实质上有两种使用形式:
     1、>all: 比子查询返回最大值的值要大

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

在这里插入图片描述
     2、<all: 比子查询返回最小值的值要小

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

在这里插入图片描述

2.3.4 exists()判断

如果子查询有数据返回(不管什么数据)就表示条件满足,那么就可以显示出数据,否则不显示

2.3.4.1范例1:观察exists()操作

范例1: 观察exists()操作
那么我们首先知道是没有empno=99的记录的

select * 
from emp
where empno = 99;

在这里插入图片描述
接着来看👇:

select * 
from emp
where exists(
	select * 
	from emp
	where empno = 99);

在这里插入图片描述
那么就是因为此时的子查询没有返回任何的数据行,所以exists()就认为数据不存在,外部查询无法查询出内容

2.3.4.2范例2:观察exists()操作2

范例2: 观察exists()操作2
如果是有内容的,有值的,这个随便,不管是什么值👇:

select * 
from emp
where deptno = 7839;

在这里插入图片描述
再来看👇:

select * 
from emp
where exists(
	select * 
	from emp
	where empno = 7839);

在这里插入图片描述
使用exists()只关心子查询里面返回的是否有行,至于什么行,他不关心。相当于有行就返回true,没有就返回false。

那么用例not exists()也是同样的,只是反过来,这里就不赘述了

对in主要是进行数据的判断,exists()是针对于是否存在数据行进行判断。很明显,exists()要比in性能更高。因为判断是否有行比判断是否有某个具体的数据肯定要快。


下一篇👉Oracle-----having、select、from子句使用子查询

本篇博客到这就完啦,非常感谢您的阅读🙏,如果对您有帮助,可以帮忙点个赞或者来波关注鼓励一下喔😬 ,嘿嘿👀

  • 2
    点赞
  • 2
    评论
  • 8
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 撸撸猫 设计师:马嘣嘣 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值