1 取得表中第6到第10條記錄的值
1.1 第一種方法,使用minus語句
假設ddl語句如下:
create table t(id varchar2(4) primary key, value int)
那麼第一種方法就是取出前5條,再取出前10條,然後採用集合運算的方法把前10條減去前5條就ok了,sql語句如下
以下是引用片段:
select * from t where rownum <= 10
minus
select * from t where rownum <= 5;
1.2 另外一種方法,採用子查詢
子查詢的這種方法相對比較複雜一點,不過效能要比剛才的集合相減要好一些。這種方法首先在子查詢中得到前10條資料,順路也取得前10條資料的rownum,然後再一次查詢的時候取得剛才查詢的rownum大於5的那些資料。sql語句如下
以下是引用片段:
select id, value from
(select id, value, rownum r from t where r <= 10)
where
r > 5;
通過上面的語句,就得到了6到第10條資料了。
2 利用外連線替代not in語句
in語句還有not in語句的效率是非常的差的,因為資料庫在遇到這兩種語句的時候是要把資料進行一條一條的比對,如果in或者not in兩側的資料量在上萬條的時候,進行比對的次數就是上億次,很可能乙個簡單的sql語句就要執行半個小時以上。這種效率客戶是肯定不能夠接受的。那我們可以考慮兩種方法進行替代,第一種就是採用exist語句和not exist語句,這種大家應該比較熟悉了。另外一種就是巧用外關聯語句,這種方法可能大家不是很熟悉,我來稍微說一下。假設資料表的建表ddl語句為
create table t1(id varchar2(4) primary key, value int)
而in或者not in的表的建表ddl語句為
create table t2(value int)
oracle中外關聯採用的是(+)符號表示外關聯,也就是說標識了(+)符號的部分在找不到對應的值的時候為null。下面是替代in語句的時候的sql語句
以下是引用片段:
select t1.id, t1.value
from t1, t2
where t1.value = t2.value(+)
and t2.value is not null;
而類似的。替代not in語句的時候的sql語句則為
以下是引用片段:
select t1.id, t1.value
from t1, t2
where t1.value = t2.value(+)
and t2.value is null;
大家可以試驗一下,在資料量多的時候,採用外關聯比用in或者not in的執行效率要高很多很多。
Oracle巧取指定記錄以及巧用外關聯查詢
如何取得表中第6到第10條記錄的值。第一種方法,使用minus語句 假設ddl語句如下 create table t id varchar2 4 primary key,value int 那麼第一種方法就是取出前5條,再取出前10條,然後採用集合運算的方法把前10條減去前5條就ok了,sql語句如...
關於左關聯查詢與右關聯查詢的區別(詳解)(面試題)
剛開始在我面試的時候經常有面試官問我這個問題,我幾乎是下意識的說出乙個是左表為主表乙個是右邊為主表,我心想這還不簡單,但是我面試面的多了以後,感覺面試官為什麼這麼想問這個問題,她到底想聽什麼?下面我們來看一下定義 我們結合例子來看一下 如a表id 1,2,3 b表id 1,2,4 問ab關於id相等...
SQL關聯查詢中on與where
前段時間,做乙個查詢,打算用left join查詢存在於a表但不存在於b表記錄,但怎麼查都不對,原因是把所有filter全部放在了where語句中,因此回頭看了資料,記錄一下。on 條件是在join之前生效,因此無論後面是什麼條件都會返回左表所有記錄。where 條件是在完成join後再生效。下面進...