【SQL】獲取指定範圍內結果集的實現方法
Web應用經常會出現分頁顯示結果集的場景,如果處理不好將會嚴重影響應用程式的效能。如何突破這個瓶頸呢?
透過一個需求演示場景給大家展示兩種實現方法,孰優孰劣看後便知。
1.建立實驗表T,並初始化一些實驗資料
sec@ora10g> create table t (id number, sal number);
sec@ora10g> insert into t values (1,1000);
sec@ora10g> insert into t values (2,800);
sec@ora10g> insert into t values (3,600);
sec@ora10g> insert into t values (4,2000);
sec@ora10g> insert into t values (5,3000);
sec@ora10g> insert into t values (6,1500);
sec@ora10g> insert into t values (7,1800);
sec@ora10g> insert into t values (8,2100);
sec@ora10g> insert into t values (9,400);
sec@ora10g> insert into t values (10,600);
sec@ora10g> insert into t values (11,200);
sec@ora10g> insert into t values (12,1900);
sec@ora10g> insert into t values (13,3000);
sec@ora10g> insert into t values (14,4000);
sec@ora10g> commit;
2.T表資料概覽
sec@ora10g> select * from t;
ID SAL
---------- ----------
1 1000
2 800
3 600
4 2000
5 3000
6 1500
7 1800
8 2100
9 400
10 600
11 200
12 1900
13 3000
14 4000
14 rows selected.
3.實現需求一:按照工資升序排序後的第1名到第3名資訊
1)錯誤方法
sec@ora10g> select * from t where rownum<=3 order by sal;
ID SAL
---------- ----------
3 600
2 800
1 1000
這種查詢方法是先獲得T表中的前三條記錄,然後對這三條記錄的sal值進行排序。與我們的需求不符。
2)正確方法一
使用子查詢與rownum完成任務。
sec@ora10g> select * from (select * from t order by sal) where rownum<=3;
ID SAL
---------- ----------
11 200
9 400
3 600
3)正確方法二
使用分析函式ROW_NUMBER完成此任務。
sec@ora10g> select id, sal
2 from (select id, sal, ROW_NUMBER () over (order by sal) as rn
3 from t)
4 where rn <= 3;
ID SAL
---------- ----------
11 200
9 400
3 600
4.實現需求二:按照工資升序排序後的第4名到第6名資訊
1)錯誤的方法
sec@ora10g> select * from (select * from t order by sal) where rownum between 4 and 6;
no rows selected
rownum的這種使用方法是不正確的!要堅決抵制。
2)正確方法一
用rownum來構造這個結果集
sec@ora10g> select *
2 from (select * from (select * from t order by sal)
3 where ROWNUM <= 6
4 minus
5 select * from (select * from t order by sal)
6 where ROWNUM <= 3)
7 order by sal;
ID SAL
---------- ----------
10 600
2 800
1 1000
可見,使用這種集合減構造出來的結果集的方法稍顯笨重。
3)正確方法二
使用分析函式ROW_NUMBER可以很便捷的完成這個任務。
sec@ora10g> select id, sal
2 from (select id, sal, ROW_NUMBER () over (order by sal) as rn
3 from t)
4 where rn between 4 and 6;
ID SAL
---------- ----------
10 600
2 800
1 1000
5.以此類推,便可以實現任意指定範圍內的統計資料查詢。
6.小結
“正確方法一”給出的方法雖然可以實現我們的需求,但是獲取資料的代價較大,其間存在大量的排序操作。
“正確方法二”使用分析函式先對第一種方法效率上得到了保證,同時給SQL的編寫帶來很大的靈活性,推薦使用。
透過這個例子我們再一次體會到了分析函式帶給我們的便利和高效。
Good luck.
secooler
10.02.06
-- The End --
透過一個需求演示場景給大家展示兩種實現方法,孰優孰劣看後便知。
1.建立實驗表T,並初始化一些實驗資料
sec@ora10g> create table t (id number, sal number);
sec@ora10g> insert into t values (1,1000);
sec@ora10g> insert into t values (2,800);
sec@ora10g> insert into t values (3,600);
sec@ora10g> insert into t values (4,2000);
sec@ora10g> insert into t values (5,3000);
sec@ora10g> insert into t values (6,1500);
sec@ora10g> insert into t values (7,1800);
sec@ora10g> insert into t values (8,2100);
sec@ora10g> insert into t values (9,400);
sec@ora10g> insert into t values (10,600);
sec@ora10g> insert into t values (11,200);
sec@ora10g> insert into t values (12,1900);
sec@ora10g> insert into t values (13,3000);
sec@ora10g> insert into t values (14,4000);
sec@ora10g> commit;
2.T表資料概覽
sec@ora10g> select * from t;
ID SAL
---------- ----------
1 1000
2 800
3 600
4 2000
5 3000
6 1500
7 1800
8 2100
9 400
10 600
11 200
12 1900
13 3000
14 4000
14 rows selected.
3.實現需求一:按照工資升序排序後的第1名到第3名資訊
1)錯誤方法
sec@ora10g> select * from t where rownum<=3 order by sal;
ID SAL
---------- ----------
3 600
2 800
1 1000
這種查詢方法是先獲得T表中的前三條記錄,然後對這三條記錄的sal值進行排序。與我們的需求不符。
2)正確方法一
使用子查詢與rownum完成任務。
sec@ora10g> select * from (select * from t order by sal) where rownum<=3;
ID SAL
---------- ----------
11 200
9 400
3 600
3)正確方法二
使用分析函式ROW_NUMBER完成此任務。
sec@ora10g> select id, sal
2 from (select id, sal, ROW_NUMBER () over (order by sal) as rn
3 from t)
4 where rn <= 3;
ID SAL
---------- ----------
11 200
9 400
3 600
4.實現需求二:按照工資升序排序後的第4名到第6名資訊
1)錯誤的方法
sec@ora10g> select * from (select * from t order by sal) where rownum between 4 and 6;
no rows selected
rownum的這種使用方法是不正確的!要堅決抵制。
2)正確方法一
用rownum來構造這個結果集
sec@ora10g> select *
2 from (select * from (select * from t order by sal)
3 where ROWNUM <= 6
4 minus
5 select * from (select * from t order by sal)
6 where ROWNUM <= 3)
7 order by sal;
ID SAL
---------- ----------
10 600
2 800
1 1000
可見,使用這種集合減構造出來的結果集的方法稍顯笨重。
3)正確方法二
使用分析函式ROW_NUMBER可以很便捷的完成這個任務。
sec@ora10g> select id, sal
2 from (select id, sal, ROW_NUMBER () over (order by sal) as rn
3 from t)
4 where rn between 4 and 6;
ID SAL
---------- ----------
10 600
2 800
1 1000
5.以此類推,便可以實現任意指定範圍內的統計資料查詢。
6.小結
“正確方法一”給出的方法雖然可以實現我們的需求,但是獲取資料的代價較大,其間存在大量的排序操作。
“正確方法二”使用分析函式先對第一種方法效率上得到了保證,同時給SQL的編寫帶來很大的靈活性,推薦使用。
透過這個例子我們再一次體會到了分析函式帶給我們的便利和高效。
Good luck.
secooler
10.02.06
-- The End --
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-626976/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用 Carbon 獲取指定時間範圍內的日期陣列陣列
- redis如何獲取有序集合指定範圍的個數Redis
- UPDATE查詢結果範圍內的資料
- PHP PDO獲取結果集PHP
- MaxCompute如何對SQL查詢結果實現分頁獲取SQL
- MySQL 查詢結果取交集的實現方法MySql
- 在指定範圍內生成隨機數隨機
- 巧用trunc函式,獲取某日期範圍內的資料函式
- 百度API獲取位置範圍內的周邊服務API
- div拖動範圍限定在指定元素內
- Sql Server 獲取指定表、檢視結構SQLServer
- HMS Core地理圍欄能力助你實現指定範圍人群的精準訊息推送
- JAVA實現附近範圍內公交定位問題Java
- Oracle11新特性——SQL快取結果集(五)OracleSQL快取
- Oracle11新特性——SQL快取結果集(三)OracleSQL快取
- jquery實現的獲取指定元素指定型別元素數目jQuery型別
- jquery獲取具有指定內容的元素jQuery
- Shell指令碼中獲取SELECT結果值的方法指令碼
- 獲取任務的執行結果
- 從mysqldump全備獲取指定庫的sqlMySql
- java生成指定範圍的隨機數Java隨機
- exonerate結果整理,獲取target序列
- 【原始碼】RocketMQ如何實現獲取指定訊息原始碼MQ
- oracle result cache 結果集快取的使用Oracle快取
- 智慧 Monkey 在指定執行的頁面範圍內執行方案
- 列舉範圍內的字串字串
- 關於獲取事件相應的結果事件
- jquery實現的獲取指定行列td單元格內容jQuery
- javascript如何獲取指定元素內的所有圖片JavaScript
- 如何利用框選工具獲取多邊形範圍?
- 如何產生指定範圍的隨機數隨機
- 使用 NGINX 和 NGINX Plus 實現智慧高效的位元組範圍快取Nginx快取
- 6-3 使用函式輸出指定範圍內的完數 (20分)函式
- C語言——使用函式輸出指定範圍內的Fibonacci數C語言函式
- arcgis api for javascript學習-使用FeatureLayer結合FeatureTable實現查詢並能根據查詢結果將檢視縮放至結果的範圍APIJavaScript
- javascript實現獲取指定數字區間的隨機數JavaScript隨機
- C#+Arcengine實現GP工具中的extract by mask(提取掩膜),可以實現提取shp範圍的柵格資料,可用來獲得shp範圍的高程C#
- rman刪除指定節點指定sequence範圍的歸檔日誌