7.子查询——Oracle数据库学习日记

子查询

子查询语法:

SELECT  select_list
FROM    table
WHERE   expr operator
                        (SELECT     select_list
                        FROM        talbe);

可以将子查询放在许多SQL子句中:如where子句、having子句、from子句。

  • 子查询(内查询)在主查询(外查询)之前执行
  • 主查询使用子查询结果
  • 子查询是嵌入在另一个SELECT语句子句中的SELECT语句。可以使用子查询从简单语句构建功能强大的语句。当需要从表中选择具有依赖于表本身的数据的条件的行时,它们可能非常有用。

1、WHERE子句中使用子查询

示例

SQL> select ename
  2  from emp
  3  where sal>
  4             (select sal
  5             from emp
  6             where empno=7566);

ENAME
----------
SCOTT
KING
FORD

注意事项

  • 子查询要包在括号内
  • 将子查询放在比较条件的右侧增强可读性(子查询可以出现在比较运算符的两侧)
  • 单行操作符对应单行子查询,多行操作符对应多行子查询

2、单行子查询

  • 只返回一行
  • 使用单行比较操作符
    示例
SQL> select *
 2  from emp
 3  where job=(select job
 4                     from emp
 5                     where ename='SCOTT');

    EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
     7788 SCOTT      ANALYST         7566 19-APR-87       3000        20
     7902 FORD       ANALYST         7566 03-DEC-81       3000        20

选出与scott岗位相同的员工信息。

3、在子查询中使用组函数及HAVING子句

  • 首先执行子查询
  • 向主查询中having子句返回结果

示例

SQL> select deptno,avg(sal)
  2  from emp
  3  group by deptno
  4  having avg(sal)=(select min(avg(sal))
  5                             from emp
  6                             group by deptno);

    DEPTNO   AVG(SAL)
---------- ----------
        30 1566.66667

查询部门平均工资最低的部门编号和最低工资。

4、多行子查询

  • 返回多行
  • 使用多行比较操作符
操作符 含义
IN 等于列表中的某一个值
ANY 与列表中的任意值比较
ALL 与列表中的所有值相比较

4.1在多行查询中使用IN

示例

SQL> select ename
  2  from emp
  3  where empno in 
  4                             (select mgr
  5                                     from emp
  6                                     where mgr is not null);

ENAME
----------
JONES
BLAKE
CLARK
SCOTT
KING
FORD

6 rows selected.

查询员工中领导。

4.2在多行查询中使用ANY

  • ANY表示大于最小值

  • =ANY等于IN

4.3在多行查询中使用ALL

  • ALL表示大于最大值

  • 示例
SQL> select *
  2  from emp
  3  where sal

5、在FROM子句中使用子查询

示例

SQL> select a.ename,a.sal,a.deptno,b.avg_sal
  2  from emp a,(select deptno,avg(sal) avg_sal
  3                             from emp
  4                             group by deptno) b
  5  where a.deptno=b.deptno
  6  and a.sal

6、SELECT子查询

示例

SQL> select count(ename)/(select count(ename) from emp)
  2  from emp
  3  group by deptno
  4  having deptno=10;

COUNT(ENAME)/(SELECTCOUNT(ENAME)FROMEMP)
----------------------------------------
                              .214285714

查询10号部门的员工在整个公司中所占的比例。

你可能感兴趣的:(oracle学习日记)