子查询的语法格式:
子查询要注意的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行。
六、主查询和子查询可以在不同的表上
一个复杂查询,可以使用子查询来实现,也可以使用多表连接来实现,此时该如何选择?
理论上是多表查询更高效,因为子查询要多次访问数据库,多表连接只需要一次。但是多表连接查询时可能会产生大量笛卡尔集,这个时候多表连接查询就会非常低效,所以两种查询需要根据实际情况来分析。