同学们,大家好。前面讲到的 SQL 查询只包含从一个或多个表中返回数据的单条 SELECT 语句。SQL 也允许执行多个查询(多条 SELECT 语句),并将结果作为一个查询结果集返回。这些组合查询通常称为复合查询。
主要有以下两种情况需要使用组合查询: 1.对一个表执行多个查询,按一个查询返回数据。 2.从不同的表返回数据。
# 1.UNION
使用 UNION 的方法很简单,只需要给出每条 SELECT 语句,然后在各条 SELECT 语句之间加上关键字 UNION。
我们来举个例子,我们根据订单的日期将订单归类到相应的月份。
SELECT
order_num,
cust_id,
'Jan' mon
FROM
orders
WHERE
order_date >= '2012-01-01 00:00:00'
AND order_date <= '2012-01-31 23:59:59'
UNION
SELECT
order_num,
cust_id,
'Feb' mon
FROM
orders
WHERE
order_date >= '2012-02-01 00:00:00'
AND order_date <= '2012-02-28 23:59:59';
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
运行结果如下:
这个例子将从同一个表里查询到的两个结果组合成一个结果。
我们还可以将从不同表中查询到的结果组合在一起进行返回。 例如:
SELECT
vend_name
FROM
vendors
UNION
SELECT
cust_name
FROM
customers;
2
3
4
5
6
7
8
9
运行结果如下:
在这个例子中,我们将供应商的名字和客户的名字组合在一起进行返回。
UNION 非常容易使用,但在进行组合时需要注意几条规则: 1.UNION 必须由两条或两条以上的 SELECT 语句组成,语句之间用关键字 UNION 分隔。 2.UNION 中的每个查询必须包含相同数量的列。 3.列数据类型必须兼容:类型不必完全相同,但必须是 DBMS 可以隐含转换的类型。
UNION 会在最后的结果中剔除重复的行。例如,我们来举个例子验证一下。 其中一个查询从 customers 表中查询 cust_state 是 IL、IN、MI 的客户。 另外一个查询从 customers 表中查询 cust_name 是 Fun4All 的客户。
SELECT
cust_name,
cust_address
FROM
customers
WHERE
cust_state IN ('IL', 'IN', 'MI')
UNION
SELECT
cust_name,
cust_address
FROM
customers
WHERE
cust_name = 'Fun4All'
2
3
4
5
6
7
8
9
10
11
12
13
14
15
运行结果如下:
# 2.UNION ALL
如果想不剔除重复的行,我们可以使用 UNION ALL。
SELECT
cust_name,
cust_address
FROM
customers
WHERE
cust_state IN ('IL', 'IN', 'MI')
UNION ALL
SELECT
cust_name,
cust_address
FROM
customers
WHERE
cust_name = 'Fun4All'
2
3
4
5
6
7
8
9
10
11
12
13
14
15
运行结果如下:
从结果中我们可以看出,没有剔除重复的行。
对组合查询结果排序: 同样的,我们可以对组合查询结果进行排序。在对组合查询结果进行排序时,只能使用一条 ORDER BY 子句,它必须位于最后一条 SELECT 语句之后。对于结果集,不存在用一种方式排序一部分,而又用另外一种方式排序另一部分的情况,因此不允许使用多条 ORDER BY 子句。 例如我们对刚才查询的结果进行排序:
SELECT
cust_name,
cust_address
FROM
customers
WHERE
cust_state IN ('IL', 'IN', 'MI')
UNION
SELECT
cust_name,
cust_address
FROM
customers
WHERE
cust_name = 'Fun4All'
ORDER BY
cust_name;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
运行结果如下:
小结:本节讲述了如何用 UNION 操作符来组合 SELECT 语句。利用 UNION,可以把多条查询的结果作为一条组合查询返回,不管结果中有无重复。另外讲述了如何对组合查询返回的结果进行排序。
# 3.课后题
下列哪一个关键字的作用可以用来组合查询?
A. DROP
B. ASC
C. UNION
D. DISTINCT