Oracle常用sql语法

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。
作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui0317/article/details/9426759

1、使用connect by.. start with... 递归查询

递归查询就是将表中的id 与parentid 关联起来,建立关联关系之后oracle帮我们把表中所有满足条件的信息全部一次性的显示出来。

sql代码如下:

/*
connect by :以...为连接基础,将id与parentid关联起来
sj_id = prior sj_parentid:关联等式,prior 表示以哪个字段设为优先权限,下面例子表示以parentid为主,它会一直根据parintid去查找i栏目信息(查找所有id等于这里的parentid的栏目信息)直到结束,所以肯定会找到根节点
start with :表示以什么条件开始查找,必须指定
level :表示 这种关系的层级,方便理解
*/
select sj_id,sj_name,sj_parentid,level from tb_subject connect by sj_id = prior sj_parentid start with sj_id =22524

效果图如下:


另外prior指定的位置不一样,那么它查询的效果也不一样。

sql代码如下:

/*
这条语句较上面紧紧 只是prior的位置不同,但效果却完全不一样,上面说了prior表示将哪个字段设为优先权限,上面以parentid为主,永远向上查找
而下面以id为主,表示id享有优先权,那么它会一直根据id去查找栏目信息(查找所有parentid等于这里的id的栏目信息)直到结束,所以肯定会找到该栏目下的所有的子节点,以及子节点下的所有子节点信息
*/
select sj_id,sj_name,sj_parentid,level from tb_subject connect by prior sj_id = sj_parentid start with sj_id =22524

效果图如下:


2、使用rownum 进行分页查询

oracle 的分页不像sql server 一样,可以使用 top 10  not in  (select top 20 )  这么方便,oracle 分页需要用到rownum 伪列来完成。

现在以查询第11条到20条的条件为例,目前有两种实现的方式:

sql 代码如下:

/*
在子查询语句中,只有父块部分才能引用子块的别名,反之不行。
使用rownum如果直接给予条件rn between 11 and 20,将什么都不会显示,因为rownun查询的结果返回的第一行永远是1,如果直接指定为11,则不满足显示情况。
这条语句先查询所有的栏目信息,然后根据rownum筛选一下,最后使用between ..and ...得到我想要的第11条到20条显示
*/
select sj_id,sj_name,sj_parentid from( 
    select s.*,rownum rn from (
        select * from tb_subject order by sj_id
    ) s 
) where rn between 11 and 20000;   

/*
这条语句先查询所有的栏目信息,然后根据rownum筛选并过滤前20条信息,最后再使用之前的rownum在过滤一起取出后从第11条开始到结束的信息
*/
select sj_id,sj_name,sj_parentid from(
    select s.*,rownum rn from (
       select * from tb_subject order by sj_id
    ) s where rownum <=20000
) where rn >=11
/*
后来反复执行这两条语句,甚至加大查询的数目,这两条语句在执行的时候几乎相差不大。查询时间的差距微乎其微 ,从实际出发来看着两条鱼具不会太影响系统的访问性能。
No.1      No.2
2.934    2.793
2.73     3.401
2.776    2.918
3.136    2.823
*/

使用他们的效果一样,都可以达到预期的功能。



后期慢慢整理。











  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值