SQL UNION 和 UNION ALL的区别
UNION 和 UNION ALL 运算符只是SQL中代数集合运算符的实现方法。它们都用于从多个表中检索行并将它们作为一个单一表返回。这两个运算符的区别在于,UNION只返回不同的行,而UNION ALL返回表中所有的行。
然而,为了在这些表上使用这些运算符,它们需要遵循以下条件−
- 要组合的表必须具有相同数量和相同数据类型的列。
- 行数不需要相同。
一旦满足了这些条件,UNION或UNION ALL运算符将从多个表中返回行作为结果表。
注意 −第一个表的列名将成为结果表的列名,并且第二个表的内容将与相同数据类型的结果列合并。
什么是UNION
UNION是一种SQL中的运算符/子句,它与关系代数中的并运算符类似。它仅仅是将来自多个具有并集兼容性的表的信息组合在一起。
只有来自这些表的不同行被添加到结果表中,因为UNION会自动消除所有重复记录。
语法
以下是SQL中UNION运算符的语法−
SELECT * FROM table1
UNION
SELECT * FROM table2;
示例
首先,我们创建两个表“COURSES_PICKED”和“EXTRA_COURSES_PICKED”,这两个表具有相同数量的列和相同的数据类型。
使用以下查询创建表COURSES_PICKED−
SQL> CREATE TABLE COURSES_PICKED(
STUDENT_ID INT NOT NULL,
STUDENT_NAME VARCHAR(30) NOT NULL,
COURSE_NAME VARCHAR(30) NOT NULL
);
使用下面的查询向COURSES_PICKED表中插入值:
SQL> INSERT INTO COURSES_PICKED VALUES(1, 'JOHN', 'ENGLISH');
INSERT INTO COURSES_PICKED VALUES(2, 'ROBERT', 'COMPUTER SCIENCE');
INSERT INTO COURSES_PICKED VALUES(3, 'SASHA', 'COMMUNICATIONS');
INSERT INTO COURSES_PICKED VALUES(4, 'JULIAN', 'MATHEMATICS');
这个表格将被显示为 −
+------------+--------------+------------------+
| STUDENT_ID | STUDENT_NAME | COURSE_NAME |
+------------+--------------+------------------+
| 1 | JOHN | ENGLISH |
| 2 | ROBERT | COMPUTER SCIENCE |
| 3 | SASHA | COMMUNICATIONS |
| 4 | JULIAN | MATHEMATICS |
+------------+--------------+------------------+
使用以下查询创建表EXTRA_COURSES_PICKED –
SQL> 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表的查询语句 –
SQL> INSERT INTO EXTRA_COURSES_PICKED VALUES(1, 'JOHN', 'PHYSICAL EDUCATION');
INSERT INTO EXTRA_COURSES_PICKED VALUES(2, 'ROBERT', 'GYM');
INSERT INTO EXTRA_COURSES_PICKED VALUES(3, 'SASHA', 'FILM');
INSERT INTO EXTRA_COURSES_PICKED VALUES(4, 'JULIAN', 'MATHEMATICS');
表格将按如下所示创建-
+------------+--------------+--------------------+
| STUDENT_ID | STUDENT_NAME | COURSES_PICKED |
+------------+--------------+--------------------+
| 1 | JOHN | PHYSICAL EDUCATION |
| 2 | ROBERT | GYM |
| 3 | SASHA | FILM |
| 4 | JULIAN | MATHEMATICS |
+------------+--------------+--------------------+
现在,让我们尝试使用UNION查询将这两个表合并如下 –
SQL> SELECT * FROM COURSES_PICKED
UNION
SELECT * FROM EXTRA_COURSES_PICKED;
输出
执行 UNION 操作后获得的结果表是:
+------------+--------------+--------------------+
| STUDENT_ID | STUDENT_NAME | COURSE_NAME |
+------------+--------------+--------------------+
| 1 | JOHN | ENGLISH |
| 1 | JOHN | PHYSICAL EDUCATION |
| 2 | ROBERT | COMPUTER SCIENCE |
| 2 | ROBERT | GYM |
| 3 | SASHA | COMMUNICATIONS |
| 3 | SASHA | FILM |
| 4 | JULIAN | MATHEMATICS |
+------------+--------------+--------------------+
什么是UNION ALL
UNION ALL也是SQL中的一个操作符/子句,用于将多个表合并为一个。然而,这个操作符也会保留结果表中的重复行。
假设有两个表,一个表包含球员在国际比赛中参赛的次数,另一个表包含球员在国内比赛中参赛的次数。
正如我们在上面的表格中所看到的,科里在国际比赛中出战了234场比赛,在国内比赛中也出战了234场比赛。尽管这些列中的数据是相同的,但它们都是不同的比赛。在结果表中显示一名球员总共出战的比赛时,需要包括这两行数据。因此,在这种情况下,我们使用 UNION ALL 运算符。
语法
UNION ALL运算符在SQL中的语法如下:
SQL> SELECT * FROM table1
UNION ALL
SELECT * FROM table2;
示例
在下面的示例中,让我们尝试在上面给出的相同样本表” COURSES_PICKED”和” EXTRA_COURSES_PICKED”上执行UNION ALL操作,使用以下给定的查询−
SQL> 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 | FILM |
| 4 | JULIAN | MATHEMATICS |
+------------+--------------+--------------------+