oracle子查询

所谓的子查询就是在一个完整的查询语句中嵌套若干个不同功能的小查询,从而完成各自复杂查询。

我们最常见的是在WHERE里面嵌套子查询,比如说:select * from emp where sal<(select sal from emp where ename='ALLEN')像这种就是一种子查询。

当然上面的WHERE里面的查询结果是返回单行单列的,那么如果返回的结果是单行多列怎么办呢?

我们科以通过(字段1,字段2)来实现,比如:select * from emp where (job,sal)=(select job,sal from emp where ename='ALLEN')

当然如果有单行多列那么就会有多行单列的情况,那么当遇到这种情况我们怎么使用子查询呢?

oracle中提供了IN,ANY,ALL三个操作符处理这种情况:

IN操作符:表示一个查询范围,如果子查询中是多行一列那么我们就可以使用IN指定范围,比如

select * from emp where sal IN (select MIN(sal) from emp GROUP BY deptno);

在IN前面加NOT也可表示不再此范围内

注意:null值会对NOT IN有影响,如果子查询语句中的返回结果集存在Null那么使用NOT IN 将会没有任何结果,这跟限定查询中NOT IN 类似

ANY操作符:表示子查询中返回的每个结果进行比较

=ANY:表示与子查询中的每个元素进行比较,与IN类似(但是<>ANY并不等于NOT IN)

>ANY:比子查询中返回的最小结果要大,包含等于

拿>ANY举例:select * from emp where sal >ANY(select MIN(sal) from emp where job='MANAGER' GROUP BY deptno)

ALL操作符:功能与ANY类似

<>ALL:等价于NOT IN,但是=ALL不等价与IN

>ALL:比子查询中最大的值还要大,包括等于

此处就不举例说明了

不单单在WHERE里面可以使用子查询,在其他里面也同样可以

在HAVING中使用子查询

select deptno,COUNT(empno),AVG(sal) from emp GROUP BY deptno HAVING AVG(sal)>(select AVG(sal) from emp);

在FROM中使用子查询

select d.deptno,d.dname,d.loc,temp.count,temp.avg from dept d,(select deptno,COUNT(empno) count,ROUND(AVG(sal),2) avg from emp GROUP BY deptno) temp

where d.deptno = temp.dno(+);

在SELECT中使用子查询

select deptno,dname,loc,(select COUNT(empno) from emp where deptno=d.deptno) count from dept d;

你可能感兴趣的:(数据库,oracle,子查询)