第八十章 SQL命令 UNION
Posted 学无为
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第八十章 SQL命令 UNION相关的知识,希望对你有一定的参考价值。
组合两个或多个SELECT语句。
大纲select-statement {UNION [ALL] [%PARALLEL] select-statement}
select-statement {UNION [ALL] [%PARALLEL] (query)}
(query) {UNION [ALL] [%PARALLEL] select-statement}
(query) {UNION [ALL] [%PARALLEL] (query)}
参数
-
ALL
- 可选——关键字字面量。
如果指定,则返回重复的数据值。 如果省略,重复的数据值将被抑制。
-
%PARALLEL
- 可选—%PARALLEL
关键字。
如果指定,则union
的每一边都作为单独的进程并行运行。
-
select-statement
- 从数据库中检索数据的SELECT
语句。 -
query
- 组合一个或多个SELECT语句的查询。
UNION
将两个或多个查询组合为一个查询,该查询将数据检索到结果中。由
UNION
组合的查询可以是由单个SELECT
语句组成的简单查询,也可以是复合查询。为了在
SELECT
语句之间实现联合,每个分支中指定的列数必须匹配。指定具有不同列数的
select
将导致SQLCODE -9
错误。可以指定一个
SELECT
中的NULL
列与另一个SELECT
中的数据列配对,以匹配列的数量。
例如:
SELECT Name,Salary,BirthDate
FROM Sample.Employee
UNION ALL
SELECT Name,NULL,BirthDate
FROM Sample.Person
SQL通过自动计算UNION
查询的所有分支并返回优先级最高的数据类型来确定结果列数据类型:VARCHAR
、DOUBLE
、NUMERIC
、BIGINT
、INTEGER
、SMALLINT
、TINYINT
。其他数据类型,如
DATE
,没有分配优先级。例如,下面的程序返回数据类型
TINYINT
,尽管DATE
数据类型在其他上下文中具有更高的优先级。
SELECT MyTinyIntField FROM Table1
UNION ALL
SELECT MyDateField FROM Table2
如果你想返回一个不同于所列数据类型的数据类型,你必须使用显式CAST
语句,如下面的例子所示:
SELECT CAST(MyTinyInt AS DATE) FROM Table1
UNION ALL
SELECT MyDateField FROM Table2
如果联合分支中的列在长度、精度或比例上不同,则给结果列分配最大的值。
结果列名取自联合的第一个分支中的列(或列别名)的名称。
在两个分支中对应的列没有相同名称的情况下,在所有分支中使用相同的列别名来标识结果列可能会很有用。
如果任何UNION
分支中的任何列是空的,则结果列元数据报告为空的。
UNION
结果中的字符串字段具有相应SELECT字段的排序规则类型,但如果字段排序规则不匹配,则分配精确排序规则。
UNION and UNION ALL
普通的UNION
消除了结果中的重复行(所有值都相同)。
UNION ALL
在结果中保留重复的行。不同精度的字段不具有相同的值。
例如,值
33
(数据类型NUMERIC(9)
)和33.00(数据类型NUMERIC(9,2)
)并不被认为是相同的。具有不同排序规则的字段没有相同的值。
例如,
MyStringField
和%SQLUPPER(MyStringField)
并不被认为是相同的,即使这两个值都是大写的。
TOP和ORDER BY子句
UNION
语句可以以ORDER BY
子句结束,该子句对结果进行排序。这个
ORDER BY
适用于整个语句;它必须是最外层查询的一部分,而不是子查询。
它不必与
TOP
子句配对。下面的例子展示了
ORDER BY
的使用:两个SELECT
语句选择数据,数据由UNION
组合,然后ORDER BY
对结果进行排序:
SELECT Name,Home_Zip FROM Sample.Person
WHERE Home_Zip %STARTSWITH 9
UNION
SELECT Name,Office_Zip FROM Sample.Employee
WHERE Office_Zip %STARTSWITH 8
ORDER BY Home_Zip
在ORDER BY
中使用与SELECT
列表列不对应的列号会导致SQLCODE -5
错误。在
ORDER BY
中使用与SELECT
列表列不对应的列名会导致SQLCODE -6
错误。
union
的SELECT
语句(或两者)也可以包含ORDER BY
子句,但它必须与TOP
子句配对。这个
ORDER BY
用于确定TOP
子句选择了哪些行。下面的示例展示了
ORDER BY
的使用:两个SELECT
语句都使用ORDER BY
对它们的行进行排序,这决定了哪些行被选为顶部行。选定的数据由UNION组合,然后最终的
ORDER by
对结果进行排序:
SELECT TOP 5 Name,Home_Zip FROM Sample.Person
WHERE Home_Zip %STARTSWITH 9
ORDER BY Name
UNION
SELECT TOP 5 Name,Office_Zip FROM Sample.Employee
WHERE Office_Zip %STARTSWITH 8
ORDER BY Office_Zip
ORDER BY Home_Zip
TOP
可以应用于union
中的第一个SELECT
,也可以应用于union
的结果,这取决于ORDER BY
子句的位置:
-
TOP...ORDER BY
应用于UNION
结果:如果UNION
位于FROM
子句的子查询中,则TOP
和ORDER BY
将应用于UNION
的结果。例如:
SELECT TOP 10 Name,Home_Zip
FROM (SELECT Name,Home_Zip FROM Sample.Person
WHERE Name %STARTSWITH A
UNION
SELECT Name,Home_Zip FROM Sample.Person
WHERE Home_Zip %STARTSWITH 8)
ORDER BY Home_Zip
-
TOP
适用于第一个SELECT
;ORDER BY
适用于UNION
结果。例如:
SELECT TOP 10 Name,Home_Zip
FROM Sample.Person
WHERE Name %STARTSWITH A
UNION
SELECT Name,Home_Zip FROM Sample.Person
WHERE Home_Zip %STARTSWITH 8
ORDER BY Home_Zip
括起圆括号
UNION
支持对其中一条SELECT
语句或两条SELECT
语句或整个UNION
语句使用可选的圆括号。可以指定一对或多对括号。以下是括号的所有有效用法:
(SELECT ...) UNION SELECT ...
(SELECT ...) UNION (SELECT ...)
((SELECT ...)) UNION ((SELECT ...))
(SELECT ... UNION SELECT ...)
(阅读《构建之法》第八九十章有感ORACLE 两个order by的SQL使用 UNION 或者 UNION ALL 报错 ORA-00933:sql命令未正确结束
sql [SQL查询片段]用于在命令行或通过R和其他工具使用SQL的快速代码段#tags:sql,R,text processing,命令li
oracle 两个sql带有order by的使用union/union all的时候报错 'ORA-00933:sql命令未正确结束' 处理办法