SQL中如何合并多个数据表中的字段(列)
在前两节中我们介绍了如何把两个数据表通过JOIN结合起来 ,仔细想一想,这种横向的对每一条记录的扩展实际上是对每一行的字段(列)进行了扩展。
那么与之相对应地,利用SQL中的 UNION 我们也可以对多个数据表中的查询结果在列的方向上进行扩展,比如把两个数据表中数据类型相同的两个字段合并为一列。
UNION & UNION ALL
UNION 的默认形式是 UNION DISTINCT ,也就是说在合并两个字段时,字段中的重复值不会被写进最终的合并结果。而 UNION ALL 则包含重复值。
UNION 在使用时,一般的语法结构为:
SELECT 字段 FROM 数据表_1
UNION
SELECT 字段 FROM 数据表_2
这里我们要注意:
- 数据表_1和数据表_2中 字段的数据类型要一致
- 数据表_1和数据表_2中 字段的顺序要一致
- 数据表_1和数据表_2中的 字段的数目要相同
- 数据表_1和数据表_2中的字段的名字不一定要相同
- 最后的返回结果中列的名称为第一个SELECT中所给定的字段的名称
比如在 客户表 中存储有下列客户信息:
ID | 客户姓名 | 城市 |
---|---|---|
1 | 张立 | 广州 |
2 | 王风 | 大连 |
3 | 李菊 | 沈阳 |
4 | 赵明 | 南京 |
在数据表 供货商 中存储有如下供货商的地址信息:
ID | 城市 |
---|---|
001 | 广州 |
002 | 杭州 |
003 | 南京 |
004 | 成都 |
005 | 武汉 |
利用下面的SQL语句我们可以找出客户和供货商分布的所有城市
SELECT 城市 FROM 客户表
UNION
SELECT 城市 FROM 供货商

而利用 UNION ALL 则得到如下结果

这里广州和南京出现了两次。
实例操作 :
- 打开免费的SQL数据库练习网站 DB Fiddle - SQL Database Playground
- 选择最新的数据库版本, 比如SQLLitev3.39
- 利用下列SQL语句在左边的窗口Schema SQL中创建上述实例中所使用的数据库
CREATE TABLE 客户表 (
id INT,
客户姓名 varchar(255),
城市 varchar(255)
INSERT INTO 客户表 VALUES (1, "张立", "广州");
INSERT INTO 客户表 VALUES (2, "王风", "大连");
INSERT INTO 客户表 VALUES (3, "李菊", "沈阳");
INSERT INTO 客户表 VALUES (4, "赵明", "南京");
CREATE TABLE 供货商 (
id INT,
城市 varchar(255)