MySQL之union、union all和集合运算符和null值

本文介绍了MySQL中的UNION和UNION ALL操作,详细解释了它们的使用语法、作用、区别以及与NULL值的关系。UNION用于合并查询结果并去除重复行,而UNION ALL则保留所有行,包括重复。在使用时需要注意两个查询的列数量必须相同,且UNION默认会去重,而UNION ALL不会。同时,ORDER BY子句只能放在最后一个查询中,如果需要对单独查询排序,需将其括在小括号内。对于含有NULL值的列,在去重时会被视为相等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

union、union all

语法:
SELECT …
UNION [ALL | DISTINCT]
SELECT …
[UNION [ALL | DISTINCT]
SELECT …]
union用于把两个或者多个select查询的结果集合并成一个
进行合并的两个查询,其SELECT列表必须在数量和对应列的数据类型上保持一致
默认会去掉两个查询结果集中的重复行
默认结果集不排序
最终结果集的列名来自于第一个查询的SELECT列表
UNION = UNION DISTINCT

作用:对两个结果集进行合并
区别:union会进行去重,union all不会进行去重
注意点:两个结果集的列的数量要相等。
mysql> desc t1;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)
mysql> desc student;
±--------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±--------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| birth | date | YES | | NULL | |
| age | int(11) | YES | | NULL | |
| sex | varchar(5) | YES | | NULL | |
| address | varchar(50) | YES | | NULL | |
±--------±------------±-----±----±--------±------+
6 rows in set (0.00 sec)
mysql> select * from t1 union select * from student;
ERROR 1222 (21000): The used SELECT statements have a different number of columns
例1:得到那些有罚款或者担任队长,或者两个条件都符合的球员的编号
SELECT playerno
FROM teams
UNION
SELECT playerno
FROM penalties;
在这里插入图片描述
如果要对合并后的整个结果集进行排序,ORDER BY子句只能出现在最后面的查询中
例:
SELECT playerno
FROM teams
UNION
SELECT playerno
FROM penalties
ORDER BY playerno;
在这里插入图片描述
如果要合并的某个查询需要单独进行排序,那么该查询必须用小括号括起来
:第一个和第二个查询的结果集分别排序后再进行合并,最终的结果集不排序
(SELECT playerno
FROM teams
ORDER BY playerno)
UNION
(SELECT playerno
FROM penalties
ORDER BY playerno);
在这里插入图片描述

集合运算符和NULL值
在去重操作时,如果列值中包含NULL值,认为它们是相等的
:最终结果集中只有1行
SELECT playerno,leagueno
FROM players
WHERE playerno=7
UNION
SELECT playerno,leagueno
FROM players
WHERE playerno=7;
在这里插入图片描述
select各个字句执行顺序:
select
from 1
where 2
group by 3
having 4
union/union all 5
order by 6
limit 7

### SQL 中 `UNION ALL` `NULL` 的行为与用法 #### 1. `UNION ALL` 的基本概念 `UNION ALL` 是 SQL 查询中的一个重要操作符,用于将多个查询的结果集组合在一起。与 `UNION` 不同的是,`UNION ALL` 不会去除重复的行[^1]。这意味着如果两个查询结果集中存在相同的记录,则这些记录会被保留下来。 #### 2. `NULL` 在 `UNION ALL` 中的行为 当使用 `UNION ALL` 进行查询时,`NULL` 会被视为与其他任何都不相同,包括其他 `NULL` 。然而,在某些特定场景下,可以通过自定义逻辑来处理 `NULL` 的比较问题。例如,MySQL 提供了一个特殊的运算符 `<=>` 来实现空安全的相等比较[^1]。 以下是通过 `UNION ALL` 处理包含 `NULL` 数据的一个示例: ```sql SELECT 'A' AS col, NULL AS value UNION ALL SELECT 'B', 1 UNION ALL SELECT 'C', NULL; ``` 此查询将返回三行数据,其中两行的 `value` 列为 `NULL`。由于 `UNION ALL` 不去重,因此即使有多个 `NULL` 也不会被合并[^3]。 #### 3. 使用 `UNION ALL` 配合 `NULL` 实现复杂查询 在实际应用中,`UNION ALL` 经常用来构建复杂的查询语句。例如,可以利用 `UNION ALL` 将不同的子查询结果拼接到一起,并且允许部分字段为空(即 `NULL`)。下面是一个更具体的例子,展示如何结合 `UNION ALL` `NULL` 构建跨表联合查询: ```sql SELECT id, name, address FROM users WHERE active = 1 UNION ALL SELECT id, name, NULL FROM inactive_users; ``` 在这个例子中,来自 `inactive_users` 表的部分缺少地址信息,所以将其设置为 `NULL`。最终结果集中包含了所有活跃用户的完整信息以及非活跃用户的部分信息[^3]。 #### 4. 注意事项 需要注意的是,在执行涉及大量数据的操作时,应谨慎评估性能影响。虽然 `UNION ALL` 不会对结果进行额外排序或去重从而提高效率,但如果后续还需要进一步加工或者过滤数据,则可能引入新的开销[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值