在我們使用查詢語(yǔ)句的時(shí)候,經(jīng)常要返回前幾條或者中間某幾行數(shù)據(jù)。一般數(shù)據(jù)庫(kù)管理系統(tǒng)都會(huì)提供這些功能,但是各個(gè)dbms提供的查詢方法又有些不一樣。下面主要介紹mysql和postgresql在使用limit查詢其中幾行數(shù)據(jù)的區(qū)別。
mysql:
limit 子句可以被用于強(qiáng)制 select 語(yǔ)句返回指定的記錄數(shù)。limit 接受一個(gè)或兩個(gè)數(shù)字參數(shù)。參數(shù)必須是一個(gè)整數(shù)常量。如果給定兩個(gè)參數(shù),第一個(gè)參數(shù)指定第一個(gè)返回記錄行的偏移量,第二個(gè)參數(shù)指定返回記錄行的最大數(shù)目。初 始記錄行的偏移量是 0(而不是 1)。
為了與 postgresql 兼容,mysql 也支持句法: limit # offset #。具體舉例:
mysql> select * from table limit 5,10;? // 檢索記錄行 6-15
//為了檢索從某一個(gè)偏移量到記錄集的結(jié)束所有的記錄行,可以指定第二個(gè)參數(shù)為 -1:
mysql> select * from table limit 95,-1; // 檢索記錄行 96-last.
//如果只給定一個(gè)參數(shù),它表示返回最大的記錄行數(shù)目:
mysql> select * from table limit 5; //檢索前 5 個(gè)記錄行
//換句話說(shuō),limit n 等價(jià)于 limit 0,n。
postgresql:
如果給出了一個(gè)限制計(jì)數(shù),那么返回不超過(guò)那么多的行。(但可能更少些,因?yàn)椴樵儽旧砜赡苌傻男袛?shù)就比較少。) limit all 和省略 limit 子句一樣。
//b為起始值(不包括b),a為獲取數(shù)據(jù)長(zhǎng)度。
select * from table limit a offset b ;
//舉例:檢索記錄行6-15
select * from table limit 10 offset 5;
//如果只給定一個(gè)參數(shù),它表示返回最大的記錄行數(shù)目:
select * from table limit 5; //和mysql用法一樣;
//也就是說(shuō)“offset 說(shuō)明在開(kāi)始返回行之前忽略多少行。 offset 0 和省略 offset 子句是一樣的。”
當(dāng)然如果使用limit,那么用order by 子句把結(jié)果行約束成一個(gè)唯一的順序是一個(gè)好主意。否則你就會(huì)拿到一個(gè)不可預(yù)料的該查詢的行的子集。