zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    北航软院2012级C#期末考试部分考题解答
    题目1013:开门人和关门人(字符串处理)
    char * 与char []探究理解
    题目1017:还是畅通工程(最小生成树)
    最小生成树(Prim算法+Kruskal算法)
    题目1018:统计同成绩学生人数(hash简单应用)
    GoogLeNet InceptionV2/V3/V4
    Python库
    卷积为什么如此强大?一文全解深度学习中的卷积
    神经网络训练tricks
  • 原文地址:https://www.cnblogs.com/kylyww/p/5290772.html
Copyright © 2011-2022 走看看