Kingbase-查询-组合查询&行排序

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 组合的结果,但是在这种情况中它只被允许根
据输出列名或编号排序,而不能根据表达式排序。
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值