MySQL - UNION 与 UNION ALL



MySQL 中的UNIONUNION ALL 运算符用于从多个表中检索行并将它们作为单个表返回。

但是,要使这些运算符能够在这些表上工作,它们需要遵循以下条件:

  • 要组合的表必须具有相同数量的列,并且数据类型相同。
  • 行数不必相同。

MySQL UNION 运算符

MySQL 中的 UNION 运算符的工作原理类似于关系代数中的并集运算符。此运算符组合来自多个联合兼容表的的信息。但是,只有表中的不同行会被添加到结果表中,因为 UNION 会自动消除所有重复记录。

语法

以下是 MySQL 中 UNION 运算符的语法:

SELECT * FROM table1
UNION
SELECT * FROM table2;

MySQL UNION ALL 运算符

UNION ALL 也是 MySQL 中的一个运算符/子句,用于将多个表组合成一个。但是,此运算符还会在结果表中保留重复行。

语法

以下是 MySQL 中 UNION ALL 运算符的语法:

SELECT * FROM table1
UNION ALL
SELECT * FROM table2;

MySQL UNION 与 MySQL UNION ALL

这两个运算符之间的唯一区别在于,UNION 仅返回不同的行,而 UNION ALL 返回两个表中存在的所有行。让我们通过一个示例来理解这一点。

示例

首先,我们需要创建两个表,它们具有相同数量的列,并且数据类型相同。以下查询创建了一个名为“COURSES_PICKED”的表:

CREATE TABLE COURSES_PICKED(
   STUDENT_ID INT NOT NULL, 
   STUDENT_NAME VARCHAR(30) NOT NULL, 
   COURSE_NAME VARCHAR(30) NOT NULL
);

以下查询将值插入到 COURSES_PICKED 表中:

INSERT INTO COURSES_PICKED VALUES
(1, 'JOHN', 'ENGLISH'),
(2, 'ROBERT', 'COMPUTER SCIENCE'),
(3, 'SASHA', 'COMMUNICATIONS'),
(4, 'JULIAN', 'MATHEMATICS');

COURSES_PICKED 表的内容如下:

学生 ID 学生姓名 课程名称
1 JOHN 英语
2 ROBERT 计算机科学
3 SASHA 传播学
4 JULIAN 数学

现在,让我们创建另一个名为 EXTRA_COURSES_PICKED 的表,如下所示:

CREATE TABLE EXTRA_COURSES_PICKED(
   STUDENT_ID INT NOT NULL, 
   STUDENT_NAME VARCHAR(30) NOT NULL, 
   EXTRA_COURSE_NAME VARCHAR(30) NOT NULL
);

以下是将值插入到 EXTRA_COURSES_PICKED 表中的查询:

INSERT INTO EXTRA_COURSES_PICKED VALUES
(1, 'JOHN', 'PHYSICAL EDUCATION'),
(2, 'ROBERT', 'GYM'),
(3, 'SASHA', 'FILM'),
(4, 'JULIAN', 'MATHEMATICS');

EXTRA_COURSES_PICKED 表的内容如下:

学生 ID 学生姓名 COURSES_PICKED
1 JOHN 体育
2 ROBERT 体操
3 SASHA 传播学
4 JULIAN 数学

使用 UNION 运算符组合表

现在,让我们使用以下 UNION 查询组合这两个表:

SELECT * FROM COURSES_PICKED
UNION
SELECT * FROM EXTRA_COURSES_PICKED;

输出

获得以下输出:

学生 ID 学生姓名 课程名称
1 JOHN 英语
2 ROBERT 计算机科学
3 SASHA 传播学
4 JULIAN 数学
1 JOHN 体育
2 ROBERT 体操

在这里,“Julian”和“Shasha”选择的额外课程和课程相同,因此,COURSES_PICKED 和 EXTRA_COURSES_PICKED 中的最后两条记录是相同的。当我们使用 UNION 运算符组合这两个表时,它会排除相同的记录,并且仅返回不同的记录。

使用 UNION ALL 运算符组合表

与 UNION 运算符不同,如果我们使用UNION ALL 运算符组合上面创建的表,它会返回两个表中的所有记录:

SELECT * FROM COURSES_PICKED
UNION ALL
SELECT * FROM EXTRA_COURSES_PICKED;

输出

结果表显示如下:

学生 ID 学生姓名 课程名称
1 JOHN 英语
2 ROBERT 计算机科学
3 SASHA 传播学
4 JULIAN 数学
1 JOHN 体育
2 ROBERT 体操
3 SASHA 传播学
4 JULIAN 数学
广告