SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用

Wesley13
• 阅读 687

大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子

今天给大家,带来的是 SELF JOIN的应用

下面是,表结构和,INSERT 语句脚本。

 create table t0718 (

SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用

在如上的数据中,对val1 进行查询,如果查到了,如输入值为2 ,

那就返回,从下一行开始的三行数据,返回结果如下

SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用

类似这种,找出特定的值开始查出几行数据问题,都需要一个连续的不间断的一列,

或者如果没有的话,需要人为的制造出这样的一个列,这里为了简单,

把制作序列的事情去掉了,直接给出,如果不会的话,

可以参照 《SQL优化大神带你写有趣的SQL(5) 自定义变量的应用(1)》文章。

现在开始,进行分析,如果想得到上图的所示的结果

第一,查出满足条件的行,所在的唯一值,如pk,unique key ,这里是idx

第二,拿着idx 查出大于idx 小于 等于idx+3的值,返回结果!

根据上面的思路写SQL

SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用

第二步:拿着idx 查出大于idx 小于 等于idx+3的值,返回结果!

这里因为返回的是一个表的内容,所以推荐大家使用半连接

SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用

上面的SQL 理解起来,比较难!

在这里解释一下,exists 里面t1表的结果集其实就是两个值,1,6

那么每一个t表中idx(idx 值为1到10)比1大且小于等于4或者比6大且小于等于9的数

就是如图所示的内容!

一个SQL 有好几种解决方法,也可以写成如下

SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用

在这两个当中,让我选的话,如果我是初学者 我会选择第一个,因为他可以无视JOIN之后的

结果重复性,具有通用性。但是如果我是中级以上的MySQL DBA我会选第二个,因为我可以

熟练的掌握SQL,根据业务我会保证不会有重复值,因为这样更有利于性能优化,这里涉及

一些执行计划的分析,还有MySQL 特性问题,不再本系列讨论范围。

至于下面的SQL

SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用

虽然看似,也能得出正确的结果,但纯粹是为了得到结果而写的没有通用性,所以只是作为

一个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开发与优化

就可以看到相关视频

SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用

叶老师的「MySQL核心优化」大课已升级到MySQL 8.0,扫码开启MySQL 8.0修行之旅吧

SQL优化大神带你写有趣的SQL(6) SELF JOIN的应用

本文分享自微信公众号 - 老叶茶馆(iMySQL_WX)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
MySQL中快速找出无显式主键的表
大家好,我是知数堂SQL优化班老师网名:骑龟的兔子版本 :Serverversion:8.0.22MySQLCommunityServerGPL目标:想要查找没有显示主键的表第一步:查询所有用户表SELECT第二步 : 查找所有包含显示主键的表第三
Wesley13 Wesley13
3年前
MySQL 8.0.22 Bug #101504 对应解决思路
大家好,我是知数堂SQL优化班老师网名:骑龟的兔子版本 :Serverversion:8.0.22MySQLCommunityServerGPL由于种种原因,需要把视图合并功能关掉,但是就碰到了,如下问题。如果不关掉下面的问题就不会碰到。setsessionoptimizer_switch'der
Wesley13 Wesley13
3年前
MySQL中怎样快速找出超长索引
大家好,我是知数堂SQL优化班老师网名:骑龟的兔子!(https://oscimg.oschina.net/oscnet/137ab31aa2524650a455c5d59fc79144.jpg)需求:想要查找哪些索引太长了,这个SQL在5.7下跑的特别慢,8.0则挺快的,帮看下有啥优化方案没具体SQL和执行计划如下
Wesley13 Wesley13
3年前
MySQL SQL优化的正确姿势
大家好,我是知数堂SQL优化班老师网名:骑龟的兔子已经很久没写文章了今天分享一篇优化SQL案例slowquery里有如下SQL!(https://oscimg.oschina.net/oscnet/13cd74b3a9964735a8f4c848395d8b5f.png)看下执行计
Wesley13 Wesley13
3年前
MySQL 5.7查询sys.schema_redundant_indexes居然慢如蜗牛...
大家好,我是知数堂SQL优化班老师网名:骑龟的兔子作为DBA经常使用SYS视图,但是如下情况。查询mysql自己创建好的sys系统视图,超过70秒还没结果,超时了。一般情况下,不会出现问题,但是,如本案例,表很多的时候就会出现问题selectcount()frominformation_