如何理解SQL中的自连接?

简介: 说起自连接,想必小伙伴们都听说过。在进行数据处理时经常会使用到自连接,特别是像一些连续性的问题中使用的比较多。

自连接是什么

那我们如何理解自连接呢?

自连接说白了其实就是两张表结构和数据内容完全一样的表,在做数据处理的时候,我们通常会给它们分别重命名来加以区分(言外之意:不重命名也不行啊,不然数据库也不认识它们谁是谁),然后进行关联。

下面我们来看看它们到底是怎么进行自连接的

示例表内容

有如下一张表Student,表结构及数据如下:

1.jpg

当我们进行自连接时,不加任何过滤条件。具体如下:

SELECT  
s1.Sname AS Sname1,
s2.Sname AS Sname2
FROM Student s2,Student s1


得到的结果是这样的:

2.jpg

这结果看着好眼熟啊,好像在哪里见过。没错,其实就是我们数学上的排列。

大致的排列方式是酱紫的:


3.jpg


先是name1中的张三分别与name2中的张三,李四,王五组合成前面3条记录然后name1中的李四分别与name2中的张三,李四,王五组合成中间3条记录最后name1中的王五分别与name2中的张三,李四,王五组合成最后3条记录

这样就得到了我们上面的结果了。

但是我们常见的自连接大多数其实是有条件的。不管什么条件,其实都是在上面的结果上进行过滤的。

比如我们想找到一一对应的数据,可以这样写:

SELECT  
s1.Sname AS Sname1,
s2.Sname AS Sname2
FROM Student s2,Student s1
WHERE s1.Sname=s2.Sname




得到的结果就是两个自连接的表一一对应的了:

4.jpg

这里的就是自连接的精髓了,张三自己和自己进行了关联,所以你说这是什么连接?

但是我们工作中,使用自连接的目的并不是自己和自己关联,更多的时候是和表里的其他进行组合,像这样:

SELECT  
s1.Sname AS Sname1,
s2.Sname AS Sname2
FROM Student s2,Student s1
WHERE s1.Sname<>s2.Sname


结果如下:




5.jpg

此外,如果我们想进一步的排除掉重复的数据行,比如张三,李四和李四,张三,我们默认这两行是重复数据(尽管他们顺序不同,但是在数学集合上,这两行可以看作是相同的结果集),只想保留一种的话,可以这样:

SELECT  
s1.Sname AS Sname1,
s2.Sname AS Sname2
FROM Student s2,Student s1
WHERE s1.Sname>s2.Sname


得到的结果如下:

6.jpg

这样我们就得到了“不重复”的3行数据了,这个与数学上的组合是一样的。


自连接实战
上面我们举了一个自连接来处理连续性问题,下面我们再举一个用自连接来删除重复数据的示例:

示例表结构有如下一张Student表,表结构和数据如下:

7.jpg

我们想删除表中重复的数据行,该如何写这个SQL?

我们分析一下,发现这个表是没有主键ID的,为了区分它们的话,我需要给它新增一个虚列主键,怎么做?可以这样写:

SELECT 
IDENTITY(INT) ID,
Sname,
Score
INTO Student_Tmp
FROM Student


这里我们使用自增长函数IDENTITY()来生成了一个生成一个类似自增主键的ID,并且将结果插入到Student_Tmp,其中Student_Tmp中的具体内容如下:


8.jpg

然后,我们可以通过保留最大值或最小值的方式来删除重复项,具体如下:

DELETE FROM Student_Tmp
WHERE Student_Tmp.ID< (
            SELECT Max(s2.ID)
            FROM Student_Tmp s2
            WHERE Student_Tmp.Sname=s2.Sname
            AND Student_Tmp.Score=s2.Score
);


这样我们就可以删除ID为3和4的列了,查询一下Student_Tmp里的内容如下:


9.jpg

注意:由于SQL Server的一些限制,我们对源表不能进行上述操作,为了给大家演示自连接的作用,做了一定的调整。如果想在SQL Server中删除原表中的重复行,可以使用如下方法:

