深入學習SQL的Limit語句

2021-09-22 06:15:39 字數 4081 閱讀 2744

一、基本語法

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為實際查詢的資料條數。

二、例項

檢索記錄行 6-15

1select*fromtablelimit 5,10;

為了檢索從某乙個偏移量到記錄集的結束所有的記錄行,可以指定rows引數為 -1: 

檢索記錄行 96-last

1select*fromtablelimit 95,-1;

如果只給定 rows 引數,它表示前rows 條資料;換句話說,limit n 等價於 limit 0,n

檢索前 5 個記錄行

1select*fromtablelimit 5;

返回第6-15行資料

12

3

4

5

select*fromtablelimit 5,10;

select*fromtablelimit 5;

select*fromtablelimit 0,5;

返回0到last row-rows的資料

12

3

select*fromclass limit 10 , -1

select*fromclass limit -1 offset 10

假如現在class表中有100條資料,則返回的是0開始的90條資料,即0到(100-10)

三、效能

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越大,後者越優。

效能優化:

方案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 語句

select from table limit offset,rows rows offset offset 在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料,這個時候怎麼辦呢?不用擔心,mysql 已經為我們提供了上面這樣乙個功能。limit 子句可以被用於強制 select 語句返回...

case when的使用 sql深入學習

最近接手的專案中需要對集體表中的男女人數做乙個統計,原來的實現是通過兩個查詢語句做到的 select from student where 男 同樣也可以查詢到查詢到所有女生人數和總人數,暫且不說這樣會多少次連線資料庫造成資源的消耗和時間的浪費,就是前台的拼接資料也得費不少腦細胞吧,況且這麼low的...

SQL語句Limit的用法

官方limit用法是這樣的 select column name s from table name limit number 想必大家看了之後跟我有同乙個想法,這limit 怎麼用根本沒講到啊,那接下來我就詳細解剖一下 select from customer limit 10 檢索前10行資料,...