在SQL中,DISTINCT 和 UNION 都用于去重和合并查询结果,但它们的作用和使用方式有所不同。下面详细解释这两者:
1. DISTINCT
DISTINCT 关键字用于去除查询结果中的重复行,确保每一行都是唯一的。它应用于SELECT语句中的列,意味着只会返回不同(唯一)的值。
示例:
假设有一个名为 employees 的表,其中包含以下数据:
| id | name | department |
|---|---|---|
| 1 | Alice | HR |
| 2 | Bob | IT |
| 3 | Alice | HR |
| 4 | Carol | IT |
| 5 | Bob | IT |
你希望查询所有员工的唯一姓名,可以使用 DISTINCT:
SELECT DISTINCT name
FROM employees;
结果:
| name |
| Alice |
| Bob |
| Carol |
DISTINCT 会去除重复的 name,只保留唯一的值。
用法进阶:
select distinct name,department
from employees
此用法会返回唯一的 (name, department) 组合。也就是说,只有当 name 和 department 的组合形式重复时,它们才会被去掉。
2. UNION
UNION 用于合并两个或多个查询结果集,并自动去除重复行。它将每个查询的结果合并成一个最终的结果集,并排除重复的行。
UNION 需要确保所有的 SELECT 语句返回的列数和列类型一致。其主要特点是:
- 去重:合并后的结果会去掉重复的记录。
- 顺序不保证:
UNION的结果集中的行顺序不一定与原始查询的顺序一致。
示例:
假设有两个表,分别是 employees1 和 employees2,它们的结构相同,且包含如下数据:
employees1:
| id | name | department |
|---|---|---|
| 1 | Alice | HR |
| 2 | Bob | IT |
employees2:
| id | name | department |
|---|---|---|
| 3 | Carol | HR |
| 4 | Alice | HR |
你希望将这两个表中的 name 合并并去重:
SELECT name FROM employees1
UNION
SELECT name FROM employees2;
结果:
| name |
| Alice |
| Bob |
| Carol |
在这个例子中,UNION 将从 employees1 和 employees2 表中取出 name 列的值,去掉重复的 Alice。
3. UNION ALL
如果你不希望去重,可以使用 UNION ALL。UNION ALL 会将所有结果合并,无论是否有重复行。
示例:
SELECT name FROM employees1
UNION ALL
SELECT name FROM employees2;
结果:
| name |
| Alice |
| Bob |
| Carol |
| Alice |
在这个例子中,UNION ALL 保留了重复的 Alice,因此返回了所有的记录。
总结:
- DISTINCT:用于在查询结果中去除重复的行,确保每一行是唯一的。适用于一个查询中去重。
- UNION:用于合并多个查询结果,并去除重复的行。适用于合并来自不同查询的结果。
- UNION ALL:与
UNION类似,但不去重,保留所有行。
选择使用 DISTINCT 还是 UNION 取决于你需要的结果:是去重单一查询的结果,还是合并多个查询并去重。
1442

被折叠的 条评论
为什么被折叠?



