集合运算
- 若将两张表看出集合,匹配问题就是集合运算中的交集
- 若将两张表看出集合,不匹配问题就是集合运算中的差
- 匹配问题+不匹配问题就是集合运算中的并集
集合运算符
- union/union all
- intersect 交集
- minus 差
- 集合运算要求两个select语句是同构的,即列的个数和数据类型必须一致
union
的结果集为两个查询结果的并集,是去掉重复值的union all
的结果集为两个查询结果的并集,是包含重复值的intersect
的结果集为两个查询结果的交集,不包含重复值minus
的结果集为属于第一个查询的结果集,但不属于第二个查询的结果集即从第一个查询的结果集中减去他们的交集,不包含重复值
select a.REAL_NAME ,b.REAL_NAME
from ACCOUNT a join ACCOUNT b
on a.id=b.RECOMMENDER_ID
union all
select REAL_NAME ,'no recommender'
from ACCOUNT where RECOMMENDER_ID is null
排名分页问题
rownum
- rownum是一个伪列,对查询返回的行编号即行号,有1开始递增
- 关键点:oracle的rownum数值是在获取每行之后才赋予的
select rownum ,REAL_NAME from ACCOUNT
where rownum<=5的执行过程
- oracle获取第一个符合条件的行,将它叫做第一行
- 有5行行了吗?如果没有,oracle就再返回行,因为他要满足行号小于等于5的条件,如果到了5行,那么,oracle就不再返回行
- oracle获取下一行,并递增行号(从2,到3,再到4,等等)
- 返回第二步
select rownum ,REAL_NAME from ACCOUNT
where ROWNUM in (1,2,3,5)
rownum只会显示123行,没4就接不上5
select rownum ,REAL_NAME from ACCOUNT
where ROWNUM <=6
minus
select rownum ,REAL_NAME from ACCOUNT
where ROWNUM <=3;
select rn,REAL_NAME
from (select ROWNUM rn,REAL_NAME from ACCOUNT where ROWNUM <=6)
where rn between 4 and 6;
select ROWNUM ,REAL_NAME ,CREATE_DATE
from (select REAL_NAME,CREATE_DATE from ACCOUNT order by CREATE_DATE desc)
where rownum <=6
minus
select ROWNUM ,REAL_NAME ,CREATE_DATE
from (select REAL_NAME,CREATE_DATE from ACCOUNT order by CREATE_DATE desc)
where rownum <=3
select rn,REAL_NAME,CREATE_DATE
from (select rownum rn ,REAL_NAME,CREATE_DATE
from (
select REAL_NAME,CREATE_DATE from ACCOUNT order by CREATE_DATE
)where rownum<=6)where rn between 4 and 6;