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
*/

使用他們的效果一樣,都可以達到預期的功能。



後期慢慢整理。











發佈了67 篇原創文章 · 獲贊 47 · 訪問量 77萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章