注意的问题:
1.括号
2.合理的书写风格
3.可以在主查询的where select having from 后面使用子查询
4.不可以在group by 使用 子查询
5.强调from 后面 的子查询
6.主查询和子查询可以不是同一张表:只有子查询返回的结果 主查询可以使用
7.一般不在子查询中排序 但在top-n分析问题中 必须对子查询排序
8.一般先执行 子查询,再执行 主查询,但相关子查询除外
9.单行子查询只能使用单行操作符 多行子查询只能使用多行操作符
10,子查询中null
查询某某前多少数据 row_number() over (partition col1 order by col2 )rn
rownum伪列
ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号。在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是一致的,当使用ROW_NUMBER函数时,也需要专门一列用于预先排序以便于进行编号。
ROW_NUMBER()
说明:返回结果集分区内行的序列号,每个分区的第一行从1开始。
语法:ROW_NUMBER () OVER ([ <partition_by_clause> ] <order_by_clause>) 。
备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
参数:<partition_by_clause> :将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。
<order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的行的顺序。
返回类型:bigint 。
用伪列rownum进行分页
select *from(select rownum r,empno
from (select * from emp order by sal desc) e1
where rownum<=8) e2
where r>=2
例子
- 查询工资比scott高的员工信息
eg:
- from后面进行子查询
- .主查询和子查询可以不是同一张表:只有子查询返回的结果 主查询可以使用
eg:查询部门是SALES的员工信息
使用子查询
使用多表查询
对于sql优化来说,应该用多表查询代替子查询 - 单行子查询只能使用单行操作符 多行子查询只能使用多行操作符,多行操作符:in,any,all
eg:查询部门名称是SALES和ACCOUNTING的员工
子查询方式
多表查询方式
any :和集合中的任意一个值比较(只需要比其中一个值大或者小或者等于,有点像or)
eg:查询工资比30号部门任意一个员工高的员工信息
大于最小值即可
all :和集合中的所有值比较 (与每一个值比较,都为ture才行,类似于and)
查询工资比30号部门所有员工高的员工信息
比最大值还要大即可
- 子查询中null (null 在运算中都为null,所以不能使用 not in)
查询不是老板的员工信息
因为KING的mgr字段为null,所以下面的语句查询不出信息
改变写法