sql 自连接

【mysql】SQL自连接:什么时候需要,什么时候不需要? 只需筛选本行数据?WHERE足够!需要引用行信息?必须自连接!如果只需要筛选当前行的条件,使用WHERE子句即可如果需要获取引用行(如推荐人、上司)的任何信息,必须使用自连接如果需要比较两行的数据(如工资比较),必须使用自连接通过以上示例和解释,相信你已经对SQL自连接的使用场景有了清晰的理解。在实际开发中,先明确需求——是否需要获取引用行的信息,就能准确判断是否需要使用自连接了。 阅读详情

摘要:本文对SQL语言中的自身连接进行了详细的论述,讨论了自身连接存在的必要性,并通过实例对SQL中自身连接查询进行了深入的剖析。
  关键词:SQL 自连接 连接查询
  
  一、连接查询
  
  在SQL中,如果一个查询同时涉及到两个以上的表,那么这种查询就称为连接查询。连接有多种形式,有等值连接、自然连接、非等值连接、外连接、复合条件连接和自身连接等。
  大多数的连接,都是涉及到不同的表,以下面的SQL代码为例:
  SELECT Student.SNumber, Student.SName, StuCour.*
  FROM Student, StuCour
  WHERE Student.SNumber=StuCour.SNumber;
  在上面的SQL代码中,有两个表:学生信息表Student(SNumber, SName, SSex, SAge)和学生选课信息表StuCour(SNumber, CNumber, Grade),这两个表都有一个代表学生学号的叫做SNumber的属性。查询结果是将Student表和StuCour表中SNumber相同的学生的学号、姓名和选课信息显示出来。
  这种连接查询,使用多个表格,并利用了不同表格中相应的列的逻辑关系,SQL代码简单、清楚、明了。但连接操作,并不只存在于多个表之中,有时,对单表进行查询操作时,也必须使用连接操作。
  
  二、用SQL自连接查询处理列之间的关系
  
  SQL自身连接,可以解决很多问题。下面举的一个例子,就是使用了SQL自身连接,它解决了列与列之间的逻辑关系问题,准确的讲是列与列之间的层次关系。SQL代码如下:
  SELECT FIRST.CNumber, SECOND.PCNumber
  FROM Course FIRST, Course SECOND
  WHERE FIRST.PCNumber=SECOND.CNumber;
  在这个代码中,只涉及到一个表,即课程信息表COURSE(CNumber, CName, PCNumber),其中CNumber是该课程的课程号,PCNumber是该课程的先修课课程号。在FROM子句中,为Course表起了两个不同的别名,即FIRST和SECOND,即为Course表创建了两个不同的实例。查询时,使用了条件语句WHERE,要求FIRST表中的先修课号PCNumber同SECOND表中的课程号CNumber相同,而查询所需要的结果,是FIRST表的课程号CNumber和SECOND表中的PCNumber,那么查询结果,就应该是FIRST表中的课程号CNumber和该课程号所对应的间接先修课课程号。
  
  同样的查询,如果不使用自连接,而纯粹是对单表本身进行操作,那将是非常困难的。假设在这个表中,有两个元组(cnumber1, cname1, pcnumber1)和(cnumber2, cname2, pcnumber2),其中,pcnumber1=cnumber2。在同一个COURSE表上,关于课程号的信息,只有CNumber和PCNumber这两个属性,它们只能表示一个课程号(cnumber1)和该课程号直接先修课(pcnumber1=cnumber2)的一层关系。而间接先修课,需要求出cnumber1和pcnumber2的关系,这是一个二层关系。对于这个只能表示一层关系的表而言,如果纯粹对单表进行操作而不使用自然连接,那么一个可行的方案是,为Course表再增加一个列PPCNumber,令该列表示间接先修课,那么,通过三个列,就可以表示这种二层关系了。
  通过这个例子以及对这个例子的分析,我们可以初步得出结论,自连接查询,可以表示表中各列的层次关系。当所要查询的信息都出于同一个表,而又不能直接通过该表的各个列的直接层次关系得到最终结果的时候,那么应该考虑使用表的自连接查询。
  
  三、SQL自连接查询表示其它关系
  
  除了处理前面例子中的列之间的层次关系之外,SQL自连接查询还可用于处理列之间的顺序关系、因果关系等多种逻辑关系。此外,SQL自身查询还可以用于处理单列本身的逻辑关系。下面的例子,就说明了对单列的逻辑关系的处理。
  SELECT FIRST.Num, FIRST Stop, SECOND.Stop
  FROM Route FIRST, Route SECOND
  WHERE FIRST.NUM=SECOND.NUM;
  这个代码中,只涉及到一个表Route(Num, Stop),这个表可以表示某一线路的火车的车站线路信息。Num表示该车的车次号,Stop表示该次车停靠的城市名称。上面的代码,可以求出某一线路的火车可以联通的任意两个城市的名称。
  
  在这里例子中,连接的操作对象只有Num这一个列,通过相同的车次号,找出该列车联通的任意两个城市的信息。在这个例子中,原来表Route中的每一个元组,只能表示车号和该车的某一站点的信息,实际上,这是“1Vs1”的映射关系。如果要表示两个站点的联通关系,那么就应该把两个“1Vs1”关系合并,形成“1Vs多”的关系。我们利用自连接,很容易地解决了这个关系扩充的问题。
  下面的这里例子,是对单一的列进行连接处理:
  SELECT FIRST.Num, SECOND.Num, FIRST.Stop
  FROM Route FIRST, Route SECOND
  WHERE FRIST.Stop=SECOND.Stop;
  
  上面的SQL代码,求出了路经相同城市的车次的信息。原表中的车次和车站是“1Vs1”关系,通过自连接后,得到了车次和车站的“多Vs1”关系。
  
  总结
  
  同其它连接相比,SQL自连接查询本身并没有什么特殊的。但是,在应用中,自连接查询因为其语法结构简单,而逻辑结构复杂,语义往往不是那么容易被人理解,因此,在使用时,经常令人觉得迷惑不解。但只要把自连接运用的得当,把单表看成是多表,牢固树立这一思维定式,我们会发现,自连接查询会为我们解决很多复杂的问题。
