Oracle常用函数

oracle的start with connect by prior如何使用

https://www.cnblogs.com/lirun/p/9116337.html

--递归查询出自己所有的子课组(包括自己)   zkzdm(主课组代码)
select * from t_kck_xxxxkzb start with kzmc in('2','22') connect by prior kzdm=zkzdm

--递归查询出自己所有的父课组(包括自己)
select * from t_kck_xxxxkzb  start with kzmc='4' connect by kzdm=prior zkzdm

在这里插入图片描述

一、开窗函数

简介: Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行

概念:这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的.但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数

注意:窗口函数是SQL语句最后执行的函数,还在order by之后

https://blog.csdn.net/weixin_41270824/article/details/89373006
https://blog.csdn.net/qq_26937525/article/details/54925827

二、rownum

简介:在oracle中的rownum作为行号 在分页处理方面有着很大的便利
概念:ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值

在这里插入图片描述
那你如果你以为只要再排序一下,就可以的话,那么你就错了 .
在这里插入图片描述
从上图可以看到,排序后的顺序被打断了,

我们来看看oracle的执行顺序

from .. where ... group by .. having .. select ..rownum.. order by
rownum 是在order by 之前执行的,也就意味着它是先算好行才排序,针对这类问题的解决手法通常是  
想办法让order by在 rownum之前执行,那么问题来了,怎么让order by 先执行呢?  
答案是, 使用子查询,把子查询放在from 后面,那么就会第一个查询,好了,看代码

select 
 		ROWNUM, t.* //最后执行
 			from (select * from t_window order by cost) t //该行优先执行

在这里插入图片描述
通过上图我们可以发现,我们的思路是正确的,那么我们就顺水推舟,一口气写完 。查询购买量前3条
在这里插入图片描述
答案正确,证明我们的思路是没问题的,

那么我们改需求,查询5 - 10 条数据
在这里插入图片描述
这时候就是之前提到的rownum特性:因为rownum总是从1开始的如果你使用>,>=,=,between…and这些条件 rownum默认从1开始然后你的条件中又没有1那么他则被删除, 接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据

如果没有输出数据,rownum是不会增加的,所以条件永远不会满足,针对于这种方法,解决方案是 使用子查询先查询 10条数据,然后再取5-10行,

-- 先查询出十行数据
select ROWNUM, t.* from (select * from t_window order by cost) t where rownum <= 10
--然后把这十行当成一个表,在表里面拿5-10行的数据 
select t2.* from ( select ROWNUM row_id, t.* from
			 (select * from t_window order by cost) t where rownum <= 10) t2 
			 		where t2.row_id >=5

查询结果如下
在这里插入图片描述

注意:  ruwnum 查询的时候只能使用<  <= 等符号,不能使用 > 的符号,>= 很多情况下都不能使用,建议不要使用 >= 符号
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无极的移动代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值