站在用戶的角度思考問題,與客戶深入溝通,找到阿瓦提網(wǎng)站設(shè)計(jì)與阿瓦提網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋阿瓦提地區(qū)。
下文主要給大家?guī)?lái)MySQL數(shù)據(jù)庫(kù)limit的使用方法,希望這些文字能夠帶給大家實(shí)際用處,這也是我編輯MySQL數(shù)據(jù)庫(kù)limit的使用方法這篇文章的主要目的。好了,廢話不多說(shuō),大家直接看下文吧。
--------LIMIT基本理解--------
MySQL的Limit子句
Limit子句可以被用于強(qiáng)制 SELECT 語(yǔ)句返回指定的記錄數(shù)。Limit接受一個(gè)或兩個(gè)數(shù)字參數(shù)。參數(shù)必須是一個(gè)整數(shù)常量。如果給定兩個(gè)參數(shù),第一個(gè)參數(shù)指定第一個(gè)返回記錄行的偏移量,第二個(gè)參數(shù)指定返回記錄行的最大數(shù)目。
舉例說(shuō)明:
//初始記錄行的偏移量是 0(而不是 1):
mysql> select * from table limit 5,10;
詳解:檢索記錄行6-15,從第五行下面第六行開始,因?yàn)橛?jì)算機(jī)開始數(shù)字是0,不是1,第六行開始往下顯示10行,到第15行。
//為了檢索從某一個(gè)偏移量到記錄集的結(jié)束所有的記錄行,可以指定第二個(gè)參數(shù)為 -1:
mysql> select * from table limit 95,-1;
詳解:檢索記錄行 96-last
//如果只給定一個(gè)參數(shù),它表示返回最大的記錄行數(shù)目。換句話說(shuō),LIMIT n 等價(jià)于 LIMIT 0,n:
mysql> select * from table limit 5; //檢索前 5 個(gè)記錄行
實(shí)例說(shuō)明:如何查找一個(gè)表排序后的倒數(shù)第3條數(shù)據(jù)。
select * from table_name order by column_name desc limit 2,1;
//其實(shí)可以理解為,找逆序排序后的第3條數(shù)據(jù)。
其實(shí)有2中形式,一種是limit后面帶一個(gè)值,另一種是帶2個(gè)值。
下面以products產(chǎn)品表為例,進(jìn)行說(shuō)明:
1.select prod_name from products limit 5; //將返回從第1行開始的前5條數(shù)據(jù)。
2.select prod_name from products limit 5,5; //表示返回從行5開始的5行數(shù)據(jù)。第一個(gè)數(shù)為開始位置,第二個(gè)數(shù)為要檢索的行數(shù)。
所以,帶一個(gè)值的limit總是從第一行開始,給出的數(shù)為返回的行數(shù)。帶兩個(gè)值的limit可以指定從行號(hào)為第一個(gè)的位置開始的行數(shù)。
Limit的效率高?
常說(shuō)的Limit的執(zhí)行效率高,是對(duì)于一種特定條件下來(lái)說(shuō)的:即數(shù)據(jù)庫(kù)的數(shù)量很大,但是只需要查詢一部分?jǐn)?shù)據(jù)的情況。
高效率的原理是:避免全表掃描,提高查詢效率。
比如:
每個(gè)用戶的email是唯一的,如果用戶使用email作為用戶名登陸的話,就需要查詢出email對(duì)應(yīng)的一條記錄。
select * from t_user where email=?;
上面的語(yǔ)句實(shí)現(xiàn)了查詢email對(duì)應(yīng)的一條用戶信息,但是由于email這一列沒有加索引,會(huì)導(dǎo)致全表掃描,效率會(huì)很低。
select * from t_user where email=? limit 1;
加上LIMIT 1,只要找到了對(duì)應(yīng)的一條記錄,就不會(huì)繼續(xù)向下掃描了,效率會(huì)大大提高。
Limit的效率低?
在一種情況下,使用limit效率低,那就是:只使用limit來(lái)查詢語(yǔ)句,并且偏移量特別大的情況
做以下實(shí)驗(yàn):
語(yǔ)句1:
select * from table limit 150000,1000;
語(yǔ)句2:
select * from table while id>=150000 limit 1000;
語(yǔ)句1為0.2077秒;語(yǔ)句2為0.0063秒
兩條語(yǔ)句的時(shí)間比是:語(yǔ)句1/語(yǔ)句2=32.968
比較以上的數(shù)據(jù)時(shí),我們可以發(fā)現(xiàn)采用where...limit....性能基本穩(wěn)定,受偏移量和行數(shù)的影響不大,而單純采用limit的話,受偏移量的影響很大,當(dāng)偏移量大到一定后性能開始大幅下降。不過在數(shù)據(jù)量不大的情況下,兩者的區(qū)別不大。
所以應(yīng)當(dāng)先使用where等查詢語(yǔ)句,配合limit使用,效率才高
ps:在sql語(yǔ)句中,limt關(guān)鍵字是最后才用到的。以下條件的出現(xiàn)順序一般是:where->group by->having-order by->limit
附錄相關(guān)語(yǔ)句:
OFFSET語(yǔ)句
為了與 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
經(jīng)常用到在數(shù)據(jù)庫(kù)中查詢中間幾條數(shù)據(jù)的需求
比如下面的sql語(yǔ)句:
① selete * from testtable limit 2,1;
?、?selete * from testtable limit 2 offset 1;
注意:
1.數(shù)據(jù)庫(kù)數(shù)據(jù)計(jì)算是從0開始的
2.offset X是跳過X個(gè)數(shù)據(jù),limit Y是選取Y個(gè)數(shù)據(jù)
3.limit X,Y 中X表示跳過X個(gè)數(shù)據(jù),讀取Y個(gè)數(shù)據(jù)
這兩個(gè)都是能完成需要,但是他們之間是有區(qū)別的:
?、偈菑臄?shù)據(jù)庫(kù)中第三條開始查詢,取一條數(shù)據(jù),即第三條數(shù)據(jù)讀取,一二條跳過
?、谑菑臄?shù)據(jù)庫(kù)中的第二條數(shù)據(jù)開始查詢兩條數(shù)據(jù),即第二條和第三條。
Top子句
TOP 子句用于規(guī)定要返回的記錄的數(shù)目。對(duì)于擁有數(shù)千條記錄的大型表來(lái)說(shuō),TOP 子句是非常有用的。
在SQL Server數(shù)據(jù)庫(kù)中語(yǔ)法為:
select top number|percent column_name(s) from table_name
但是并非所有的數(shù)據(jù)庫(kù)系統(tǒng)都支持 TOP 子句,比如Oracle和MySQL,它們有等價(jià)的語(yǔ)法。
在Oracle數(shù)據(jù)庫(kù)中語(yǔ)法為:
select column_name(s) from table_name where rownum<= number
在MySQL數(shù)據(jù)庫(kù)中語(yǔ)法為:
SELECT column_name(s) FROM table_name LIMIT number
對(duì)于以上關(guān)于MySQL數(shù)據(jù)庫(kù)limit的使用方法,大家是不是覺得非常有幫助。如果需要了解更多內(nèi)容,請(qǐng)繼續(xù)關(guān)注我們的行業(yè)資訊,相信你會(huì)喜歡上這些內(nèi)容的。