JOIN和UNION有什么区别?

327

JOINUNION 之间有什么区别?能给我举个例子吗?


任何现代的数据库系统,例如MariaDB,都实现了UNION JOIN命令。这是一个SQL 3命令,但它并不为人所知或使用。请通过*UNION JOIN*了解更多信息。 - Auston
@Auston UNION JOIN被提议过,但从未被添加到SQL中。 - philipxy
14个回答

405

UNION 将查询结果的行依次放置在一起,而 JOIN 进行笛卡尔积并将其子集化 - 完全不同的操作。下面是一个 UNION 的简单示例:

mysql> SELECT 23 AS bah
    -> UNION
    -> SELECT 45 AS bah;
+-----+
| bah |
+-----+
|  23 | 
|  45 | 
+-----+
2 rows in set (0.00 sec)

以下是一个类似的使用JOIN的简单示例:

mysql> SELECT * FROM 
    -> (SELECT 23 AS bah) AS foo 
    -> JOIN 
    -> (SELECT 45 AS bah) AS bar
    -> ON (33=33);
+-----+-----+
| foo | bar |
+-----+-----+
|  23 |  45 | 
+-----+-----+
1 row in set (0.01 sec)

8
@Alex Martelli的回答几乎完美,只是有点过于简洁,依赖笛卡尔积的概念(我不得不查阅才能理解其含义)。 - Nemo
让我来点个赞这个美丽的杰作...就是这样。最简单的解释方式。 - Luis Alvarado
清晰简单的例子才是真正阐明观点的,同时也更加突显了好的简单例子的价值。 - DryLabRebel

74

UNION将两个或多个查询的结果合并为一个结果集,该结果集包含属于联接中所有查询的所有行。

使用JOINs,可以根据表之间的逻辑关系从两个或多个表中检索数据。联接指示SQL如何使用来自一张表的数据来选择另一张表中的行。

UNION操作与使用JOINs合并两个表的列是不同的。

UNION示例:

SELECT 1 AS [Column1], 2 AS [Column2]
UNION
SELECT 3 AS [Column1], 4 AS [Column2]

输出:

Column1    Column2
-------------------
1          2
3          4

连接示例:

SELECT a.Column1, b.Column2 FROM TableA a INNER JOIN TableB b ON a.Id = b.AFKId

这将输出两个表中满足条件 a.Id = b.AFKId 的所有行。


Join可以从一个或多个表中检索数据。不一定是两个。 - Kennet Celeste

72

你可能会看到相同的图表解释,但这些完全令人困惑。

对于UNION操作:

在此输入图片描述

对于JOIN操作:

在此输入图片描述


21
这些图像暗示了FULL OUTER JOINUNION是相同的,但它们之间确实存在差异。请参考此处 - icc97
7
这个回答指出那些图片很令人困惑(我认为确实如此),但随后并没有解释为什么,也没有对原问题提供任何澄清。 - Josh D.
1
每张带有图示的图片都能完美地阐述情况。没有一张图片能够合并所有图示,那会更加混乱。 - Java Main

52

连接:

连接用于在不同表中显示具有相同或不同名称的列。输出将会单独显示所有列,即列将并排对齐。

联合:

UNION运算符用于组合具有相同数据类型的两个表的数据。执行UNION时,来自两个表的数据将收集在一个具有相同数据类型的单个列中。

例如:

请参见下面显示的两个表:

Table t1
Articleno article price manufacturer_id
1 hammer 3 $ 1
2 screwdriver 5 $ 2

Table t2
manufacturer_id manufacturer
1 ABC Gmbh
2 DEF Co KG

现在,要执行JOIN操作,请使用下面显示的查询语句。

SELECT articleno, article, manufacturer
FROM t1 JOIN t2 ON (t1.manufacturer_id =
t2.manufacturer_id);

articelno article manufacturer
1 hammer ABC GmbH
2 screwdriver DEF Co KG

那是一个连接操作。

UNION 表示您有两个表或结果集,这些表或结果集具有相同数量和类型的列,并将它们添加在一起。看下面的例子:

Table year2006
Articleno article price manufacturer_id
1 hammer 3 $ 1
2 screwdriver 5 $ 2

Table year2007
Articleno article price manufacturer_id
1 hammer 6 $ 3
2 screwdriver 7 $ 4

SELECT articleno, article, price, manufactruer_id
FROM year2006
UNION
SELECT articleno, article, price, manufacturer_id
FROM year2007

articleno article price manufacturer_id
1 hammer 3 $ 1
2 screwdriver 5 $ 2
1 hammer 6 $ 3
2 screwdriver 7 $ 4

27

他们是完全不同的东西。

join允许您关联不同表中的相似数据。

union 将两个不同查询的结果作为单个记录集返回。


16

连接(Joins)和联合(Unions)可以用于合并来自一个或多个表的数据,它们之间的区别在于数据如何合并。

简单来说,连接会将数据合并到新列中。如果两个表被连接在一起,那么第一个表的数据将与第二个表的数据在同一行中显示。

联合会将数据合并到新行中。如果两个表“unioned”在一起,那么第一个表的数据和第二个表的数据将分别在不同的一组行中,而这些行都包含在同一结果中。


15

使用联合查询可将两个查询合并为一条查询语句。而连接查询是用于在单个查询语句中检查两个或多个表。


3
  1. SQL JOIN子句用于在数据库中组合两个或多个表中的记录。通过使用每个表共同的值,JOIN是一种将来自两个表的字段组合的方法。

  2. SQL UNION操作符组合了两个或多个SELECT语句的结果。 UNION中的每个SELECT语句必须具有相同数量的列。列还必须具有类似的数据类型。此外,每个SELECT语句中的列必须按相同顺序排列。

例如: 表1客户/表2订单

内部联接:

SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS

INNER JOIN ORDERS

ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID; 

联合:

SELECT ID, NAME, AMOUNT, DATEFROM CUSTOMERS

LEFT JOIN ORDERS

ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID 
UNION
SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS

RIGHT JOIN ORDERS

ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID; 

3

请记住,联合操作会合并结果(确保使用SQL Server)(是特性还是缺陷?)

select 1 as id, 3 as value
union
select 1 as id, 3 as value

标识符, 值

1, 3

select * from (select 1 as id, 3 as value) t1 inner join (select 1 as id, 3 as value) t2 on t1.id = t2.id

编号,数值,编号,数值

1,3,1,3


7
根据ANSI标准,UNION ALL不会合并结果。 - vzczc
2
请参阅 UNION vs UNION ALL https://dev59.com/qnVD5IYBdhLWcg3wNY1Z - Jaider

2

联合操作是行的纵向聚合的组合结果, 连接操作是列的横向聚合的组合结果。


你的意思是在句子的第二部分使用 JOIN 吗? - გენო მუმლაძე
@გენომუმლაძე 是的,它是答案后面的Join,并且我已经进行了更正。谢谢您的指正 :) - R.Baldha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接