SQL自连接的逻辑

本文探讨了SQL自连接的逻辑,通过实例解释了如何理解和运用自连接。内容涉及自连接在解决从Craiglockhart到Sighthill的公交路线问题中的应用,以及在没有完全掌握自连接时的替代解决方案。文章强调了自连接在处理需要在同一表中进行多次比较的复杂查询时的重要性。
摘要由CSDN通过智能技术生成

看了很多SQL自连接教程,案例是学会了,但是到了复杂的场景,依然写不出来,我可能没很好地理解自连接的本质。
下面理一下SQL自连接的逻辑
大家认识自连接,大部分应该都是–从一个表取出数学成绩大于语文成绩的同学的名字–类似的例子。这个例子告诉我们,使用表的别名让表与自己连接,也就是假装有A和B,A表里的每个同学都拿出数学成绩,B表里对应的自己拿出语文成绩。实际A和B是同一个表,但是因为使用了别名,调用A时,表格回应你,调用B时,表格也回应你,此时就可以说,我有两个表格。由此类推,我可以给同一个表起很多别名,也就是说,我可以让C表里的同学对应拿出自己的英语成绩,找出数学成绩大于语文和英语的同学。
进一步思考,什么时候用自连接呢?从表里找出数学成绩最好的同学,好像用不到。从表里找出比张三数学成绩更好的同学,好像要用到,想一想,先找出张三的成绩,再找出数学成绩大于这个数字的同学,这是一个子查询啊!用自连接硬写:
select A.name from A left join B on A.id=B.id where B.name=‘张三’ and A.mathscore>B.mathscore
这是错误的!
表连接A和B,B被某个条件筛选后,A也被B的结果筛选了。我对自连接感觉疑惑的地方来源于和表连接的剥离。在比较自己的数学和语文成绩这个例子中,A.mathscore>B.englishscore,筛选出数学成绩结果是所有有数学成绩的同学,这些同学再拿出英语成绩。表面是自己与自己比较,暗地里进行了两张表同步的id筛选。

下面举个例子
https://sqlzoo.net/wiki/Self_join/zh第10题
有两个表:
stops(id, name)
站(編號,名稱)
route(num,company,pos, stop)
路線(號碼,巴士公司名,方向,站)

Find the routes involving two buses that can go from Craiglockhart to Sighthill.
Show the bus no. and company for the first bus, the name of the stop for the transfer,
and the bus no. and company for the second

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值