《SQL必知必会》:组合查询 UNION

SQL必知必会:了解SQL

SQL必知必会:检索数据 SELECT

SQL必知必会:排序检索 SELECT ORDER BY

SQL必知必会:过滤数据 SELECT WHERE

SQL必知必会:高级数据过滤 WHERE AND OR IN NOT

SQL必知必会:通配符过滤 LIKE

SQL必知必会:计算字段 + || concat 算术运算

SQL必知必会:数据处理函数 文本 日期 数值

SQL必知必会:汇总数据 AVG() COUNT() MAX() MIN() SUM()

SQL必知必会:分组数据GROUP BY

SQL必知必会:使用子查询

SQL必知必会:联结表 JOIN

SQL必知必会:高级联结 内联结 外联结 全联结

SQL必知必会:组合查询 UNION

SQL必知必会:插入数据 INSERT

SQL必知必会:更新和删除数据 UPDATE DELETE

SQL必知必会:创建和操纵表 CREATE ALTER DROP RENAME

SQL必知必会:使用视图 CREATE VIEW

1. 组合查询

多数SQL 查询只包含从一个或多个表中返回数据的单条SELECT 语句。但是,SQL 也允许执行多个查询(多条SELECT 语句),并将结果作为一个查询结果集返回。这些组合查询通常称为并(union)或复合查询(compound query)。

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

  • 在一个查询中从不同的表返回结构数据;
  • 对一个表执行多个查询,按一个查询返回数据。

提示:组合查询和多个WHERE 条件
多数情况下,组合相同表的两个查询所完成的工作与具有多个WHERE
子句条件的一个查询所完成的工作相同。换句话说,任何具有多个
WHERE 子句的SELECT 语句都可以作为一个组合查询,在下面可以看
到这一点。

2. 创建组合查询

可用UNION 操作符来组合数条SQL 查询。利用UNION,可给出多条SELECT 语句,将它们的结果组合成一个结果集。

2.1 使用UNION
-- 单条语句1
SELECT
	cust_name,
	cust_contact,
	cust_email 
FROM
	Customers 
WHERE
	cust_state IN ( 'IL', 'IN', 'MI' );
	
-- 单条语句2
SELECT
	cust_name,
	cust_contact,
	cust_email 
FROM
	Customers 
WHERE
	cust_name = 'Fun4All';

-- UNION 1&2
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';

在这里插入图片描述

-- 这一句等效于上面
SELECT
	cust_name,
	cust_contact,
	cust_email 
FROM
	Customers 
WHERE
	cust_state IN ( 'IL', 'IN', 'MI' ) 
	OR cust_name = 'Fun4All';
2.2 UNION规则
  • UNION 必须由两条或两条以上的SELECT 语句组成,语句之间用关键字UNION 分隔(因此,如果组合四条SELECT 语句,将要使用三个UNION关键字)。
  • UNION 中的每个查询必须包含相同的列、表达式或聚集函数(不过,各个列不需要以相同的次序列出)。
  • 列数据类型必须兼容:类型不必完全相同,但必须是DBMS 可以隐含转换的类型(例如,不同的数值类型或不同的日期类型)。如果遵守了这些基本规则或限制,则可以将UNION 用于任何数据检索操作。
2.3 包含或取消重复的行

UNION 从查询结果集中自动去除了重复的行;这是UNION 的默认行为,如果愿意也可以改变它。事实上,如果想返回所有的匹配行,可使用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';

提示:UNION 与WHERE
这一课一开始我们说过,UNION 几乎总是完成与多个WHERE 条件相同
的工作。UNION ALL 为UNION 的一种形式,它完成WHERE 子句完成
不了的工作。如果确实需要每个条件的匹配行全部出现(包括重复行),
就必须使用UNION ALL,而不是WHERE。

2.4 对组合查询结果排序

SELECT 语句的输出用ORDER BY 子句排序。在用UNION 组合查询时,只能使用一条ORDER BY 子句,它必须位于最后一条SELECT 语句之后。

-- 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' 
ORDER BY
	cust_name,
	cust_contact;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级D洋葱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值