同学们,大家好。前面讲到的 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';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

运行结果如下: image.png

这个例子将从同一个表里查询到的两个结果组合成一个结果。

我们还可以将从不同表中查询到的结果组合在一起进行返回。 例如:

SELECT
    vend_name
FROM
    vendors
UNION
SELECT
    cust_name
FROM
    customers;
1
2
3
4
5
6
7
8
9

运行结果如下: image.png

在这个例子中,我们将供应商的名字和客户的名字组合在一起进行返回。

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'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

运行结果如下: image.png

# 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'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

运行结果如下: image.png

从结果中我们可以看出,没有剔除重复的行。

对组合查询结果排序: 同样的,我们可以对组合查询结果进行排序。在对组合查询结果进行排序时,只能使用一条 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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

运行结果如下: image.png

小结:本节讲述了如何用 UNION 操作符来组合 SELECT 语句。利用 UNION,可以把多条查询的结果作为一条组合查询返回,不管结果中有无重复。另外讲述了如何对组合查询返回的结果进行排序。

image.png

# 3.课后题

下列哪一个关键字的作用可以用来组合查询?

A. DROP

B. ASC

C. UNION

D. DISTINCT

更新于: 12/30/2021, 2:39:56 AM