Oracle子查询

子查询的语法格式:

在这里插入图片描述

子查询要注意的10个问题:

在这里插入图片描述在这里插入图片描述

一、子查询语法中加小括号

在这里插入图片描述

二、复杂子查询书写风格,换行对齐

在这里插入图片描述

三、可以使用子查询的位置:select/from/where/having

子查询在select语句中:

SQL> select empno,ename,sal,(select empjob from emp where empno=7839) 第四列
2 from emp;

 EMPNO ENAME             SAL 第四列

  7369 SMITH             800 PRESIDENT
  7499 ALLEN            1600 PRESIDENT
  7521 WARD             1250 PRESIDENT
  7566 JONES            3775 PRESIDENT
  7654 MARTIN           1250 PRESIDENT
  7698 BLAKE            3650 PRESIDENT
  7782 CLARK            3250 PRESIDENT
  7788 SCOTT            3000 PRESIDENT
  7839 KING             6000 PRESIDENT
  7844 TURNER           1500 PRESIDENT
  7876 ADAMS            1100 PRESIDENT
  7900 JAMES             950 PRESIDENT
  7902 FORD             3000 PRESIDENT
  7934 MILLER           1300 PRESIDENT

已选择14行。

子查询在from语句中:

SQL> select *
2 from (select empno,ename,sal from emp);

 EMPNO ENAME             SAL

  7369 SMITH             800
  7499 ALLEN            1600
  7521 WARD             1250
  7566 JONES            3775
  7654 MARTIN           1250
  7698 BLAKE            3650
  7782 CLARK            3250
  7788 SCOTT            3000
  7839 KING             6000
  7844 TURNER           1500
  7876 ADAMS            1100
  7900 JAMES             950
  7902 FORD             3000
  7934 MILLER           1300

已选择14行。

子查询在having语句中:

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

DEPTNO   AVG(SAL)

    30       1700
    20       2335
    10 3516.66667

四、group by不可以使用子查询

SQL> select avg(sal)
2 from emp
3 group by (select deptno from emp);
group by (select deptno from emp)
*
第 3 行出现错误:
ORA-22818: 这里不允许出现子查询表达式

五、from后面的子查询可以在最初原表基础上增加更多的条件,形成新表。

SQL> select *
2 from (select empno,ename,sal from emp);

 EMPNO ENAME             SAL

  7369 SMITH             800
  7499 ALLEN            1600
  7521 WARD             1250
  7566 JONES            3775
  7654 MARTIN           1250
  7698 BLAKE            3650
  7782 CLARK            3250
  7788 SCOTT            3000
  7839 KING             6000
  7844 TURNER           1500
  7876 ADAMS            1100
  7900 JAMES             950
  7902 FORD             3000
  7934 MILLER           1300

已选择14行。

再增加条件:
SQL> select *
2 from (select empno,ename,sal,sal*12 annsal from emp);

 EMPNO ENAME             SAL     ANNSAL

  7369 SMITH             800       9600
  7499 ALLEN            1600      19200
  7521 WARD             1250      15000
  7566 JONES            3775      45300
  7654 MARTIN           1250      15000
  7698 BLAKE            3650      43800
  7782 CLARK            3250      39000
  7788 SCOTT            3000      36000
  7839 KING             6000      72000
  7844 TURNER           1500      18000
  7876 ADAMS            1100      13200
  7900 JAMES             950      11400
  7902 FORD             3000      36000
  7934 MILLER           1300      15600

已选择14行。

六、主查询和子查询可以在不同的表上

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
一个复杂查询,可以使用子查询来实现,也可以使用多表连接来实现,此时该如何选择?
理论上是多表查询更高效,因为子查询要多次访问数据库,多表连接只需要一次。但是多表连接查询时可能会产生大量笛卡尔集,这个时候多表连接查询就会非常低效,所以两种查询需要根据实际情况来分析。

七、子查询排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值