MySQL - UNION 与 UNION ALL
UNION 和 UNION ALL 运算符在 MySQL 中用于从多个表中检索行并将其返回为单个表。
但是,要使这些运算符在这些表上起作用,它们需要遵循以下条件 -
- 要合并的表必须具有相同数量的列和相同的数据类型。
- 行数不必是一样。
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 表的内容如下 -
STUDENT_ID | STUDENT_NAME | COURSE_NAME |
---|---|---|
1 | JOHN | ENGLISH |
2 | ROBERT | COMPUTER SCIENCE |
3 | SASHA | COMMUNICATIONS |
4 | JULIAN | MATHEMATICS |
现在,让我们创建另一个名为 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 表的内容如下 -
STUDENT_ID | STUDENT_NAME | COURSES_PICKED |
---|---|---|
1 | JOHN | PHYSICAL EDUCATION |
2 | ROBERT | GYM |
3 | SASHA | COMMUNICATIONS |
4 | JULIAN | MATHEMATICS |
使用 UNION 运算符合并表
现在,让我们使用 UNION 查询合并这两个表,如下所示 -
SELECT * FROM COURSES_PICKED UNION SELECT * FROM EXTRA_COURSES_PICKED;
输出
以下是获得的输出 -
STUDENT_ID | STUDENT_NAME | COURSE_NAME |
---|---|---|
1 | JOHN | ENGLISH |
2 | ROBERT | COMPUTER SCIENCE |
3 | SASHA | COMMUNICATIONS |
4 | JULIAN | MATHEMATICS |
1 | JOHN | PHYSICAL EDUCATION |
2 | ROBERT | GYM |
此处,"Julian"和"Shasha"选择的额外课程和课程相同,因此 COURSES_PICKED 和 EXTRA_COURSES_PICKED 表中的最后两条记录相同。当我们使用 UNION 运算符合并两个表时,它会排除相同的记录,只返回不同的记录。
使用 UNION ALL 运算符合并表
与 UNION 运算符不同,如果我们使用 UNION ALL 运算符合并上面创建的表,它会重新运行两个表中的所有记录 -
SELECT * FROM COURSES_PICKED UNION ALL SELECT * FROM EXTRA_COURSES_PICKED;
输出
结果表显示如下 -
STUDENT_ID | STUDENT_NAME | COURSE_NAME |
---|---|---|
1 | JOHN | ENGLISH |
2 | ROBERT | COMPUTER SCIENCE |
3 | SASHA | COMMUNICATIONS |
4 | JULIAN | MATHEMATICS |
1 | JOHN | PHYSICAL EDUCATION |
2 | ROBERT | GYM |
3 | SASHA | COMMUNICATIONS |
4 | JULIAN | MATHEMATICS |