=================================================================

 

到目前为止,我们连接的都是两张不同的表,那么能不能对一张表进行自我连接呢?答案是肯定的。
有没有必要对一张表进行自我连接呢?答案也是肯定的。

表的别名:
一张表可以自我连接。进行自连接时我们需要一个机制来区分一个表的两个实例。
在FROM clause(子句)中我们可以给这个表取不同的别名, 然后在语句的其它需要使用到该别名的地方
用dot(点)来连接该别名和字段名。

我们在这里同样给出两个表来对自连接进行解释。
爱丁堡公交线路,

车站表:
stops(id, name)

公交线路表:
route(num, company, pos, stop)

关于这两个表更详细的解释可以参考这里:http://sqlzoo.cn/buses.htm

一、对公交线路表route进行自连接。

SELECT * FROM route R1, route R2
  WHERE R1.num=R2.num AND R1.company=R2.company

    我们route表用字段(num, company)来进行自连接. 结果是什么意思呢?
你可以知道每条公交线路的任意两个可联通的车站。

二、用stop字段来对route(公交线路表)进行自连接。

SELECT * FROM route R1, route R2
  WHERE R1.stop=R2.stop;

查询的结果就是共用同一车站的所有公交线。这个结果对换乘是不是很有意义呢。

    从这两个例子我们可以看出,自连接的语法结构很简单,但语意结果往往不是
那么容易理解。就我们这里所列出的两个表,如果运用得当,能解决很多实际问题,
例如,任意两个站点之间如何换乘。

SELECT R1.company, R1.num
  FROM route R1, route R2, stops S1, stops S2
  WHERE R1.num=R2.num AND R1.company=R2.company
    AND R1.stop=S1.id AND R2.stop=S2.id
    AND S1.name='Craiglockhart'
    AND S2.name='Tollcross'

