Oracle的复杂查询
5.子查询
嵌套在其他sql语句中的查询语句,也叫嵌套查询
a.单行子查询
只查询一行数据的子查询语句
如何显示与SMITH同一部门员工的信息?
子查询(SMITH所在的部门)
select department from emp where empname='SMITH';
将子查询的结果添加到sql语句
执行,看下结果:
b.多行子查询
返回多行数据的子查询
如何查询做10号部门所包含的工作的员工信息?
我们先看10号部门都含有哪些岗位
然后我们找到做这些工作的员工,没错,都是做这三个岗位的。
c.在多行子查询中使用 all/any 操作符
如何显示工资比30号部门所有员工的工资都高的员工信息
当然,我们还可以使用Max函数,而且该方法的执行速度比使用all要来的快
如何显示工资比30号部门的任意一个员工的工资高(高于最低)的员工信息
当然也可以使用min函数而且执行速度更快
d.多列子查询
如何查询岗位与部门和SMITH完全相同的所有雇员,注意列的顺序必须前后对应。
e.在from语句中使用子查询
如何查询比自己所在部门的平均工资高的员工信息?
整理一下思路先:
首先,得到自己所在部门的平均工资,这样,我们得到了一张表
然后将这张表当做一张子表,进行多表查询
请揣摩理解一下。
在from语句中使用子查询时,该子查询会被当做一个视图来对待,因此叫做“内嵌视图”,当在from语句中使用子查询时 ,必须给子查询制定别名。
6.分页查询
Oracle的分页查询有三种方式,这里介绍其中的一种,rownum方式,该方法的查询速度低于rowid方式,但比rowid方式少一层select嵌套。
以查询emp表的第6~10行数据为例
第一步:将要查询的表表示为内嵌视图
from (select * from emp) a1
第二步:取1~10行的数据
注意这里rownum列的别名rn不可省,方便后续的操作。
可不可以直接在后面加条件 and rownum>=6 进行分页呢?不可以,between也不好使,这就是Oracle机制决定的,没办法。
第三步:将第二步获得的表表示为内嵌视图,再按rownum进行分页
思考,如果我只想查询指定列呢?如果我要按照指定列排序呢?如何修改sql语句?
如果想改变查询的行数范围,修改两个限定参数就可以了