CUSTOMERS 表
主要是使用 union
操作符,将多条 SQL 语句组合成一个结果集。
我们有 2 种情况可能要用到组合查询:
- 在一个查询中从不同的表返回结构数据
- 对一个表执行多个查询,按一个查询返回数据(这种情况往往可以用 where 中的 and 或者 or 操作符可以实现)
比如我们有 2 条查询语句:
// 第一句 SQL
select CUST_NAME, CUST_CONTACT, CUST_EMAIL
from CUSTOMERS
where CUST_STATE in ('IL', 'IN', 'MI');
// 第二句 SQL
select CUST_NAME, CUST_CONTACT, CUST_EMAIL
from CUSTOMERS
where CUST_NAME = 'Fun4All';
我们使用 union
可以把这两个语句进行组合:
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';
不过在这个例子中,由于数据是来自同一张表,所以我们可以用 where
的多个子句来实现同样的效果。
select CUST_NAME, CUST_CONTACT, CUST_EMAIL
from CUSTOMERS
where CUST_STATE in ('IL', 'IN', 'MI')
or CUST_NAME = 'Fun4All';
我们也可以将不同表的查询结果拼接起来。
select CUST_NAME
from CUSTOMERS
union
select PROD_NAME
from PRODUCTS;
如果是不同的表,那么数据类型必须兼容,类型不需要完全相同,但至少是要 DBMS 可以隐式转换的类型。
这种多张表的组合查询,最后生成的列名取的是第一个 SQL 语句的列名。
包含或取消重复的行
我们可以使用 union all
来代替 union
,这样就保留重复的行。
select CUST_NAME, CUST_CONTACT, CUST_EMAIL
from CUSTOMERS
where CUST_STATE in ('IL', 'IN', 'MI')
union all
select CUST_NAME, CUST_CONTACT, CUST_EMAIL
from CUSTOMERS
where CUST_NAME = 'Fun4All';
排序
我们可以对最终的结果进行排序,但只能再最后一条 SQL 语句中使用 order by
,而不能对每个 SQL 语句指定 order by
进行排序。