oracle 子查询

Posted 唐僧还在拜佛求经路。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 子查询相关的知识,希望对你有一定的参考价值。


    6-1:子查询简介
    6-2:
        select * from scott.emp
        where sal=(select MIN(sal) from scott.emp);
      范例:查找出公司雇佣最早的雇员;
        select min(hiredate) from scott.emp
      以上查询会返回单行单列的数据,所有可以直接在where语句中使用.
        select * from scott.emp
        where hiredate=(select min(hiredate) from scott.emp);
  6.1.2、子查询返回单行多列;
        范例:查询出与scott工资相同,职位相同的所有雇员信息。
          
        select * from scott.emp where (sal,job)=(select sal,job from scott.emp where ename=‘SCOTT‘);

  6.1.2.1:  找出部门10中所有经理和部门20中的所有办事员的详细资料
            select * from emp where (deptno=10 and job=upper(‘manager‘)) or (deptno=20 and job=upper(‘clerk ‘));
            找出不收取佣金或收取的佣金低于100的雇员
            select * from emp where nvl(comm,0)<100;
            找出各月最后一天受雇的所有雇员
              select * from emp where hiredate= last_day(hiredate);
            显示不带有‘R‘的雇员姓名
              Select ename from emp where ename not like ‘%R%’;

  6.1.3 子查询返回多行单列(重点)
        在where字句里面提供有主要的三个运算符:IN、ANY、ALL。

      1:IN操作;
          IN操作指的是内容可以在指定的范围之中存在,
        1.1:select sal from scott.emp where job=‘MANAGER’;
              2975
              2850
              2450
        1.2:select * from scott.emp
              WHERE (sal,job)=(
                      select sal,job FROM scott.emp where ename=‘SCOTT‘);

              多行单列就相当于给出了一个查询范围;
        对于IN操作还可以使用not IN 进行;
            select * from scott.emp
              where sal  NOT IN  (select sal from scott.emp where job=‘MANAGER’);
      select ename,sal from scott.emp where sal >(select sal from scott.emp where ename=‘BLAKE‘);
      2:ANY操作实际上有三种语法:
          1:=ANY:功能上与IN完全是没有任何区别;
            select * from scott.emp
              where sal  =ANY  (select sal from scott.emp where job=‘MANAGER’);
          2:>ANY:比子查询返回的最小的内容要大
            select * from scott.emp
              where sal  >ANY  (select sal from scott.emp where job=‘MANAGER’);
          3:<ANY:比子查询返回的最大的值要小
            select * from scott.emp
              where sal  <ANY  (select sal from scott.emp where job=‘MANAGER’);
      3:ALL操作
          ALL两种操作
          1:>ALL: 比子查询返回的最大值要大
              select * from scott.emp
              where sal  >ALL  (select * from scott.emp where job=‘MANAGER’);
          2:<ALL: 比子查询的返回最小的值要小
               select * from scott.emp
              where sal  <ALL  (select * from scott.emp where job=‘MANAGER’);
      4:EXISTS()判断
          范例:观察exists()操作
            select * from scott.emp
              where exists(select * from scott.emp where deptno=99);
            因为此时的查询没有返回任何的数据行买,所以exists()就认为数据不存在,外部查询无法查询出我内容。
          范例:观察exists()操作
            select * from scott.emp
              where exists(select * from scott.emp where empno=7839);
          范例:观察exists()操作
            select * from scott.emp
              where exists (select ‘hello’ from dual where 1=1);
          范例:使用not exists()
            select * from scott.emp
              where not exists (select ‘hello’ from dual where 1=2);
6-3:使用HAVING字句查询;
    范例:要求统计出高于公司平均工资的部门编号、平均工资、部门人数。
    第一步:根据部门编号分组,统计出每个部门编号的平均工资、部门人数。
      select deptno,count(*),avg(sal)
        from scott.emp
        group by deptno;
    第二步:如果要想知道哪些部门的工资高于公司的平均工资,则应该scott.emp表统计查询
      select avg(sal) from scott.emp;
    第三步:统计函数
      select deptno,count(*),avg(sal)
        from scott.emp
        group by deptno
        having avg(sal)>(select avg(sal) from scott.emp);
6-4:select 子句使用子查询
  首先需要明确的是,这样的操作意义不大,而且性能不高;
    范例:查询每个雇员的编号,姓名,职位,部门名称;
      select e.empno,e.ename,e.job,d.dname
        from scott.emp e,soctt.emp d
        where e.deptno=d.deptno;































































































以上是关于oracle 子查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle DB 使用子查询来解决查询

Oracle Day04 子查询

Oracle03--子查询

Oracle 高级查询2 子查询

oracle子查询

oracle子查询