Mysql 简明教程
MySQL - Union vs Join
MySQL 提供了多种关系运算符来处理跨关系数据库中多个表的数据。其中,UNION 和 JOIN 查询基本用于组合多个表中的数据。
MySQL provides various relational operators to handle data that is spread across multiple tables in a relational database. Out of them, UNION and JOIN queries are fundamentally used to combine data from multiple tables.
即使它们都用于同一目的(即合并表),但这些运算符的工作方式之间存在许多差异。主要区别在于 UNION 运算符合并来自多个相似表的无关数据,而 JOIN 运算符仅用于合并来自多个表的相关数据。
Even though they are both used for the same purpose, i.e. to combine tables, there are many differences between the working of these operators. The major difference is that the UNION operator combines data from multiple similar tables irrespective of the data relativity, whereas, the JOIN operator is only used to combine relative data from multiple tables.
Working of UNION
UNION 是 MySQL 中的一种操作符/子句,其作用类似于关系代数中的并集操作符。它不执行任何操作,只把来自多表的信息进行组合,前提是这些表具有联合兼容性。
UNION is a type of operator/clause in MySQL, that works similar to the union operator in relational algebra. It does nothing more than just combining information from multiple tables that are union compatible.
如果满足以下条件,则认为各表具有联合兼容性:
The tables are said to be union compatible if they follow the conditions given below:
-
The tables to be combined must have same number of columns with the same datatype.
-
The number of rows need not be same.
满足这些条件后,UNION 运算符将所有来自多个表的行(消除重复行后)作为结果表返回。
Once these criteria are met, UNION operator returns all the rows from multiple tables, after eliminating duplicate rows, as a resultant table.
Note: 第一表的列名将变为结果表的列名,第二表的的内容将合并到相同的数据类型的结果列中。
Note: Column names of first table will become column names of resultant table, and contents of second table will be merged into resultant columns of same data type.
Syntax
下面是 MySQL 中 UNION 运算符的语法:
Following is the syntax of UNION operator in MySQL −
SELECT * FROM table1
UNION
SELECT * FROM table2;
Example
我们首先使用相同数量且具有相同数据类型的列创建两个表“COURSES_PICKED”和“EXTRA_COURSES_PICKED”。
Let us first create two table "COURSES_PICKED" and "EXTRA_COURSES_PICKED" with the same number of columns having same data types.
使用以下查询创建表 COURSES_PICKED:
Create table COURSES_PICKED using the following query −
CREATE TABLE COURSES_PICKED(
STUDENT_ID INT NOT NULL,
STUDENT_NAME VARCHAR(30) NOT NULL,
COURSE_NAME VARCHAR(30) NOT NULL
);
使用下面给出的查询向 COURSES_PICKED 表中插入值:
Insert values into the COURSES_PICKED table with the help of the query given below −
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 using the following query −
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 表中插入值的查询 −
Following is the query to insert values into the EXTRA_COURSES_PICKED table −
INSERT INTO EXTRA_COURSES_PICKED VALUES
(1, 'JOHN', 'PHYSICAL EDUCATION'),
(2, 'ROBERT', 'GYM'),
(3, 'SASHA', 'FILM'),
(4, 'JULIAN', 'PHOTOGRAPHY');
现在,让我们使用 UNION 查询合并这两个表,如下所示:
Now, let us combine both these tables using the UNION query as follows −
SELECT * FROM COURSES_PICKED
UNION
SELECT * FROM EXTRA_COURSES_PICKED;
Working of JOIN
联接操作用于根据公共字段将来自多个相关表中的信息组合到一个表中。
The Join operation is used to combine information from multiple related tables into one, based on their common fields.
在此操作中,第一表的每一行将与第二表的每一行组合。获得的结果表将包含存在于这两个表中的行。此操作可与各种子句一起使用,例如 ON、WHERE、ORDER BY、GROUP BY 等。
In this operation, every row of the first table will be combined with every row of the second table. The resultant table obtained will contain the rows present in both tables. This operation can be used with various clauses like ON, WHERE, ORDER BY, GROUP BY etc.
联接有两种类型:
There are two types of Joins:
-
Inner Join
-
Outer Join
基本类型的联接是内部联接,它只检索公共列的匹配值。它是默认联接。其他联接,例如交叉联接、自然联接、条件联接等,都是内部联接的类型。
The basic type of join is an Inner Join, which only retrieves the matching values of common columns. It is a default join. Other joins like Cross join, Natural Join, Condition Join etc. are types of Inner Joins.
外部联接在结果表中包括第一表的匹配和不匹配行。它被分为左联接、右联接和全联接等子类型。
Outer join includes both matched and unmatched rows from the first table, in the resultant table. It is divided into subtypes like Left Join, Right Join, and Full Join.
即使联接操作可以合并多张表,但连接两张表的最简单方法是不使用除 ON 子句以外的任何子句。
Even though the join operation can merge multiple tables, the simplest way of joining two tables is without using any Clauses other than the ON clause.
Syntax
以下是联接操作的基本语法:
Following is the basic syntax of Join operation −
SELECT column_name(s)
FROM table1
JOIN table2
ON table1.common_field = table2.common_field;
Example
在以下示例中,我们将尝试使用以下查询联接我们上面创建的表,即 COURSES_PICKED 和 EXTRA_COURSES_PICKED:
In the following example, we will try to join the same tables we created above, i.e., COURSES_PICKED and EXTRA_COURSES_PICKED, using the query below −
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;
UNION vs JOIN
正如我们在上面给出的示例中看到的,UNION 运算符只能对可并集的表执行,而 JOIN 运算符则联接两个不必可并集但应该相关的表。
As we saw in the examples given above, the UNION operator is only executable on tables that are union compatible, whereas, the JOIN operator joins two tables that need not be compatible but should be related.
让我们在下面总结这些查询之间的所有区别 −
Let us summarize all the difference between these queries below −