关于sql:JOIN 和UNION的区别

What is the difference between JOIN and UNION?

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


UNION将查询中的行放在后面,而JOIN生成笛卡尔积并将其子集——完全不同的操作。UNION的小例子:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT 23 AS bah
    -> UNION
    -> SELECT 45 AS bah;
+-----+
| bah |
+-----+
|  23 |
|  45 |
+-----+
2 ROWS IN SET (0.00 sec)

类似的JOIN的小例子:

1
2
3
4
5
6
7
8
9
10
11
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)


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

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

联合操作不同于使用结合两个表中的列的联接。

联合示例:

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

输出:

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

联接示例:

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

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


对于这两种情况,您可能会看到相同的示意图解释,但这些完全令人困惑。

对于Union:

Enter image description here

对于联接:

氧化镁


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

简单地说,联接将数据合并到新列中。如果两个表连接在一起,那么第一个表中的数据将显示在同一行第二个表的列旁边的一组列中。

联合将数据合并为新行。如果两个表"联合"在一起,则第一个表中的数据位于一组行中,而第二个表中的数据位于另一组中。行的结果相同。

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

enter image description here

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

这使得join非常适合查找值并将其包含在结果中。这通常是非规范化(反向规范化)的结果,涉及到在一个表中使用外键通过在另一个表中使用主键来查找列值。

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

氧化镁

联接和联合都可以用于将一个或多个表中的数据组合成单个结果。他们都是以不同的方式进行的。联合用于合并不同表中的列,而联合用于合并行。

来源


加入:

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

工会:

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

例如:

见下表:

1
2
3
4
5
6
7
8
9
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

现在,对于执行连接类型,查询如下所示。

1
2
3
4
5
6
7
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

这是一个连接。

联合意味着您必须使用列的数量和类型相同,并将此添加到表/结果集在一起。看看这个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

它们完全不同。

联接允许您将不同表中的类似数据关联起来。

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


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


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

简单地说,联接将数据合并到新列中。如果两个表连接在一起,那么第一个表中的数据将显示在同一行第二个表的列旁边的一组列中。

联合将数据合并为新行。如果两个表"联合"在一起,则第一个表中的数据位于一组行中,而第二个表中的数据位于另一组中。行的结果相同。


请记住,联合将合并结果(SQL Server以确保)(功能或bug?)

1
2
3
SELECT 1 AS id, 3 AS VALUE
UNION
SELECT 1 AS id, 3 AS VALUE

ID,值

1,3

1
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


德国工会

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

1
2
3
4
UNION Example:
SELECT 121 AS [Column1], 221 AS [Column2]
UNION
SELECT 321 AS [Column1], 422 AS [Column2]
1
2
3
4
5
6
Output:

Column1    Column2
-------------------
121          221
321          422

敲击连接

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

1
2
JOIN Example:
SELECT a.Column1, b.Column2 FROM TblA a INNER JOIN TblB b ON a.Id = b.id

1。sql joins子句用于组合数据库中两个或多个表中的记录。联接是一种通过使用每个表通用的值来组合两个表中的字段的方法。

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

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

内部连接:

选择ID、名称、金额、日期

来自客户?

内部联接顺序?

on customers.id=orders.customer_id;

工会:

选择ID、名称、金额、日期

?来自客户?

左联单?

on customers.id=orders.customeru id

联合

选择ID、名称、金额、日期?来自客户?

是加入订单吗?

on customers.id=orders.customer_id;


联合操作是行的垂直聚合的组合结果,联合操作是列的水平聚合的组合结果。


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

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


union运算符仅用于组合两个或多个select语句。

而join用于从每个表中选择行,可以使用内部、外部、左侧或右侧方法。

请参阅这里和这里。有更好的解释和例子。


我喜欢把一般的区别认为是:

  • 联接联接表
  • 联合(et all)组合查询。