介绍
查询工资比scott高的员工:
1 | SQL> select * from emp where sal > (select sal from emp where ename = 'scott'); |
一、可以使用子查询的位置
select
select 后的子查询只能是单行子查询,只有一条返回记录
1
SQL> select empno,ename,sal,(select job from emp where empno = 7839) 第四列 from emp;
having
1
2SQL> select deptno,avg(sal) from emp group by deptno
having avg(sal) > (select max(sal) from emp where deptno = 30)from
1
SQL> select * from (select empno,ename,sal from emp);
不可以使用子查询的位置:group by
二、子查询和多表查询
主查询与子查询不是同一张表。例:查询部门名称是sales的员工:
1 | --子查询 |
sql优化:理论上采用多表查询好,只访问一次数据库
三、子查询的排序问题
top-n分析问题。例:排到员工表中工资最高的前三名:
1 | SQL> select rownum,empno,ename,sal --rownum表示伪列 |
四、主查询和子查询的执行顺序
一般先子查询,后主查询,但相关子查询例外。例:找到员工表中薪水大于本部门平均水平的员工:
1 | SQL> select empno,ename,sal, |
五、子查询中的null值
单行子查询中null值问题
查询条件一直为false,所以查询不到
多行子查询中null值
- a not in (1,2,null)
- a != 1 and a != 2 and a != null
- 子查询中增加不是空值的条件:coum is not null
六、分页显示
分页查询显示员工信息:显示员工号、姓名、月薪:1.每页显示四条记录 2.显示第二页的员工信息(5-8)3.按照月薪降序排列
1 | SQL> select r,empno,ename,sal |
七、sql执行计划
- 执行计划:explain plan for sql语句;
- 查看该执行计划:select * from table(dbms_xplan.display);
- 判断标准:cost(%cpu)–消耗的系统资源。