MySQL7种join理论与实践

  

因为热爱所以坚持,因为热爱所以等待。熬过漫长无戏可演的日子,终于换来了人生的春天,共勉!!!

目录

前言:

正题:

1、内连接(INNER JOIN)

2、外连接(OUTRE JOIN)

2.1 左外连接(LEFT OUTER JOIN)

2.2 右外连接(RIGHT OUTER JOIN)

2.3 满外连接(FULL OUTER JOIN)

3、UNION用法

4、7中种JOIN的实现

4.1 左上图

4.2 右上图

4.3左中图

4.4中间图

4.5右中图

4.6左下图

4.7右下图

前言:

最近复习了一下MySQL的知识,温故知新,发现以前对7种join理论理解不够全面,同时也有些遗忘了,比如满外连接的写法 ,以及如何能使效率更高,union 和 union all 用哪个 ,这是我重新温习收获的,写个文章,加深理解!

正题:

如上图是我们的7种join的示范图,要展示如图所示的情况,在讲解7种join之前,首先我们要了解下内连接、外连接、以及UNION的用法

1、内连接(INNER JOIN)

内连接:合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行

  • 语法:(INNER 可以省略

SELECT 字段列表
FROM A表 INNER JOIN B表
ON 关联条件
WHERE 等其他子句;
  • 举例:
SELECT e.employee_id, e.last_name, e.department_id, 
       d.department_id, d.location_id
FROM   employees e JOIN departments d
ON     (e.department_id = d.department_id);
  • 结果:查询出员工的部门id部门id匹配的数据行

2、外连接(OUTRE JOIN)

外连接:两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL)。

注:

  1. 如果是左外连接,则连接条件中左边的表也称为主表,右边的表称为从表
  2. 如果是右外连接,则连接条件中右边的表也称为主表,左边的表称为从表。

2.1 左外连接(LEFT OUTER JOIN)

  • 语法:(同样的 OUTER可以省略

SELECT 字段列表
FROM A表 LEFT JOIN B表
ON 关联条件
WHERE 等其他子句;
  • 举例:

SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
LEFT OUTER JOIN departments d
ON   (e.department_id = d.department_id) ;

  •   结果:查询出员工的部门id部门id匹配的数据行,左边表所有的的数据行显示,右边表不匹配的为空(NULL)

2.2 右外连接(RIGHT OUTER JOIN)

  • 语法:

SELECT 字段列表
FROM A表 RIGHT JOIN B表
ON 关联条件
WHERE 等其他子句;
  • 举例:

SELECT e.last_name, e.department_id, d.department_name
FROM   employees e
RIGHT OUTER JOIN departments d
ON    (e.department_id = d.department_id) ;

  • 结果:查询出员工的部门id部门id匹配的数据行,边表所有的的数据行显示,左边表不匹配的为空(NULL)

2.3 满外连接(FULL OUTER JOIN)

  • 满外连接的结果 = 左右表匹配的数据 + 左表没有匹配到的数据 + 右表没有匹配到的数据。

  • SQL99是支持满外连接的。使用FULL JOIN 或 FULL OUTER JOIN来实现。

  • 需要注意的是,MySQL不支持FULL JOIN,但是可以用 LEFT JOIN UNION RIGHT join代替。

3、UNION用法

union:使用union关键字,我们可以将多条select语句结果集合并成一个结果集,合并时,两个表对应的列数和数据类型必须相同,并且相互对应。各个SELECT语句之间使用UNIONUNION ALL关键字分隔。

  • 语法:
SELECT column,... FROM table1
UNION [ALL]
SELECT column,... FROM table2

UNION操作符:返回两个查询的结果集的并集去除重复记录

 UNION ALL操作符:返回两个查询的结果集的并集对于两个结果集的重复部分,不去重

注意:

注意:执行UNION ALL语句时所占用的资源比UNION语句少。如果明确知道合并数据后的结果数据不存在重复数据,或者不需要去除重复的数据,则尽量使用UNION ALL语句,以提高数据查询的效率。

讲完了内连接、外连接、和UNION的用法后,7种join理论也就手到擒来了!

4、7中种JOIN的实现

我们的7种join无非也是从内连接、外连接、满外连接、以及他们的组合形式而成,接下来针对每一种情况,我会给出详细说明

4.1 左上图

 对于这种形式,其实就是我们的左外连接,A的所有部分+B不匹配的部分为空(NULL)

  • 示范:
select 字段列表
from A表 left join B表
on 关联条件
WHERE 等其他子句;

4.2右上图

  对于这种形式,其实就是我们的右外连接,B的所有部分+A不匹配的部分为空(NULL)

  • 示范:
select 字段列表
from A表 right join B表
on 关联条件
WHERE 等其他子句;

4.3左中图

  对于这种形式,结果集为 A - AB

  • 示范:
select 字段列表
from A表 left join B表
on 关联条件
where B表关联字段 is null and 等其他子句;

4.4中间图

 对于这种形式,其实就是我们的内连接

  •  示范:
select 字段列表
from A表 join B表
on 关联条件
WHERE 等其他子句;

4.5右中图

  对于这种形式,结果集为B - AB

  • 示范:
#实现B -  A∩B
select 字段列表
from A表 right join B表
on 关联条件
where A表关联字段 is null and 等其他子句;

4.6左下图

这种情况就是我们的满外连接啦,但是MySQL好像不支持FULL JOIN 语法,那要怎么做呢?

其实也很简单,就是用到我们的UNION或者UNION ALL(效率更高,没有去重操作),其结果集就是A∪B

第一种:UNION会帮我们去重

#实现查询结果是A∪B
select 字段列表
from A表 left join B表
on 关联条件
where 等其他子句

union 

select 字段列表
from A表 right join B表
on 关联条件
where 等其他子句;

 第二种:UNION ALL(不会自动去重,适用没有重复的情况使用,效率更高)

select 字段列表
from A表 left join B表
on 关联条件
where A表匹配字段 is NULL and 等其他子句

union all

select 字段列表
from A表 right join B表
on 关联条件
where 等其他子句;

实例:

SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL  #没有去重操作,效率高
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;

4.7右下图

这种情况就是就是将A、B独有的部分查出来了然后进行合并, 结果集为 A ∪B- A∩B,其实就是将我们上面的第三种和第五种进行合并得到的结果

代码示例:

#左中图 + 右中图  A ∪B- A∩B 或者 (A -  A∩B) ∪ (B - A∩B)
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL

好,到这里7种join理论就完结了,通过这些图示与代码,是不是对join理论有了更多的了解呢,喜欢就点赞收藏一下呗,后续持续更新MySQL相关更深入的知识!

 

  • 1
    点赞
  • 11
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:创作都市 设计师:CSDN官方博客 返回首页
评论

打赏作者

Free的午后

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值