6 LIMIT
和
OFFSET
LIMIT
和
OFFSET
允许你只检索查询剩余部分产生的行的一部分:
SELECT select_list
FROM table_expression
[ ORDER BY
...
]
[ LIMIT { number
|
ALL } ] [ OFFSET number ]
如果给出了一个限制计数,那么会返回数量不超过该限制的行(但可能更少些,因为查询本身可能生成的行
数就比较少)。
LIMIT ALL
的效果和省略
LIMIT
子句一样,就像是
LIMIT
带有
NULL
参数一样。
OFFSET
说明在开始返回行之前忽略多少行。
OFFSET 0
的效果和省略
OFFSET
子句是一样的,并且
LIMIT
NULL
的效果和省略
LIMIT
子句一样,就像是
OFFSET
带有
NULL
参数一样。
如果
OFFSET
和
LIMIT
都出现了,那么在返回
LIMIT
个行之前要先忽略
OFFSET
行。
如果使用
LIMIT
,那么用一个
ORDER BY
子句把结果行约束成一个唯一的顺序是很重要的。否则你就会拿
到一个不可预料的该查询的行的子集。你要的可能是第十到第二十行,但以什么顺序的第十到第二十?除非
你指定了
ORDER BY
,否则顺序是不知道的。
查询优化器在生成查询计划时会考虑
LIMIT
,因此如果你给定
LIMIT
和
OFFSET
,那么你很可能收到不
同的规划(产生不同的行顺序)。因此,使用不同的
LIMIT
/
OFFSET
值选择查询结果的不同子集将生成不一
致的结果,除非你用
ORDER BY
强制一个可预测的顺序。这并非
bug
,这是一个很自然的结果,因为
SQL
没有许诺把查询的结果按照任何特定的顺序发出,除非用了
ORDER BY
来约束顺序。
被
OFFSET
子句忽略的行仍然需要在服务器内部计算;因此,一个很大的
OFFSET
的效率可能还是不够高。
7 VALUES
列表
VALUES
提供了一种生成“常量表”的方法,它可以被使用在一个查询中而不需要实际在磁盘上创建一个表。
语法是:
VALUES ( expression [,
...
] ) [,
...
]
每一个被圆括号包围的表达式列表生成表中的一行。列表都必须具有相同数据的元素(即表中列的数目),并
且在每个列表中对应的项必须具有可兼容的数据类型。分配给结果的每一列的实际数据类型使用和
UNION
相同的规则确定(参见
UNION
、
CASE
和相关结构
)。
一个例子:
VALUES (
1
,
'one'
), (
2
,
'two'
), (
3
,
'three'
);
将会返回一个有两列三行的表。它实际上等效于:
SELECT
1
AS column1,
'one'
AS column2
UNION ALL
SELECT
2
,
'two'
UNION ALL
SELECT
3
,
'three'
;
在默认情况下,
KingbaseES
将
column1
、
column2
等名字分配给一个
VALUES
表的列。这些列名不是由
SQL
标准指定的,并且不同的数据库系统的做法也不同,因此通常最好使用表别名列表来重写这些默认的名
字,像这样:
=>
SELECT
*
FROM (VALUES (
1
,
'one'
), (
2
,
'two'
), (
3
,
'three'
)) AS t (num,letter);
num
|
letter
-----+--------
1
|
one
2
|
two
3
|
three
(
3
rows)
在句法上,后面跟随着表达式列表的
VALUES
列表被视为和
SELECT select_list FROM table_expression
一样,并且可以出现在
SELECT
能出现的任何地方。例如,你可以把它用作
UNION
的一部分,或者附加一个
“sort_specification“
(
ORDER BY
、
LIMIT
和
/
或
OFFSET
)给它。
VALUES
最常见的用途是作为一个
INSERT
命令的数据源,以及作为一个子查询。
更多信息请见
VALUES
。