【MySQL】MySQL 连接表的几种方式 JOIN 和 UNION 的区别
本文对常用的JOIN:交叉连接,外连接和内连接进行介绍,同时对 UNION 进行介绍,并介绍他们的区别。MySQL是一种关系数据库,关系表的设计就是要把信息分解成多个表,一类数据一个表,便于存储和处理。各个表之间使用键(关系)进行关联。因此,理清各种连接的作用和差异非常重要。
连接 JOIN
如果有表1 vendors,和表2 products 如下所示
vendors
----------------------------
vend_id vender_name
1 vendor1
2 vendor2
3 vendor3
----------------------------
products
---------------------------------------------------------
product_id product_name product_price vend_id
1 a 100 1
2 b 200 2
3 c 300 1
---------------------------------------------------------
交叉连接(cross join)
这种连接非常简单,在 FROM
语句中将各个表名使用 ,
连接即可。
连接表的时候,实际是将第一张表的每一行与第二张表的每一行进行匹配。结果将返回两个表的笛卡尔积,结果的行数时第一张表的行数乘第二张表的行数。可以看出,返回的数据量非常大,因此一般不使用。
SELECT *
FROM vendors, products
下面是,如果没有 WHERE
,笛卡尔积的结果为:
vend_id vender_name product_id product_name product_price vend_id
1 vendor1 1 a 100 1
2 vendor2 1 a 100 1
3 vendor3 1 a 100 1
1 vendor1 2 b 200 2
2 vendor2 2 b 200 2
3 vendor3 2 b 200 2
1 vendor1 3 c 300 1
2 vendor2 3 c 300 1
3 vendor3 3 c 300 1
内连接(等值连接)
内连接使用 INNER JOIN
关键字,其中 INNER
可以省略,写成 JOIN
。连接条件使用 ON
关键字。
结果只会返回两张表有关联的行,即两个表的交集。
SELECT *
FROM vendors JOIN products
ON vendors.vend_id = products.vend_id
vend_id vender_name product_id product_name product_price vend_id
1 vendor1 1 a 100 1
2 vendor2 2 b 200 2
1 vendor1 3 c 300 1
外部连接 左连接 / 右连接
左连接的关键字为 LEFT OUTER JOIN
,右连接的关键字为 RIGHT OUTER JOIN
,其中 OUTER
可以省略。
和内部连接不同的是,外部连接还会返回没有关联的行。
- 如果是左连接,结果会返回左边表的所有行,如果其中有数据在右边的表中没有,那么结果中那些右边的表带来的列值为
NULL
; - 如果是右连接,结果会返回右边表的所有行
SELECT vendor_name, product_name, product_price
FROM vendors LEFT JOIN products
ON vendors.vend_id = products.vend_id
vend_id vender_name product_id product_name product_price vend_id
1 vendor1 1 a 100 1
2 vendor2 2 b 200 2
1 vendor1 3 c 300 1
3 vendor3 NULL NULL NULL NULL
JOIN 总结
- 交叉连接 返回两个表的笛卡尔积,一般不使用
- 外连接 只会显示左边 / 右边表的所有数据,取决于使用左连接还是右连接
- 内连接 只会显示两个表中有关联的数据,相当于集合中的交集运算。
UNION
MySQL 允许执行多个查询,如果想要将这些结果合并成一个结果集返回,可以使用 UNION
,成为并,或者复合查询。
SELECT *
FROM products
WHERE product_price=100
UNION
SELECT *
FROM products
WHERE vend_id=2;
product_id product_name product_price vend_id
1 a 100 1
2 b 200 2
UNION
会检查结果中的重复,并且重复的行只返回一个,如果想要不做检查,全部返回,可以使用 UNION ALL
。
JOIN 和 UNION 总结
从 JOIN 和 UNION 的作用可以很明显的看出二者的区别:
JOIN
根据给定的连接条件,对两张表每一行数据的相同部分进行连接,产生一个新的记录集。UNION
则是对于查询到的记录集,进行合并,产生一个新的记录集。
转载自:https://juejin.cn/post/7221537562895122490