在本教程中,您将学习如何使用oracle union
运算符来组合由两个或多个查询返回的结果集。
union
运算符是一个集合运算符,它将两个或多个select语句的结果集组合到一个结果集中。
以下说明了组合两个查询的结果集的union
运算符的语法:
select
column_list_1
from
t1
union
select
column_list_1
from
t2;
在此声明中,column_list_1
和column_list_2
必须具有相同顺序的相同列数。 另外,对应列的数据类型必须是相同的数据类型组,例如数字或字符。
select
column_list
from
t1
union all
select
column_list
from
t2;
oracle union图示
假设有两个表 - t1
和t2
:
t1
有三行:1
,2
和3
t2
也有三行:2
,3
和4
下图说明了t1
和t2
表的union
运算图示:
union
运算符删除(消除)重复的行 - 2
和3
下图显示了union all
运算符t1
和t2
表的结果:
正如上面所看到的,union all
保留了重复的行 - 2
和3
。
请参阅示例数据库中的以下employees
表和contacts
表的er图结构。
假设,需要发送电子邮件到员工和联系人表的电子邮件地址。 要做到这一点,首先,需要撰写员工和联系人的电子邮件地址列表。然后发送电子邮件到列表中。
以下语句使用union
运算符来构建员工和联系人表中的联系人列表:
select
first_name,
last_name,
email,
'contact'
from
contacts
union select
first_name,
last_name,
email,
'employee'
from
employees;
执行上面查询语句,得到以下结果 -
要对由union运算符返回的结果集进行排序,可以将order by子句添加到最后一个select
语句中,如下所示:
select
first_name || ' ' || last_name name,
email,
'contact'
from
contacts
union select
first_name || ' ' || last_name name,
email,
'employee'
from
employees
order by
name desc;
在这个例子中,将first_name
和last_name
连接起来,并使用一个别名:name
,结果按name
列排序。
执行上面查询代码,得到以下结果 -
以下语句返回员工和联系人的唯一姓氏(last_name
):
select
last_name
from
employees
union select
last_name
from
contacts
order by
last_name;
该查询返回了357
个唯一的姓氏(last_name
)值。参考下面结果 -
但是,如果在查询中使用union all
而不是union
,如下所示:
select
last_name
from
employees
union all select
last_name
from
contacts
order by
last_name;
该查询返回426
行。 另外,一些行是重复的,例如,atkinson
, barnett
。 这是因为union all
操作符不会删除重复的行。
union
将结果集放置在另一个上面,这意味着它将垂直地附加结果集。但是,诸如inner join或left join的连接将结果集水平组合。
下图说明了union
和join
的区别:
在本教程中,您已经学习了如何使用oracle union
运算符来组合多个查询的结果集。