4.6. LIMIT 和 OFFSET

LIMITOFFSET允许你只检索由查询剩于部分选出的行的一部分:

SELECT select_list
	FROM table_expression
	[LIMIT { number | ALL }] [OFFSET number]

如果给出了一个限制计数,那么返回不超过那么多的行. (但可能更少些,因为查询本身可能生成的行数就比较少。) LIMIT ALL和省略 LIMIT子句一样.

OFFSET说明在开始给客户端返回行之前忽略多少行. OFFSET 0和省略OFFSET子句是一样的. 如果OFFSETLIMIT都出现了, 那么在计算LIMIT个行之前忽略OFFSET行.

如果使用LIMIT,那么用ORDER BY 子句把结果行约束成一个唯一 的顺序是一个好主意.否则你就会拿到一个不可预料的该查询的行 的子集 --- 你要的可能是第十到二十行,但以什么顺序的十到二十? 除非你声明了ORDER BY,否则顺序是不知道的.

查询优化器在生成查询规划的时候会考虑LIMIT,因此如果你给 LIMITOFFSET不同的东西,那么你很可能收到不同的规划 (产生不同的行顺序).因此,使用不同的LIMIT/OFFSET值 选择不同的查询结果的子集将生成不一致的结果, 除非你用ORDER BY强制一个可预料的顺序.这可不是臭虫; 这是一个很自然的结果,因为 SQL 没有许诺把查询的结果 按照任何特定的顺序发出,除非用了ORDER BY来约束顺序.