- 大多数SQL查询只从一个或者多表中返回数据都是单个select语句。但是SQL server允许多个select语句执行,它返回的结果是一个结果集,需要使用 union 组合 ,这些组合一般称为并(union)和复合查询(compound query)
- 什么情况下可以需要使用组合查询
2.1、在一个查询中从不同的表返回不同的结构数据
2.2、对一个表执行多个查询,按一个查询返回数据
- 组合查询和多个where条件
3.1 多数情况下,组合相同表的两个查询所完成的和具有多个where条件的查询是一样的。换个说法,具有多个where条件的查询也可以称之为组合成查询
- 使用 union 操作符来组合数条Sql server语句,会将查询的结果返回为结果集
例子:如需要查询Illinois、Indiana和Michigan等美国几个州的所有顾客报表,还想包括不管位于哪个洲的所有Fun4All.
使用union涉及多个select语句,步骤分解:
select cust_name,cust_contact,cust_email
from Customers
where cust_state in ('il','in','mi')
输出:
这条查询把Illinois、Indiana和Michigan这些洲缩写,放在in关键字中,查询以in ('il','in','mi'),这些开头的都会被检索。
步骤二:
select cust_name,cust_contact,cust_email
from Customers
where cust_name = 'fun4all'
输出:
这条查询把cust_name等于fun4all的数据行都检索出来,使用操作符 = 来做相等测试。你会发现有个输出了两次,因为它满足两个select的检索条件。
步骤三:
使用union来组合这两个select
select cust_name,cust_contact,cust_email
from Customers
where cust_state in ('il','in','mi')
union
select cust_name,cust_contact,cust_email
from Customers
where cust_name = 'fun4all'
输出:
这个查询把步骤一和步骤二的组合在一起,使用union关键字来隔开。Union指示DBMS执行这两个select查询,并两个的查询的一个结果集。不会忽略null行,union 关键字还有一个去重复行的功能 ,如果想显示null行,需要在union关键字后面借一个 All,因为union关键字默认行为就是去重复。
Union 关键字与多个where条件的区别:
select cust_name,cust_contact,cust_email
from Customers
where cust_contact in ('il','in','mi') or cust_name = 'fun4all'
输出:
这个例子中使用了步骤一和步骤二的where条件,在通过or操作符来把这两条件联结在一起。Or操作符:两个条件满足一个或者两个都的数据都可以被检索出来。
可能你觉得使用union关键字来组合很麻烦。但是,对于较与复杂where条件,或者从多个表中查询数据,使用union关键字比多个where条件,要简单一些。
- union关键字的限制:union关键字组合的select数目,Sql server 没有明确的确定。可以同DBMS文档来查看,union关键字都最大限制数目。
- Union 关键字使用规则:
6.1、union关键字必须使用在两个或者两个以上的表查询数据,使用Union关键字来隔开
6.2、Union关键字的每个查询必须包含相同的列,表达式以及聚合函数,不然则会报错
6..3列的数据类型必须兼容:类型不必相同,但是,必需是DBMS能隐式转的类型也可以。
- union all为union的一种形式,他可以完成where无法完成的工作。
- 在使用union进行组合查询是,无论有多少个select子句。只能出现一个order by子句,而order by子句必须位于最后一行。
如:
select prod_id,quantity
from OrderItems
where prod_id like 'bnbg%' and quantity >=100
union
select prod_id,quantity
from OrderItems
where quantity >=100
order by prod_id,quantity
错误形式:(红色的是错误地方)
select prod_id,quantity
from OrderItems
where prod_id like 'bnbg%' and quantity >=100
order by prod_id,quantity
union
select prod_id,quantity
from OrderItems
where quantity >=100
order by prod_id,quantity