数据分析师必备技能之SQL(3) -- 连接

本文深入解析了SQL中常见的连接方式,包括内连接、左连接、右连接和全连接,并通过实例展示了如何在实际工作中运用这些连接技巧进行数据分析。此外,还介绍了如何利用差集A-B进行数据筛选。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实际工作中,我们会依据不同的业务建立对应的事实表及维度表,不太可能只有一两张宽表,可以涵盖所有需要的字段,这样对于存储空间是一种压力。因此,我们常常需要用到多表连接去查询需要分析的数据。

连接主要包括3大类:

  1. 横向连接:即拼接两个及以上单表的列数据,常用的有inner join、left join、right join
  2. 纵向连接:即拼接两个及以上单表的行数据,常用的有union ,但这种方式要求连接表的字段名称、类型需要一致
  3. 全连接:即拼接两个及以上单表的行、列数据,常用的有full outer join

下图结合韦恩图来解析下常见的7种连接,是非常值得收藏的一幅图(来源:网络):

示例用表(来源:Wiki百科):

注意:

  •  雇员表中 "Williams" 不在 部门表中的任何一个部门
  • 一个部门可能与许多雇员相关联

 

    1. 内连接(inner join):即找出左右都可匹配的记录

select t1.lastName
	,t1.departmentID
    ,t2.departmentName
from employee t1
inner join  department t2
on t1.departmentID = t2.departmentID
;

输出结果:

    2. 左连接(left join):以左表为准,逐条去右表找可匹配字段,如果有多条会逐次列出,如果没有找到则是NULL

select t1.lastName
	,t1.departmentID
    ,t2.DepartmentName
from employee t1
left join  department t2
on t1.departmentID = t2.departmentID
;

输出结果:

     3. 右连接(right join):以右表为准,逐条去左表找可匹配字段,如果有多条会逐次列出,如果没有找到则是NULL

select t1.lastName
	,t1.departmentID
    ,t2.DepartmentName
from employee t1
right join  department t2
on t1.departmentID = t2.departmentID
;

输出结果:

    4. 全连接(full outer join):包含两个表的连接结果,如果左表缺失或者右表缺失的数据会填充NULL

MySQL并不支持full outer join,但可以使用union 来替代实现:

select *
from   employee t1
left join department t2
on t1.DepartmentID = t2.DepartmentID
union
select *
from employee t1
right join department t2
on t1.DepartmentID = t2.DepartmentID
;

输出结果:

 

    5. 补充实际常用场景:差集A-B,即左表中剔除左右都匹配的部分

select t1.lastName
	,t1.departmentID
    ,t2.DepartmentName
from employee t1
left join  department t2
on t1.departmentID = t2.departmentID
where t2.DepartmentName is null
;

输出结果:

解析: 差集employee - department相当于把employee 表中不存在任何一个部门的员工找出来

而employee表确实存在这样的一位员工 "Williams", 不在 department表中的任何一个部门

 

小结:

  1. 笔者实际工作中用的最多的还是left join、union,right join/inner join都可以用left join替代
  2. 注意连接时,未匹配的字段以NULL填充
  3. 差集A-B也是实际中蛮常用到的,可以结合韦恩图好好练习一下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值