SELECT DISTINCT * INTO Student_Tmp FROM Student
TRUNCATE TABLE Student
INSERT INTO Student SELECT * FROM Student_Tmp
DROP TABLE Student_Tmp


通过上述的办法,我们使用自连接的方式删除了Student_Tmp里面的重复行。

相关文章
|
SQL 缓存 运维
PostgreSQL 事务号回卷分析
## XID 定义 xid 是个啥东西?xid 就是 PostgreSQL 里面的事务号,每个事物都会分配一个 xid。PostgreSQL 数据中每个元组头部都会保存着 插入 或者 删除 这条元组的事务号,即 xid,然后内核通过这个 xid 进行元组的可见性判断。简单理解,比如有两个事务,xid1=200,xid2=201,那么 xid1 中只能看到 t_xmin 200 的元组。 ```c
|
9月前
|
数据挖掘 OLAP 云计算
[直播预约]StarRocks 2025 Roadmap 全面解读
2月19日19:00-20:30,StarRocks TSC Member赵恒、康凯森将解读2025 Roadmap,并邀请多位专家分享最新进展。欢迎参与交流!
|
存储 SQL 人工智能
【云栖实录】Hologres3.0全新升级:一体化实时湖仓平台
2024年云栖大会,Hologres 3.0全新升级为一体化实时湖仓平台,通过统一数据平台实现湖仓存储一体、多模式计算一体、分析服务一体、Data+AI 一体,发布 Dynamic Table、External Database、分时弹性、Query Queue、NL2SQL 等众多新的产品能力,实现一份数据、一份计算、一份服务,极大提高数据开发及应用效率。同时,Hologres 的预付费实例年付折扣再降15%,仅需7折,不断帮助企业降低数据管理成本,赋能业务增长。
|
存储 SQL BI
深入解析实时数仓Doris:Rollup上卷表与查询
深入解析实时数仓Doris:Rollup上卷表与查询
|
存储 SQL 弹性计算
实时数仓Hologres新一代弹性计算组实例技术揭秘
实时数仓Hologres新一代弹性计算组实例技术揭秘
2810 57
实时数仓Hologres新一代弹性计算组实例技术揭秘
|
存储 算法 Oracle
数据库等值查询与统计信息
统计信息是为优化器的 cost 估算提供数据支撑,其中很重要的一点需求便是等值查询(EQUALS, IN 等) 场景下的基数估算。
数据库等值查询与统计信息
|
Web App开发
Chrome 插件:无痕浏览模式下加载插件、启用插件设置方法
Chrome 插件:无痕浏览模式下加载插件、启用插件设置方法
944 0
Chrome 插件:无痕浏览模式下加载插件、启用插件设置方法
|
Java 关系型数据库 MySQL
|
人工智能 分布式计算 前端开发
更高效的Cascades优化器 - Columbia Query Optimizer
在较早的文章中介绍了些Volcano/Cascades优化器框架的设计理念和实现思路,基本是基于论文的解读:VolcanoCascades虽然cascades号称目前最为先进的优化器搜索框架,但不得不说这2篇paper的内容,实在是让人看起来有些吃力。尤其是后篇,说是从工程实现的角度来描述,但讲解的不够详尽,而且有些地方既模糊又抽象。此外工业界并没有一款优化器是完全基于paper的框架去实现的,这
2339 0
更高效的Cascades优化器 - Columbia Query Optimizer
|
SQL 存储 算法
数据库挖祖坟系列-优化器设计探索穿越之旅
前沿引用来自百度百科的话术:在数据库技术发展历史上,1970 年是发生伟大转折的一年,因为这一年的6月,IBM的圣约瑟研究实验室的高级研究员Edgar Frank Codd在Communications of ACM 上发表了《A Relational Model of Data for Large Shared Data Banks》。ACM 后来在1983 年把这篇论文列为从1958年以来的2
166 0
数据库挖祖坟系列-优化器设计探索穿越之旅