sql的limit用法
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                sql的limit用法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            一、基本
 
SQL的limit語法的如以下形式
SELECT * FROM table ?LIMIT [offset,] rows | rows OFFSET offset ?當省略offset的時候,offset作為0處理,表示提取查詢到的前rows條數據; ?當offset>=0時候,表示提取查詢到的從offset開始的rows條數據;此時如果rows<0表示提取查詢到的從offset開始的所有數據 ?當offset<0的時候,表示提取查詢到的除出后rows條數據的所有數據,即剔除last row-rows到last rows之間的-rows條數據 ?另外,如果rows大于實際查詢的數據條數,則取rows為實際查詢的數據條數。 二、實例 實例1 ?檢索記錄行 6-15 SELECT * FROM table LIMIT 5,10;? 為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定rows參數為 -1:? 實例2 檢索記錄行 96-last SELECT * FROM table LIMIT 95,-1;? ?如果只給定?rows?參數,它表示前rows?條數據;換句話說,LIMIT n 等價于 LIMIT 0,n ?實例3 檢索前 5 個記錄行 SELECT * FROM table LIMIT 5; ? ?? 實例4 返回第6-15行數據 select * from table LIMIT 5,10;? 或 select * from table LIMIT 5;? 或 select * from table LIMIT 0,5;? 實例5 返回0到last row-rows的數據 select * from class limit 10 , -1 或 select * from class limit -1 OFFSET 10 假如現在class表中有100條數據,則返回的是0開始的90條數據,即0到(100-10) 三、性能 3.1、基本 1、offset比較小的時候。 select * from yanxue8_visit limit 10,10 多次運行,時間保持在0.0004-0.0005之間 Select * From yanxue8_visit Where vid >=( Select vid From yanxue8_visit Order By vid limit 10,1 ) limit 10 多次運行,時間保持在0.0005-0.0006之間,主要是0.0006 結論:偏移offset較小的時候,直接使用limit較優。這個顯然是子查詢的原因。 2、offset大的時候。 select * from yanxue8_visit limit 10000,10 多次運行,時間保持在0.0187左右 Select * From yanxue8_visit Where vid >=( Select vid From yanxue8_visit Order By vid limit 10000,1 ) limit 10 多次運行,時間保持在0.0061左右,只有前者的1/3。可以預計offset越大,后者越優。 3.2、性能優化: 方案1. Select * From cyclopedia Where ID>=( Select Max(ID) From ( ?Select ID From cyclopedia Order By ID limit 90001 ) As tmp ) limit 100; 方案2. Select * From cyclopedia Where ID>=( Select Max(ID) From ( ?Select ID From cyclopedia Order By ID limit 90000,1 ) As tmp ) limit 100; 同樣是取90000條后100條記錄,第1句快還是第2句快? 第1方案是先取了前90001條記錄,取其中最大一個ID值作為起始標識,然后利用它可以快速定位下100條記錄 第2方案擇是僅僅取90000條記錄后1條,然后取ID值作起始標識定位下100條記錄 第1方案執行結果.100 rows in set (0.23) sec 第2方案執行結果.100 rows in set (0.19) sec 很明顯第2方案勝出.因為這里ID是主鍵,所以不會去做全表掃描,而是直接返回limit offset+length條記錄,這樣看來limit比起MS-SQL的Top性能還是要提高不少的. 其實第2個方案完全可以簡化成 Select * From cyclopedia Where ID>=( Select ID From cyclopedia limit 90000,1 )limit 100; 直接利用第90000條記錄的ID,不用經過Max運算,這樣做理論上效率因該高一些,但在實際使用中幾乎看不到效果,因為本身定位ID返回的就是1條記錄,Max幾乎不用運作就能得到結果,但這樣寫更清淅明朗,省去了畫蛇那一足. ? 可是,既然MySQL有limit可以直接控制取出記錄的位置,為什么不干脆用Select * From cyclopedia limit 90000,1呢?豈不更簡潔? 這 樣想就錯了,試了就知道,結果是:1 row in set (8.88) sec,怎么樣,夠嚇人的吧。Select * 最好不要隨便用,要本著用什么,選什么的原則, Select的字段越多,字段數據量越大,速度就越慢. 另外,第2方案中,ID是主鍵,所以不會去做全表掃描,而是直接返回limit offset+length條記錄。
第1種方案同樣可用于MS-SQL,而且可能是最好的.因為靠主鍵ID來定位起始段總是最快的. Select Top 100 * From cyclopedia Where ID>=( Select Top 90001 Max(ID) From ( ?Select ID From cyclopedia Order By ID ) As tmp ) 但不管是實現方式是存貯過程還是直接代碼中,瓶頸始終在于MS-SQL的TOP總是要返回前N個記錄,這種情況在數據量不大時感受不深,但如果成百上千萬,效率肯定會低下的.相比之下MySQL的limit就有優勢的多,執行: Select ID From cyclopedia limit 90000 Select ID From cyclopedia limit 90000,1 的結果分別是: 90000 rows in set (0.36) sec 1 row in set (0.06) sec 而MS-SQL只能用Select Top 90000 ID From cyclopedia 執行時間是390ms,執行同樣的操作時間也不及MySQL的360ms.
                        
                        
                        SELECT * FROM table ?LIMIT [offset,] rows | rows OFFSET offset ?當省略offset的時候,offset作為0處理,表示提取查詢到的前rows條數據; ?當offset>=0時候,表示提取查詢到的從offset開始的rows條數據;此時如果rows<0表示提取查詢到的從offset開始的所有數據 ?當offset<0的時候,表示提取查詢到的除出后rows條數據的所有數據,即剔除last row-rows到last rows之間的-rows條數據 ?另外,如果rows大于實際查詢的數據條數,則取rows為實際查詢的數據條數。 二、實例 實例1 ?檢索記錄行 6-15 SELECT * FROM table LIMIT 5,10;? 為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定rows參數為 -1:? 實例2 檢索記錄行 96-last SELECT * FROM table LIMIT 95,-1;? ?如果只給定?rows?參數,它表示前rows?條數據;換句話說,LIMIT n 等價于 LIMIT 0,n ?實例3 檢索前 5 個記錄行 SELECT * FROM table LIMIT 5; ? ?? 實例4 返回第6-15行數據 select * from table LIMIT 5,10;? 或 select * from table LIMIT 5;? 或 select * from table LIMIT 0,5;? 實例5 返回0到last row-rows的數據 select * from class limit 10 , -1 或 select * from class limit -1 OFFSET 10 假如現在class表中有100條數據,則返回的是0開始的90條數據,即0到(100-10) 三、性能 3.1、基本 1、offset比較小的時候。 select * from yanxue8_visit limit 10,10 多次運行,時間保持在0.0004-0.0005之間 Select * From yanxue8_visit Where vid >=( Select vid From yanxue8_visit Order By vid limit 10,1 ) limit 10 多次運行,時間保持在0.0005-0.0006之間,主要是0.0006 結論:偏移offset較小的時候,直接使用limit較優。這個顯然是子查詢的原因。 2、offset大的時候。 select * from yanxue8_visit limit 10000,10 多次運行,時間保持在0.0187左右 Select * From yanxue8_visit Where vid >=( Select vid From yanxue8_visit Order By vid limit 10000,1 ) limit 10 多次運行,時間保持在0.0061左右,只有前者的1/3。可以預計offset越大,后者越優。 3.2、性能優化: 方案1. Select * From cyclopedia Where ID>=( Select Max(ID) From ( ?Select ID From cyclopedia Order By ID limit 90001 ) As tmp ) limit 100; 方案2. Select * From cyclopedia Where ID>=( Select Max(ID) From ( ?Select ID From cyclopedia Order By ID limit 90000,1 ) As tmp ) limit 100; 同樣是取90000條后100條記錄,第1句快還是第2句快? 第1方案是先取了前90001條記錄,取其中最大一個ID值作為起始標識,然后利用它可以快速定位下100條記錄 第2方案擇是僅僅取90000條記錄后1條,然后取ID值作起始標識定位下100條記錄 第1方案執行結果.100 rows in set (0.23) sec 第2方案執行結果.100 rows in set (0.19) sec 很明顯第2方案勝出.因為這里ID是主鍵,所以不會去做全表掃描,而是直接返回limit offset+length條記錄,這樣看來limit比起MS-SQL的Top性能還是要提高不少的. 其實第2個方案完全可以簡化成 Select * From cyclopedia Where ID>=( Select ID From cyclopedia limit 90000,1 )limit 100; 直接利用第90000條記錄的ID,不用經過Max運算,這樣做理論上效率因該高一些,但在實際使用中幾乎看不到效果,因為本身定位ID返回的就是1條記錄,Max幾乎不用運作就能得到結果,但這樣寫更清淅明朗,省去了畫蛇那一足. ? 可是,既然MySQL有limit可以直接控制取出記錄的位置,為什么不干脆用Select * From cyclopedia limit 90000,1呢?豈不更簡潔? 這 樣想就錯了,試了就知道,結果是:1 row in set (8.88) sec,怎么樣,夠嚇人的吧。Select * 最好不要隨便用,要本著用什么,選什么的原則, Select的字段越多,字段數據量越大,速度就越慢. 另外,第2方案中,ID是主鍵,所以不會去做全表掃描,而是直接返回limit offset+length條記錄。
第1種方案同樣可用于MS-SQL,而且可能是最好的.因為靠主鍵ID來定位起始段總是最快的. Select Top 100 * From cyclopedia Where ID>=( Select Top 90001 Max(ID) From ( ?Select ID From cyclopedia Order By ID ) As tmp ) 但不管是實現方式是存貯過程還是直接代碼中,瓶頸始終在于MS-SQL的TOP總是要返回前N個記錄,這種情況在數據量不大時感受不深,但如果成百上千萬,效率肯定會低下的.相比之下MySQL的limit就有優勢的多,執行: Select ID From cyclopedia limit 90000 Select ID From cyclopedia limit 90000,1 的結果分別是: 90000 rows in set (0.36) sec 1 row in set (0.06) sec 而MS-SQL只能用Select Top 90000 ID From cyclopedia 執行時間是390ms,執行同樣的操作時間也不及MySQL的360ms.
總結
以上是生活随笔為你收集整理的sql的limit用法的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Jfreechart显示数据点图表(线上
- 下一篇: JFreeChart设置背景图片 .
