Oracle Day04 子查询

1.子查询解决什么问题: 当一个简单的查询查询不到结果的时候,可以使用子查询来丰富查询的条件以达到显示结果的目的。

  子查询的格式: 用一个小括号包含,然后在里面写sql语句
2.子查询的注意事项:

  1).注意一定要有小括号
  2).一定要注意书写格式,不要混乱。
  3). 子查询可以放在select,from ,where having后面
    4). 注意子查询一定不能放在group by的后面
  5). 子查询和主查询可以不是同一张表,只要子查询的结果在主查询中能用就可以。
  6). 子查询中一般都不排序,但是在TOP-N中需要排序
  7). 一般是先执行子查询操作,再执行主查询操作,但是在相关子查询中先执行主查询,再执行子查询
  8). 对于子查询的结果,如果是单行只能用单行操作符;如果是多行,只能用多行操作符
  9). 自查中的null处理

3.例

  1)-- 子查询放在select后面

     select ename,job,(select sal from emp where empno=7566) 子查询 from emp;

    注意:放在select后面的时候结果只能是单行的。

  2)-- from后面放置子查询   重点掌握

    -- 查询员工的姓名 工资 job

    select * from  (
         select ename,job,sal from emp
             );

  3)-- where 后面跟子查询

    select * from emp

    where sal > (
           select sal from emp where ename = (
             select ename from emp where empno = 7566
              )
            );

    注意: 子查询不能过多的去嵌套,一般嵌套三层,加多了会影响性能。

  4)order by 后面不能跟子查询,语法上是可以跟的,但是跟了不起作用。

  5)--子查询和主查询可以不是同一张表,只要子查询的结果在主查询中能用就可以

     -- 查询部门名称为SAL的所有的员工信息

    select *
      from emp
      where deptno=(
           select deptno from dept where dname='SALES'
             );

  6)--对于子查询的结果,如果是单行只能用单行操作符;如果是多行,只能用多行操作符。

     单行操作符: ><= <= !=
    -- 查询部门号不为30的员工信息
    select * from (select * from emp where deptno != 30);

    select * from (select * from emp where deptno <> 30);

    -- <> 用来表示不等于


     多行操作符 in, not in,any,all.
     -- 查询和SCOTT用户和CLARK用户共同部门的所有员工

    select * from emp

      where deptno in(
             select deptno from emp where ename='SCOTT' or ename='CLARK'
            );

  例1:子查询中的Top-N问题

1 select rownum,empno,ename,sal 
2 from (
3     select rownum r,empno,ename,sal 
4     from emp  
5     order by sal desc) 
6 where rownum<=3;

  例2:

1 select empno,ename,sal,avgsal
2 from emp e,(
3             select deptno,avg(sal) avgsal 
4             from emp 
5             group by deptno) d
6 where e.deptno = d.deptno and e.sal > d.avgsal;

  例3:

1 select sum(1) "total", 
2  sum(decode(to_char(hiredate,'yyyy'),'1980',1,0)) "1980",
3  sum(decode(to_char(hiredate,'yyyy'),'1981',1,0)) "1981",
4  sum(decode(to_char(hiredate,'yyyy'),'1982',1,0)) "1982",
5  sum(decode(to_char(hiredate,'yyyy'),'1987',1,0)) "1987" 
6 from emp;

 

posted @ 2016-03-18 09:19  wentaokyle  阅读(235)  评论(0编辑  收藏  举报
其他资源可以访问我的CSDN博客