MySQL - UNION vs UNION ALL
MySQL:UNION 与 UNION ALL
Section titled “MySQL:UNION 与 UNION ALL”在 SQL 中,UNION 和 UNION ALL 运算符用于将两个或多个 SELECT 语句的结果集合并为一个单一的结果集。虽然它们的目的相似,但它们在处理重复行方面存在关键差异,这对性能和结果有着显著影响。
为了使这些运算符正常工作,组合的 SELECT 语句必须遵守以下规则:
- 每个
SELECT语句必须具有相同数量的列。 - 对应的列必须具有兼容的数据类型(例如,可以将
INT与BIGINT联合,或将VARCHAR与CHAR联合)。 - 每个
SELECT语句中的列必须按相同顺序排列。
MySQL UNION 运算符
Section titled “MySQL UNION 运算符”UNION 运算符组合结果集,然后删除重复行。它有效地对组合集执行 SELECT DISTINCT,确保最终结果中的每一行都是唯一的。
基本语法如下:
SELECT column1, column2 FROM table1UNIONSELECT column1, column2 FROM table2;MySQL UNION ALL 运算符
Section titled “MySQL UNION ALL 运算符”UNION ALL 运算符也组合结果集,但它不删除重复行。它只是将第二个结果集中的行附加到第一个结果集,从而导致更快但可能冗余的输出。
语法几乎相同:
SELECT column1, column2 FROM table1UNION ALLSELECT column1, column2 FROM table2;主要差异和性能
Section titled “主要差异和性能”| Feature | UNION | UNION ALL |
|---|---|---|
| 重复行 | 移除重复项 | 包含所有重复项 |
| 性能 | 较慢 | 较快 |
| 用途 | 当您只需要来自多个源的唯一记录时。 | 当重复项可接受或已知不存在时。 |
性能洞察: UNION 较慢,因为数据库必须执行额外的步骤来识别和消除重复行。这通常涉及对组合结果集进行排序并扫描重复项。UNION ALL 完全跳过此开销。最佳实践: 除非您有明确的去重需求,否则请始终使用 UNION ALL。
实际示例:比较 UNION 和 UNION ALL
Section titled “实际示例:比较 UNION 和 UNION ALL”让我们创建两个表来存储全日制和非全日制学生的课程注册。请注意,有些学生可能同时注册了两者。
CREATE TABLE full_time_students ( student_id INT NOT NULL, student_name VARCHAR(50) NOT NULL, course_name VARCHAR(50) NOT NULL);
CREATE TABLE part_time_students ( student_id INT NOT NULL, student_name VARCHAR(50) NOT NULL, course_name VARCHAR(50) NOT NULL);
INSERT INTO full_time_students VALUES(101, 'Alice', 'Calculus I'),(102, 'Bob', 'History 101'),(103, 'Charlie', 'Physics I');
INSERT INTO part_time_students VALUES(201, 'David', 'English Lit'),(102, 'Bob', 'History 101'), -- 重复记录(202, 'Eve', 'Art History');使用 UNION 组合
Section titled “使用 UNION 组合”要获取所有学生注册的唯一列表,我们使用 UNION。请注意,Bob 的重复注册已被移除。
SELECT student_id, student_name, course_name FROM full_time_studentsUNIONSELECT student_id, student_name, course_name FROM part_time_students;结果只包含不同的行:
| student_id | student_name | course_name |
|---|---|---|
| 101 | Alice | Calculus I |
| 102 | Bob | History 101 |
| 103 | Charlie | Physics I |
| 201 | David | English Lit |
| 202 | Eve | Art History |
使用 UNION ALL 组合
Section titled “使用 UNION ALL 组合”要获取包含重复项的完整注册列表,我们使用 UNION ALL。这对于生成完整的班级名单可能很有用。
SELECT student_id, student_name, course_name FROM full_time_studentsUNION ALLSELECT student_id, student_name, course_name FROM part_time_students;结果包含两个表中的所有六行:
| student_id | student_name | course_name |
|---|---|---|
| 101 | Alice | Calculus I |
| 102 | Bob | History 101 |
| 103 | Charlie | Physics I |
| 201 | David | English Lit |
| 102 | Bob | History 101 |
| 202 | Eve | Art History |