SQL - UNION 与 UNION ALL


UNIONUNION ALL运算符只是代数集合运算符的 SQL 实现。它们都用于从多个表中检索行并将它们作为一个表返回。这两个运算符之间的区别在于 UNION 仅返回不同的行,而 UNION ALL 返回表中存在的所有行。

然而,为了让这些操作员在这些表上工作,他们需要遵循下面给出的条件 -

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

一旦满足这些条件,UNION 或 UNION ALL 运算符就会将多个表中的行作为结果表返回。

第一个表的列名将成为结果表的列名,第二个表的内容将合并到相同数据类型的结果列中。

什么是联盟?

UNION 是 SQL 中的一种运算符/子句,其工作原理类似于关系代数中的 union 运算符。它只是组合来自联合兼容的多个表的信息。

只有表中不同的行才会添加到结果表中,因为 UNION 会自动消除所有重复记录。

句法

以下是 SQL 中 UNION 运算符的语法 -

SELECT * FROM table1
UNION
SELECT * FROM table2;

例子

让我们首先创建两个表 COURSES_PICKED 和 EXTRA_COURSES_PICKED,它们具有相同数量的列和相同的数据类型。

使用以下查询创建表 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');

该表将显示如下 -

学生卡 学生姓名 课程名
1 约翰 英语
2 罗伯特 计算机科学
3 萨莎 通讯
4 朱利安 数学

现在,让我们使用以下查询创建另一个表 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');

该表将创建如下所示 -

学生卡 学生姓名 课程_PICKED
1 约翰 体育
2 罗伯特 健身房
3 萨莎 电影
4 朱利安 数学

现在,让我们使用 UNION 查询组合这两个表,如下所示 -

SELECT * FROM COURSES_PICKED
UNION
SELECT * FROM EXTRA_COURSES_PICKED;

输出

执行 UNION 操作后得到的结果表如下 -

学生卡 学生姓名 课程名
1 约翰 英语
2 罗伯特 计算机科学
3 萨莎 通讯
4 朱利安 数学
1 约翰 体育
2 罗伯特 健身房
3 萨莎 电影

什么是UNION ALL?

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

假设有两个表,其中一个包含玩家在国际比赛中参加的比赛数,另一个包含玩家在国内参加的比赛数。

联盟 vs 联盟

正如我们在上表中看到的,Kohli 参加了 234 场国际比赛和 234 场国内比赛。尽管这些列中的数据相同,但它们都是单独的匹配项。需要在显示玩家参加的总比赛的结果表中包含这两行。因此,在这种情况下我们使用 UNION ALL 运算符。

联盟 vs 联盟1

句法

以下是 SQL 中 UNION ALL 运算符的语法 -

SELECT * FROM table1
UNION ALL
SELECT * FROM table2;

例子

在下面的示例中,让我们使用下面给定的查询对上面给出的相同示例表执行 UNION ALL 操作:“COURSES_PICKED”和“EXTRA_COURSES_PICKED” -

SELECT * FROM COURSES_PICKED
UNION ALL
SELECT * FROM EXTRA_COURSES_PICKED;

输出

结果表显示如下 -

学生卡 学生姓名 课程名
1 约翰 英语
2 罗伯特 计算机科学
3 萨莎 通讯
4 朱利安 数学
1 约翰 体育
2 罗伯特 健身房
3 萨莎 电影
4 朱利安 数学