欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

oracle 子查询 where having from ,from子查询提高效率

程序员文章站 2024-01-26 23:08:40
where 子查询主要功能是控制数据行的,返回结果一般都是单行单列、多行单列、单行多列数据 单行单列 多行单列 (使用不多) 多行单列 使用三个判断符号:IN、ANY、ALL 此时有一个需要注意的小问题了:在使用 NOT IN 的时候子查询之中必须不能包含 null,否则不会有任何数据返回。 · = ......

where 子查询主要功能是控制数据行的,返回结果一般都是单行单列、多行单列、单行多列数据

单行单列

select *

from emp

where hiredate=(

  select min(hiredate)

  from emp) ;

多行单列 (使用不多)

select *

from emp

where (sal,job)=(

  select sal,job

  from emp

  where ename='scott')

  and ename<>'scott' ;

多行单列 使用三个判断符号:in、any、all

select *

from emp

where sal not in (

  select sal

  from emp

  where job='manager') ;

此时有一个需要注意的小问题了:在使用 not in 的时候子查询之中必须不能包含 null,否则不会有任何数据返回。

· =any:此功能与 in 操作完全一样

· >any:比子查询的最小值要大;

· <any:比子查询的最大值要小

· >all:比子查询返回的最大值还要大

· <all:比子查询最小值还要小

 

在 having 子句之中使用子查询只能够返回单行单列的数据

select job,avg(sal)

from emp

group by job

having avg(sal)=(

select min(avg(sal))

from emp

group by job

)

//分组函数嵌入太深错误
select job,avg(sal)
from emp
group by job
having avg(sal) = min(avg(sal))

from 子句的主要功能是确定数据来源,而且数据来源应该都是数据表,表是一种行列的集合。所以就证明如果在
from 子句里面出现的子查询,其返回的结果一定是多行多列数据。

select d.deptno,d.dname,d.loc,temp.count,temp.avg
from dept d , (
    select deptno ,count(empno) count,avg(sal) avg
    from emp
    group by deptno) temp 
where d.deptno=temp.deptno(+) ;
select d.deptno,d.dname,d.loc,count(empno) count,avg(sal) avg
from dept d ,emp e 
where d.deptno=e.deptno(+)
group by d.deptno,d.dname,d.loc

多字段分组和from子查询的区别?

即:此时 emp 表之中存在有 14000 条数据,dept 表中存在有 4000 条数据。

多表查询一定会产生笛卡儿积

多字段分组:积的数量:emp 的 14000 条 * dept 的 4000 条 = 56,000,000 条数据;

from子查询:

|- 第一步(内嵌子查询):针对于 emp 表查询,最多操作 14000 条记录,最多返回 4000 条记录;
|- 第二步,子查询和 dept 表关联;
|- 积的数量:dept 表的 4000 条 * 子查询返回的最多 4000 条 = 16000000 条记录;
|- 总的数据量:16000000 + 14000 = 16,014,000 条记录

主要目的:子查询的出现主要是为了解决多表查询之中的性能问题。

次要目的:很多时候在 from 子句里面使用子查询,是因为在外部查询里无法再继续使用统计函数操作的时