?
This document uses PHP Chinese website manual Release
LIMIT和OFFSET子句允許你只取出查詢結(jié)果中的一部分?jǐn)?shù)據(jù)行:
SELECT select_list FROM table_expression [ ORDER BY ... ] [ LIMIT { number | ALL } ] [ OFFSET number ]
如果給出了一個LIMIT計數(shù),那么將返回不超過該數(shù)字的行(也可能更少些, 因為可能查詢本身生成的總行數(shù)就比較少)。LIMIT ALL和省略LIMIT子句是一樣的。
OFFSET 指明在開始返回行之前忽略多少行。OFFSET 0和省略OFFSET和LIMIT NULL子句是一樣的。 如果OFFSET和LIMIT都出現(xiàn)了,那么在計算OFFSET之前先忽略LIMIT指定的行數(shù)。
使用LIMIT的同時使用ORDER BY子句把結(jié)果行約束成一個唯一的順序是一個好主意。 否則你就會得到一個不可預(yù)料的子集。你要的可能是第十到二十行,但以什么順序的 十到二十?除非你聲明了ORDER BY,否則順序是未知的。
查詢優(yōu)化器在生成查詢規(guī)劃的時候會考慮LIMIT,因此如果你給LIMIT和OFFSET的值不同, 那么你很可能得到不同的規(guī)劃(產(chǎn)生不同的行順序)。因此,使用不同的LIMIT/OFFSET值選擇不同的子集將w得到不一致的結(jié)果,除非你 用ORDER BY強制一個可預(yù)料的順序。這可不是臭蟲,而是一個很自然的結(jié)果, 因為SQL沒有許諾把查詢的結(jié)果按照任何特定的順序發(fā)出, 除非用了ORDER BY來約束順序。
OFFSET子句忽略的行仍然需要在服務(wù)器內(nèi)部計算;因此,一個很大的OFFSET可能還是不夠有效率。