SQL进阶之自连接的用法 SQL进阶之自连接的用法自连接越前须知(雾)具体用法可重排列、排列、组合查询局部不一致的记录排序不分组排序分组排序 自连接 越前须知(雾) 本系列参考《SQL进阶教程》1,DBMS选用MySQL。 本系列不涉及数据库安装与基础语句,对初学者存在一定门槛;基础知识建议阅读《SQL必知必会(第四版)》与《SQL基础教程(第二版)》。 具体用法 可重排列、排列、组合 创表 CREATE TABLE Products (name VARCHAR(16) PRIMARY KEY, price INTEGER 阅读详情

相关推荐

第26讲:多表查询之自连接

思路:查询每个员工的姓名以及领导的名字,在人员信息表中,直属领导一列记录的是一个id号,这个id号其实就是人员信息表的主键ID,对应的每一个ID都是表中的一个人,我们的连接条件就是zsld_id=id,另外不需要显示出连接条件之外的其他数据,因此采用内连接就可以实现。例如:一张人员信息表,既有员工姓名的字段,也有员工直属领导的字段,但是直属领导的字段是一个ID,这个ID就与员工表中的ID字段有关联,此时就可以把人员信息表看做是多张表,通过关联查询得出结果。

江晓龙的博客 1834

sql 判断相等_Leetcode经典SQL刷题笔记(四)-连续区间问题

一.连续出现的数字编写一个 SQL 查询,查找所有至少连续出现三次的数字。+----+-----+ | Id | Num | +----+-----+ | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 2 | | 5 | 1 | | 6 | 2 | | 7 | 2 | +----+-----+ 例如,给定上面的 Logs 表, 1 ...

weixin_39945178的博客 560

玩转Zabbix智能告警:降噪、排班、认领、升级、IM协同

集成Zabbix告警到FlashDuty,获得告警降噪、智能排班、IM协同等能力

n9ecommunity的博客 1041

SQL进阶 | 自连接

自连接经常和非等值连接结合起来使用。自连接和 GROUP BY 结合使用可以生成递归集合。将自连接看作不同表之间的连接更容易理解。应把表看作行的集合,用面向集合的方法来思考。自连接的性能开销更大,应尽量给用于连接的列建立索引。

仙草不加料的博客 6295

SAP前台处理:业务伙伴维护(客户主数据和供应商主数据)之基础视图 <BP>

这里主要讲解BP业务伙伴主数据中和财务相关的一些内容,包括基础视图数据,采购视图数据,销售视图数据,公司代码视图数据; S4统一了供应商和客户,从事务代码上:不再使用FD01和FK01进行维护,而使用事务代码BP统一维护;

SAP.David.Gao的博客 3460

Calibre PEX提参实战:如何用hcell和xcell文件精准屏蔽模块(附避坑指南)

本文深入解析Calibre PEX工具中hcell与xcell文件的协同工作机制,提供模块级寄生参数提取方案。通过实战案例和避坑指南,帮助工程师精准屏蔽已验证IP模块,提升仿真效率和数据一致性,适用于65nm以下工艺节点的复杂SoC设计。

weixin_29275257的博客 627

SQL查询 — 自连接的用法

《SQL进阶教程》摘录

Jill_J优快云的博客 3725

从Chimera到ChimeraX:科研绘图升级指南,让你的论文配图更专业

本文详细介绍了从UCSF Chimera升级到ChimeraX的科研绘图指南,帮助研究者提升论文配图质量。ChimeraX在渲染引擎、大分子处理能力和动画功能上具有显著优势,特别适合生命科学和结构生物学领域。文章涵盖材质设置、专业配色、工作流程和期刊适配等核心技巧,助力产出出版级分子可视化图像。

weixin_33670786的博客 934

SQL连接查询

SQL查询语句(DQL)

weixin_56680764的博客 2355

6.4 实战项目:基于Agent内核构建Code Review智能体

本文介绍了一个基于Agent内核构建的智能Code Review系统实战项目。系统采用多Agent协作架构,包含代码质量分析、安全漏洞识别、性能优化建议等核心功能模块。文章详细展示了系统架构设计,采用协调器Agent管理多个专业Agent协同工作,并提供了基础Agent框架和协调器Agent的TypeScript实现代码。项目结合了AI Agent核心原理和多Agent协作机制,实现了自动化的代码审查流程,能够生成详细的审查报告,帮助开发者提升代码质量和安全性。

yonggeit的博客 3111

ThingsBoard教程(七):模拟设备遥测

前言 各位读者好,截止目前,ThingsBoard系列文章已经做了六篇,分别是 ThingsBoard教程(一):ThingBoard介绍及安装 ThingsBoard教程(二):租户,租户配置,部件组模块的使用 ThingsBoard教程(三):系统设置模块的使用 ThingsBoard教程(四):规则链简介与操作 ThingsBoard教程(五):客户,资产管理 ThingsBoard教程(六):设备管理 上一篇我们讲解了如何使用设备管理来对设备进行增删改查,和设备配置的一些基本概念,本篇文章就带大

知无涯 4581

【七】【SQL】自连接

数据库中的自连接是一种特殊类型的SQL查询,它允许表与自身进行连接,以便查询表中与其他行相关联的行。自连接通常用于处理那些存储在同一个表中的但彼此之间具有层级或关系的数据。为了实现自连接,通常需要给表使用别名,以便在查询中清楚地区分不同的实例。第一次尝试直接从salgrade表自连接时,出现了错误。这是因为在不使用别名的情况下,MySQL无法区分查询中涉及的两个相同表的实例。通过为salgrade表的每个实例指定别名(如t1和t2。这个查询生成了一个笛卡尔积,展示了salgrade。

m0_74163972的博客 2398

Cadence 开发合集【总目录】

专栏主要介绍Cadence原理图和PCB信号完整性电源完整性仿真相关的内容,更加注重实操,以帮助大家轻松上手并不断提高;在开始专栏的更新前,博主先列出专栏的大纲,以供大家参考。大家直接点击大纲中的蓝色标题即可轻松传送。 ............

fydar的博客 1万+

如何理解SQL中的自连接?

与点击上方SQL数据库开发,关注获取SQL视频教程SQL专栏SQL数据库基础知识汇总SQL数据库高级知识汇总说起自连接,想必小伙伴们都听说过。在进行数据处理时经常会使用到自连接,特别是像...

SQL数据库开发 5440

【AUTOSAR-COM】-10.5-APP CAN Frame/PDU“发送周期不准“的影响因素

一个Tx PDU在COM模块中的数据流; Tx APP CAN Frame/PDU"发送周期不准"的影响因素;

「汽车电子助手」的博客 2386

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SQL必知必会:自连接(深入浅出自连接的原理与实现)

先来看代码: SELECT cust_id,cust_name,cust_contact FROM Customers WHERE cust_name=(SELECT cust_name                  FROM Customers                  WHERE cust_contact="jack") 自连接是很让人困惑不解的! 因为: 结构及其简单,但是逻辑...

天程十八的博客 2万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SQL自连接的逻辑

SQL自连接的逻辑 看了很多SQL自连接教程,案例是学会了,但是到了复杂的场景,依然写不出来,我可能没get自连接的本质。 下面理一下SQL自连接的逻辑 大家认识自连接的第一个例子,大部分应该都是–从一个表取出数学成绩大于语文成绩的同学的名字–类似的例子。这个例子告诉我们,使用表的别名让表与自己连接,也就是假装有A和B,A表里的每个同学都拿出数学成绩,B表里对应的自己拿出语文成绩。实际A和B是同一个表,但是因为使用了别名,调用A时,表格回应你,调用B时,表格也回应你,此时就可以说,我有两个表格。由此类推,我

m0_54388124的博客 400

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

sql 自连接场景

前言 太菜了,太菜了。 场景 一张表tab有2个字段, userId 存储用户id,该字段表示发送消息的用户 receiveId 存储用户id,该字段表示收到消息的用户 我们定义好友关系:互相发送过消息的用户就是好友。问题:找出是好友关系的用户对,也就是找出互相是好友关系的两个用户? 我想了半天,真是难搞,后面查了自连接才知道,原来表可以跟自己join。 select A.userId,A.r...

笔记小屋 910

SQL语句自连接

之前一直不太懂自连接里面的逻辑,不太会应用,遇到也就得过且过了,之后在一场很重要的面试中遇到了,很尴尬。所以遇到什么问题真的要弄懂弄透不断扫盲~ 通过栗子来说明吧。 栗子1: 题目要求是在要求返回员工中,员工的salary大于manager的salary,返回满足这种要求的员工的名字。 后面有managerid,所以这种问题可以使用自连接来解决。 select a.name as employe...

请加油吧 1万+

SQL 之 自连接

自连接:一种虚拟方式。允许多次引用同一各表,该表就像独立的表一样,实际上创建了表的一个虚拟视图,允许多次使用这个虚拟视图。 常用在自身是自引用的表,这类的表的一列指向了同一个表中的另一列。 示例:Personnel表中的每一行都有一个列指向同一个表的另一列,这一列表示该员工的经理是谁(没有经理则用NULL)。就像指向同一个表的行的外键。 EmPloyeeID            

ForestRound的博客 1万+

sql中自连接的使用

一、用SQL自连接查询处理列之间的关系 SQL自身连接,可以解决很多问题。下面举的一个例子,就是使用了SQL自身连接,它解决了列与列之间的逻辑关系问题,准确的讲是列与列之间的层次关系。SQL代码如下: 1 SELECT FIRST.CNumber, SECOND.PCNumber 2 FROM Course FIRST, Course SECOND 3 WHERE FIRST.PCNu

Barry的博客 6324

SQL表自连接用法

一个表与自身进行连接,称为自连接 问题的提出:一个网友提出这样一个SQL题目,说自己想了很久没解决,我一看,这不是很简单吗 可是自己在查询分析器调试了半天原来问题并不是那不简单 有一个学生表,里面有 学号 功课编号 学生成绩三个字段.用一个SQL查询语句得出每门功课成绩最好的前两名 学号 功课编号学生成绩 11...

atg0518的博客 5542

sql自连接

以前只是听说过 表查询的自连接,一直没有用过今天突然看百度知道上一个网友在问一个查询问题 表名:车过站表(passStation)字段 车次 顺次 站点        110    1     上海        110    2     南京         112   1     北京         110    3    浙江         110    4    江苏。。。。。。。。。

rebelboy的专栏 5698

【SQL进阶教程】之自连接

二、自连接 2.1可重排列、排列、组合 笛卡尔积(直积) 排列:元素按顺序排列 组合:无序排列 自连接:连接相同的表 等值连接:使用等号= 非等值连接:使用< >或者<或> #可重排列 select P1.name as name_1,P2.name as name_2 from Products P1,Products P2 #排列(去掉相同元素构成的对,即(苹果,苹果)对 select P1.name as name_1,P2.name as name_2 from Produ

weixin_46336355的博客 2175

SQL进阶(二)自连接

自连接 一、简述 通常SQL 在不同的表间进行连接运算,如内连接、外连接、交叉连接等,但是也可以在相同的表进行自连接运算。 使用场景 可重排列 排列 组合 查重 排序 二、使用场景示例 问题描述: 分别查询出指定表中可重排列、排列、组合的结果 数据表格:product name(商品名称) price(价格) 苹果 50 橘子 100 香蕉 80 统计结果:可重排列 name_1 name_2 苹果 苹果 苹果 橘子 苹果 香蕉 橘子 苹果

qq_38685141的博客 377
上一篇: offset 宏
下一篇: 虚析构函数
inter999
博客等级 码龄19年 18粉丝 9原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值