Skip to content

MySQL - UNION vs UNION ALL

在 SQL 中,UNION 和 UNION ALL 运算符用于将两个或多个 SELECT 语句的结果集合并为一个单一的结果集。虽然它们的目的相似,但它们在处理重复行方面存在关键差异,这对性能和结果有着显著影响。

为了使这些运算符正常工作,组合的 SELECT 语句必须遵守以下规则:

  • 每个 SELECT 语句必须具有相同数量的列。
  • 对应的列必须具有兼容的数据类型(例如,可以将 INT 与 BIGINT 联合,或将 VARCHAR 与 CHAR 联合)。
  • 每个 SELECT 语句中的列必须按相同顺序排列。

UNION 运算符组合结果集,然后删除重复行。它有效地对组合集执行 SELECT DISTINCT,确保最终结果中的每一行都是唯一的。

基本语法如下:

SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;

UNION ALL 运算符也组合结果集,但它不删除重复行。它只是将第二个结果集中的行附加到第一个结果集,从而导致更快但可能冗余的输出。

语法几乎相同:

SELECT column1, column2 FROM table1
UNION ALL
SELECT column1, column2 FROM table2;
FeatureUNIONUNION ALL
重复行移除重复项包含所有重复项
性能较慢较快
用途当您只需要来自多个源的唯一记录时。当重复项可接受或已知不存在时。

性能洞察: UNION 较慢,因为数据库必须执行额外的步骤来识别和消除重复行。这通常涉及对组合结果集进行排序并扫描重复项。UNION ALL 完全跳过此开销。最佳实践: 除非您有明确的去重需求,否则请始终使用 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。请注意,Bob 的重复注册已被移除。

SELECT student_id, student_name, course_name FROM full_time_students
UNION
SELECT student_id, student_name, course_name FROM part_time_students;

结果只包含不同的行:

student_idstudent_namecourse_name
101AliceCalculus I
102BobHistory 101
103CharliePhysics I
201DavidEnglish Lit
202EveArt History

要获取包含重复项的完整注册列表,我们使用 UNION ALL。这对于生成完整的班级名单可能很有用。

SELECT student_id, student_name, course_name FROM full_time_students
UNION ALL
SELECT student_id, student_name, course_name FROM part_time_students;

结果包含两个表中的所有六行:

student_idstudent_namecourse_name
101AliceCalculus I
102BobHistory 101
103CharliePhysics I
201DavidEnglish Lit
102BobHistory 101
202EveArt History