likes
comments
collection
share

【MySQL】MySQL 连接表的几种方式 JOIN 和 UNION 的区别

作者站长头像
站长
· 阅读数 10

本文对常用的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
评论
请登录