Mysql 简明教程

MySQL - Union vs Join

MySQL 提供了多种关系运算符来处理跨关系数据库中多个表的数据。其中,UNION 和 JOIN 查询基本用于组合多个表中的数据。

即使它们都用于同一目的(即合并表),但这些运算符的工作方式之间存在许多差异。主要区别在于 UNION 运算符合并来自多个相似表的无关数据,而 JOIN 运算符仅用于合并来自多个表的相关数据。

Working of UNION

UNION 是 MySQL 中的一种操作符/子句,其作用类似于关系代数中的并集操作符。它不执行任何操作,只把来自多表的信息进行组合,前提是这些表具有联合兼容性。

如果满足以下条件,则认为各表具有联合兼容性:

  1. 要组合的表必须具有相同数量的具有相同数据类型的列。

  2. 行数不必相同。

满足这些条件后,UNION 运算符将所有来自多个表的行(消除重复行后)作为结果表返回。

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

Syntax

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

SELECT * FROM table1
UNION
SELECT * FROM table2;

Example

我们首先使用相同数量且具有相同数据类型的列创建两个表“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');

使用以下查询创建一个 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 查询合并这两个表,如下所示:

SELECT * FROM COURSES_PICKED
UNION
SELECT * FROM EXTRA_COURSES_PICKED;

Output

执行 UNION 操作后得到的结果表为 −

Working of JOIN

联接操作用于根据公共字段将来自多个相关表中的信息组合到一个表中。

在此操作中,第一表的每一行将与第二表的每一行组合。获得的结果表将包含存在于这两个表中的行。此操作可与各种子句一起使用,例如 ON、WHERE、ORDER BY、GROUP BY 等。

联接有两种类型:

  1. Inner Join

  2. Outer Join

基本类型的联接是内部联接,它只检索公共列的匹配值。它是默认联接。其他联接,例如交叉联接、自然联接、条件联接等,都是内部联接的类型。

外部联接在结果表中包括第一表的匹配和不匹配行。它被分为左联接、右联接和全联接等子类型。

即使联接操作可以合并多张表,但连接两张表的最简单方法是不使用除 ON 子句以外的任何子句。

Syntax

以下是联接操作的基本语法:

SELECT column_name(s)
FROM table1
JOIN table2
ON table1.common_field = table2.common_field;

Example

在以下示例中,我们将尝试使用以下查询联接我们上面创建的表,即 COURSES_PICKED 和 EXTRA_COURSES_PICKED:

mysql> 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;

Output

结果表将以以下方式显示 −

UNION vs JOIN

正如我们在上面给出的示例中看到的,UNION 运算符只能对可并集的表执行,而 JOIN 运算符则联接两个不必可并集但应该相关的表。

让我们在下面总结这些查询之间的所有区别 −