14 组合查询

1.组合查询

SQL允许执行多个查询(多个SELECT语句),并将结果作为一个查询结果集。这些组合查询通常称为并(union)或者复合查询(compound query)。

需要使用组合查询主要有两种情况:

(1)对一个查询中从不同的表返回数据结构

(2)对一个表执行多个查询,按一个查询返回数据。

2.创建组合查询

可以使用UNION操作符来组合数条SQL查询,并将它们的结果组合成一个结果集。

(1)在各条SELECT语句之间放上关键字UNION

假设需要IllinoisIndianaMichigan等美国几个州的所有顾客的报表,还包括不管位于哪个州的所有的Fun4All

首先来看单条语句。

1)SELECTIllinoisIndianaMichigan等州的缩写传递给IN子句,检索出这些州的所有行,输入:

SELECT cust_name, cust_contact, cust_email

FROM Customers

WHERE cust_state IN ('IL', 'IN', 'MI');

输出:

2)SELECT利用简单的相等测试找出所有Fun4All,输入:

SELECT cust_name, cust_contact, cust_email

FROM Customers

WHERE cust_name = 'Fun4All';

输出:

3)组合这两条语句,输入:

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';

输出:

4)为了便于参考,使用多条WHERE子句,输入:

SELECT cust_name, cust_contact, cust_email

FROM Customers

WHERE cust_state IN ('IL', 'IN', 'MI')

OR cust_name = 'Fun4All';

输出:

可以看出,该查询使用UNIONWHERE子句更复杂,但对于较复杂的过滤条件,或从多个表中检索数据,使用UNION可能会更简单。

(2)UNION规则

UNION必须由两条或以上的SELECT语句,之间用关键字UNION分隔;

UNION中每个查询必须包含相同的列、表达式或者聚集函数;

列数据类型必须兼容。

(3)包含或取消重复的行。

UNION默认从查询结果集中自动去除了重复的行,如果想返回所有的匹配行,可以使用UNION ALL,输入:

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';

输出:

有一行出现两次。

(4)对组合查询结果排序

在使用UNION组合查询时,只允许使用一条ORDER BY子句,必须位于最后一条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'

ORDER BY cust_name, cust_contact;

输出:

虽然ORDER BY似乎只是最后一条SELECT语句的组成部分,但实际上,DBMS将用它来排序所有SELECT语句返回的所有结果。

原文地址:https://www.cnblogs.com/Sumomo0516/p/6131551.html