4
组合查询
两个查询的结果可以用集合操作并、交、差进行组合。语法是
query1 UNION [ALL] query2
query1 INTERSECT [ALL] query2
query1 EXCEPT [ALL] query2
“query1“
和
“query2“
都是可以使用以上所有特性的查询。集合操作也可以嵌套和级连,例如
query1 UNION query2 UNION query3
实际执行的是:
(query1 UNION query2) UNION query3
UNION
有效地把
“query2“
的结果附加到
“query1“
的结果上(但是不能保证这就是这些行实际被返回的顺序)。
此外,它将删除结果中所有重复的行,就像
DISTINCT
做的那样,除非使用
UNION ALL
。
INTERSECT
返回那些同时存在于
“query1“
和
“query2“
的结果中的行,除非声明了
INTERSECT ALL
,否则所
有重复行都被消除。
EXCEPT
返回所有在
“query1“
的结果中但是不在
“query2“
的结果中的行(有时侯这叫做两个查询的差)。同样
的,除非声明了
EXCEPT ALL
,否则所有重复行都被消除。
为了计算两个查询的并、交、差,这两个查询必须是“并操作兼容的”,也就意味着它们都返回同样数量的
列,并且对应的列有兼容的数据类型,如
UNION
、
CASE
和相关结构
中描述的那样。
5
行排序
在一个查询生成一个输出表之后(在处理完选择列表之后),还可以选择性地对它进行排序。如果没有选择
排序,那么行将以未指定的顺序返回。这时候的实际顺序将取决于扫描和连接计划类型以及行在磁盘上的顺
序,但是肯定不能依赖这些东西。一种特定的顺序只能在显式地选择了排序步骤之后才能被保证。
ORDER BY
子句指定了排序顺序:
SELECT select_list
FROM table_expression
ORDER BY sort_expression1 [ASC
|
DESC] [NULLS { FIRST
|
LAST }]
[, sort_expression2 [ASC
|
DESC] [NULLS { FIRST
|
LAST }]
...
]
排序表达式可以是任何在查询的选择列表中合法的表达式。一个例子是:
SELECT a, b FROM table1 ORDER BY a
+
b, c;
当多于一个表达式被指定,后面的值将被用于排序那些在前面值上相等的行。每一个表达式后可以选择性地
放置一个
ASC
或
DESC
关键词来设置排序方向为升序或降序。
ASC
顺序是默认值。升序会把较小的值放在
前面,而“较小”则由
<
操作符定义。相似地,降序则由
>
操作符定义。
1
NULLS FIRST
和
NULLS LAST
选项将可以被用来决定在排序顺序中,空值是出现在非空值之前或者出现
在非空值之后。默认情况下,排序时空值被认为比任何非空值都要大,即
NULLS FIRST
是
DESC
顺序的
默认值,而不是
NULLS LAST
的默认值。
1
事实上,
KingbaseES
为表达式的数据类型使用默认
B-tree
操作符类来决定
ASC
和
DESC
的排序顺序。照惯例,数据类型将被建立,
这样
<
和
>
操作符负责这个排序顺序,但是一个用户定义的数据类型的设计者可以选择做些不同的设置。
注意顺序选项是对每一个排序列独立考虑的。例如
ORDER BY x, y DESC
表示
ORDER BY x ASC, y
DESC
,而和
ORDER BY x DESC, y DESC
不同。
一个
“sort_expression“
也可以是列标签或者一个输出列的编号,如:
SELECT a
+
b AS
sum
, c FROM table1 ORDER BY
sum
;
SELECT a,
max
(b) FROM table1 GROUP BY a ORDER BY
1
;
两者都根据第一个输出列排序。注意一个输出列的名字必须孤立,即它不能被用在一个表达式中—例如,这
是不正确的:
SELECT a
+
b AS
sum
, c FROM table1 ORDER BY
sum
+
c;
--
错误
该限制是为了减少混淆。如果一个
ORDER BY
项是一个单一名字并且匹配一个输出列名或者一个表表达式
的列,仍然会出现混淆。在这种情况中输出列将被使用。只有在你使用
AS
来重命名一个输出列来匹配某些
其他表列的名字时,这才会导致混淆。
ORDER BY
可以被应用于
UNION
、
INTERSECT
或
EXCEPT
组合的结果,但是在这种情况中它只被允许根
据输出列名或编号排序,而不能根据表达式排序。