第八十章 SQL命令 UNION

Posted 学无为

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第八十章 SQL命令 UNION相关的知识,希望对你有一定的参考价值。


第八十章 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命令未正确结束' 处理办法