JOIN和UNION有什么区别?


Answers:


301

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)

6
您能告诉我什么是a UNION-JOIN,如何在标准SQL中完成它吗?Maria DB有一个命令union join,而其他数据库则没有。谢谢。
艾伦·莫拉德

72

联接和联合可用于合并一个或多个表中的数据。区别在于数据的组合方式。

简单来说,联接将数据合并到新列中。如果将两个表连接在一起,则来自第一张表的数据将显示在同一列中的第二列的同一列中。

联合将数据合并到新行中。 如果将两个表“联合”在一起,则来自第一个表的数据位于一组行中,而来自第二个表的数据位于另一组行中。这些行的结果相同。

这是联接的视觉描述。表A和B的列合并为一个结果。

在此处输入图片说明

结果中的每一行都包含表A和表B中的列。当一个表中的列与另一表中的列匹配时,将创建行。此匹配称为联接条件。

这使联接确实非常适合查找值并将其包含在结果中。这通常是归一化(反向归一化)的结果,并且涉及在一个表中使用外键通过在另一个表中使用主键来查找列值。

现在将上述描述与工会的描述进行比较。在并集中,结果中的每一行都来自一个表或另一个表。在联合中,不合并列以创建结果,不合并行。

在此处输入图片说明

联接和联合都可用于将一个或多个表中的数据合并为单个结果。他们俩都去这是不同的方式。联接用于组合来自不同表的列,而联合则用于组合行。

资源


4
这是一个很棒的视觉示例。我很确定我对其他答案有所了解,但这完全清除了它。
seadoggie01

从技术上来讲,对于join示例,结果应该不应该有10列?
巴拉斯·拉姆

60

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

通过使用JOIN,您可以基于表之间的逻辑关系从两个或多个表中检索数据。连接指示SQL应该如何使用一个表中的数据选择另一表中的行。

UNION操作不同于使用合并两个表中的列的JOIN。

UNION示例:

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

输出:

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

JOIN示例:

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

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


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

51

您可能会看到相同的示意图说明,但是这完全令人困惑。

对于UNION:

在此处输入图片说明

对于JOIN:

在此处输入图片说明


9
这些图片暗示FULL OUTER JOIN与相同UNION,但确实有所不同
icc97

1
该答案指出,这些图像令人困惑(它们是哪个IMO),但随后不再继续解释原因或对原始问题进行任何澄清。
Josh D.

1
每个带有图表的图像都能很好地说明情况。没有一个图像可以合并所有图表。这将更加令人困惑。
Java Main

41

加入:

联接用于显示来自不同表的具有相同或不同名称的列。显示的输出将单独显示所有列。也就是说,这些列将彼此对齐。

联盟:

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

21

他们是完全不同的东西。

一个加盟让您在不同的表中涉及的类似数据。

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


9

联合使两个查询看起来像一个。联接用于在单个查询语句中检查两个或多个表


3

联接和联合可用于合并一个或多个表中的数据。区别在于数据的组合方式。

简单来说,联接将数据合并到新列中。如果将两个表连接在一起,则来自第一张表的数据将显示在同一列中的第二列的同一列中。

联合将数据合并到新行中。如果将两个表“联合”在一起,则来自第一个表的数据位于一组行中,而来自第二个表的数据位于另一组行中。这些行的结果相同。


1

请记住,联合将合并结果(肯定是SQL Server)(功能或错误?)

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

id,值

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

id,值,id,值

1,3,1,3


6
这是根据ANSI标准,UNION ALL不会合并结果
vzczc,2009年

1
又见UNIONVS UNION ALL stackoverflow.com/questions/49925/...
Jaider

0

1. SQL Joins子句用于合并数据库中两个或多个表的记录。JOIN是一种通过使用每个表的公用值来组合两个表中的字段的方法。

2. SQL UNION运算符组合两个或多个SELECT语句的结果。UNION中的每个SELECT语句必须具有相同的列数。这些列还必须具有相似的数据类型。另外,每个SELECT语句中的列必须具有相同的顺序。

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

内部联接:

选择ID,NAME,AMOUNT和DATE

来自客户


内联订单


ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;

联盟:

选择ID,NAME,AMOUNT和DATE


来自客户


左加入订单


ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID

联盟

选择客户的ID,名称,金额和日期


正确加入订单


ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;


0

使用联盟

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

UNION示例:
SELECT 121 AS [Column1],221 AS [Column2]
联盟
SELECT 321 AS [Column1],422 AS [Column2]
输出:

列1列2
-------------------
121221
321422

使用联接

联接,您可以基于表之间的逻辑关系从两个或多个表中检索数据。

JOIN示例:
从TblA中选择a.Column1,b.Column2 a内部联接TblB b在a.Id = b.id上


-1

在抽象上,它们是相似的,因为两个表或结果集被组合在一起,但是UNION实际上是用于将具有相同数据类型的列与具有相同列数的结果集进行组合。结构是相同的,只添加新行。

在联接中,您可以将表/结果集与任何可能的结构组合在一起,包括没有共享/相似列的笛卡尔联接。


-1

UNION运算符仅用于组合两个或多个SELECT语句。

JOIN用于通过内部,外部,左或右方法从每个表中选择行。

请参考此处此处。有更好的例子说明。


-1

联合运算是行的垂直聚合的合并结果,联合运算是列的水平聚合的合并结果。


-3

我喜欢将一般差异视为:

  • 联接表
  • UNION(全部)组合查询。

1
这就引出了一个问题:join是用“ join”来表示的,union是用无法解释的“ combines”来表示的。无论如何,您认为您会添加其他使该“有用”的具有高度投票权的10年历史答案吗?(修辞格。)请参阅投票箭头鼠标悬停文本。
philipxy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.