大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子
今天给大家,带来的是 SELF JOIN的应用
下面是,表结构和,INSERT 语句脚本。
create table t0718 (
在如上的数据中,对val1 进行查询,如果查到了,如输入值为2 ,
那就返回,从下一行开始的三行数据,返回结果如下
类似这种,找出特定的值开始查出几行数据问题,都需要一个连续的不间断的一列,
或者如果没有的话,需要人为的制造出这样的一个列,这里为了简单,
把制作序列的事情去掉了,直接给出,如果不会的话,
可以参照 《SQL优化大神带你写有趣的SQL(5) 自定义变量的应用(1)》文章。
现在开始,进行分析,如果想得到上图的所示的结果
第一,查出满足条件的行,所在的唯一值,如pk,unique key ,这里是idx
第二,拿着idx 查出大于idx 小于 等于idx+3的值,返回结果!
根据上面的思路写SQL
第二步:拿着idx 查出大于idx 小于 等于idx+3的值,返回结果!
这里因为返回的是一个表的内容,所以推荐大家使用半连接
上面的SQL 理解起来,比较难!
在这里解释一下,exists 里面t1表的结果集其实就是两个值,1,6
那么每一个t表中idx(idx 值为1到10)比1大且小于等于4或者比6大且小于等于9的数
就是如图所示的内容!
一个SQL 有好几种解决方法,也可以写成如下
在这两个当中,让我选的话,如果我是初学者 我会选择第一个,因为他可以无视JOIN之后的
结果重复性,具有通用性。但是如果我是中级以上的MySQL DBA我会选第二个,因为我可以
熟练的掌握SQL,根据业务我会保证不会有重复值,因为这样更有利于性能优化,这里涉及
一些执行计划的分析,还有MySQL 特性问题,不再本系列讨论范围。
至于下面的SQL
虽然看似,也能得出正确的结果,但纯粹是为了得到结果而写的没有通用性,所以只是作为
一个SQL多样性,进行参考,没有讨论必要性。
谢谢大家~ 欢迎转发
我是知数堂SQL 优化班老师~ ^^
如有关于SQL优化方面疑问和一起交流的请加 并且 @兔子@知数堂SQL优化
高性能MySQL,SQL优化群 有叶金荣,吴炳锡 两位大神坐镇 :579036588
欢迎加入 知数堂大家庭。
从这期,开始还准备了,视频,视频地址在今日头条,
https://www.ixigua.com/i6716134286379975176/
往期文章
1.比较有意思的SQL(1)
https://www.toutiao.com/i6707064970636427789/
2.有趣的SQL(2):两个表没连接条件的JOIN
https://www.toutiao.com/i6708876385844199940/
3.有意思的SQL(3) 行转列,列转行和复制
https://www.toutiao.com/i6711483799634444808/
4.有趣的SQL(4) 行转列的复杂应用和优化思想
https://www.toutiao.com/i6712576799496208899/
5.SQL优化大神带你写有趣的SQL(5) 自定义变量的应用(1)
https://www.toutiao.com/i6713758942863819268/
大家关注下 头条号 :SQL开发与优化
就可以看到相关视频
叶老师的「MySQL核心优化」大课已升级到MySQL 8.0,扫码开启MySQL 8.0修行之旅吧
本文分享自微信公众号 - 老叶茶馆(iMySQL_WX)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。