SQL UNION vs JOIN
SQL提供了各种关系操作符来处理分布在关系数据库中的数据。其中,UNION和JOIN查询基本上用于将来自多个表的数据合并。
尽管它们都用于相同的目的,即合并表格,但这些运算符的工作方式之间有很多不同之处。主要的区别在于UNION运算符组合来自多个相似表的数据,而不考虑数据的相对性,而JOIN运算符仅用于组合来自多个表的相对数据。
UNION的工作原理
UNION是SQL中的一种操作符/子句,其工作方式类似于关系代数中的并集运算符。它只是简单地将多个兼容并的表的信息合并在一起。
如果满足以下条件,我们说这些表是兼容并的:
- 要组合的表必须具有相同的列数和相同的数据类型。
- 行数不需要相同。
一旦满足了这些条件,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表中:
使用下方查询的帮助将值插入到COURSES_PICKED表中−
INSERT INTO COURSES_PICKED VALUES
(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', 'PHOTOGRAPHY');
现在,让我们使用UNION查询来合并表COURSES_PICKED和EXTRA_COURSES_PICKED,如下所示-
SELECT * FROM COURSES_PICKED
UNION
SELECT * FROM EXTRA_COURSES_PICKED;
输出
执行UNION操作后得到的结果表为−
STUDENT_ID | STUDENT_NAME | COURSE_NAME |
---|---|---|
1 | Jhon | English |
1 | Jhon | Physical Education |
2 | Robert | Computer Science |
2 | Robert | Gym |
3 | Shasha | Communications |
3 | Shasha | Film |
4 | Julian | Mathematics |
4 | Julian | Photography |
JOIN的工作原理
JOIN操作用于根据它们的共有字段,将多个相关表的信息合并成一个表。该操作可以与ON、WHERE、ORDER BY、GROUP BY等子句一起使用。
有两种类型的JOIN:
- 内连接
- 外连接
内连接是最基本的连接类型,它仅检索共有列的匹配值。这是默认的连接类型。
外连接的结果表包括第一个表中的匹配行和未匹配行。外连接又分为左连接、右连接和全连接。
语法
以下是SQL中JOIN操作的基本语法:
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.column_name = table2.column_name;
示例
在下面的示例中,我们将使用以下查询将上面创建的相同的表COURSES_PICKED和EXTRA_COURSES_PICKED进行连结 –
SELECT c.STUDENT_ID, c.STUDENT_NAME, COURSE_NAME, COURSES_PICKED FROM COURSES_PICKED c
JOIN EXTRA_COURSES_PICKED e
ON c.STUDENT_ID = e.STUDENT_ID;
输出
结果表将如下所示−
STUDENT_ID | STUDENT_NAME | COURSE_NAME | COURSE_PICKED |
---|---|---|---|
1 | Jhon | ENGLISH | Physical Education |
2 | Robert | COMPUTER SCIENCE | Gym |
3 | Shasha | COMMUNICATIONS | Film |
4 | Julian | MATHEMATICS | Photography |
UNION Vs JOIN
正如我们在上面给出的例子中所看到的,UNION操作符只能在相容的表之间执行,而JOIN操作符则是将两个表联接在一起,这两个表不需要相容,但是必须有关联。
让我们总结下这些查询之间的所有差异如下:
UNION | JOIN |
---|---|
UNION操作只能在具有联合兼容性的表上执行,即表必须具有相同数量的列且具有相同的数据类型。 | JOIN操作可以在至少有一个公共字段的表之间执行。表不需要是联合兼容的。 |
合并的数据将作为结果表的新行添加。 | 合并的数据将作为新列附加到结果表中。 |
这相当于合取操作。 | 这相当于交集操作。 |
UNION从结果表中删除所有重复值。 | JOIN保留两个表中所有值,即使它们是冗余的。 |
UNION不需要任何附加的子句来合并两个表。 | JOIN需要一个附加的ON子句来基于一个公共字段合并两个表。 |
它主要用于合并组织中旧员工列表和新员工列表的情况。 | 它用于需要合并相关表的情况。例如,合并包含客户列表和他们的订单的表。 |