MYSQL练题笔记-子查询-换座位

一、题目相关内容

1)相关的表和题目

2)帮助理解题目的示例,提供返回结果的格式

二、自己初步的理解

没啥思路,我还没做过交换的这种题,所以我觉得这类交换的题以后值得做一个合集,是有点灵活度在里面的,看到很多的题解,但是我这里还是先把基本的做好,我不要走都不会就想着跑。这里老老实实分析两个官方题解。第一下看到官方题解的时候真的是很惊讶,原来可以换id而不是换名字。

三、题解展示和分析

1.利用case和交叉连接的题解

题外话:从最近几次学习题解的过程上,其实我看出来了,很多用到不规范的交叉连接的,如果之前的题我没有去百度交叉连接,知道了他的两种书写方式,我也不知道交叉连接还可以(select * from a,b)这样写的,对于新手来说有点难理解的,这里给出我之前笔记的找到的解释吧,如下图这里其实讲的很清楚了。

第一个官方题解如下:

关键的点是这两个红框里的子查询和case语句,而且他们还是有关联的,case语句的counts字段是第二个子查询建的新表的唯一字段。

1)从第二个子查询建的seat_counts表和seat进行交叉连接开始理解,通过交叉连接这样就达到了每个id和student和counts(seat表的记录数)合并。结果类似于下面的表

2)然后返回去理解case语句就好理解了。三种选择以及相应的结果

①如果id为奇数并且seat表的记录数不等于id,就返回id的下一个。

②如果id为奇数且seat表的记录数等于id,就返回id本身

③其他情况就是id为偶数,返回id的上一个即可。

然后就可以完全理解了。

2.利用位运算和Coalesce函数

第二个题解如下

这个还是要从后往前理解才行,先理解位运算和左连接操作出来的结果,然后你就能理解Coalesce函数呈现出来的效果。

1)理解左连接和on条件后面的位运算

①on条件后面的位运算评论区有个大佬解释的很好,这里放上来,没有他我也理解不了,就是理解二进制换算和异或运算,不理解二进制运算的话百度一下,自己算一下基本就理解了,至于异或运算简单粗暴的理解就是:相同的对象,结果就是 0 ,不相同的对象结果就是 1

((s1.id + 1)^1)-1的作用就是id为奇数的话变成id+1,如果id是偶数的话就变成id-1,因为seat表的记录数是奇数的话,他就会变成id+1,但是整个表是没有id+1这个记录的,所以就不满足((s1.id + 1)^1)-1=s2.id

②而这是左连接(s1和s2进行左连接,就是左边即使有没有满足on后面条件也会输出,但是右边的表和左边的表同一行的就会返回null。),那s1的记录都是保留的,但s2因为不满足on后面的这个条件,那就都返回null。下图我查询两张表的id和student你就可以看出来,左连接给你达到的效果。

2)理解Coalesce函数

在这里用法是,如果第一个参数为空就返回第二个参数,第一个参数不为空就返回第一个参数的值。

联系上面左连接达到的效果,第一个参数就一定是s2的student,因为s2的最后一项为奇数项的时候才会返回null,那为空的时候就返回s1的student,这样就接上了啊!!

其实我Coalesce函数还是有其他的用法的,但是我又用不到,至少目前来说,所以我不加上去了,等再有疑问的时候再说,现在不庸人自扰了,因为我还提不出关于这个函数的问题,目前我只要知道这个函数在这里是怎么使用的就行。

四、总结

综合两个题解,我都认为先理解from后面的,select ??From 问号部分永远是最后理解的,因为到了最外层select这一步的话,都是在后面一系列的操作上。很不错完成了整个复杂的题解,但确实理解了很久,一直又畏难情绪,想逃避,但现在自己确实已经充分理解了,希望也帮你理解了这一道题!!

相关推荐
bug菌¹1 分钟前
滚雪球学Oracle[2.5讲]:数据库初始化配置
数据库·oracle·数据库初始化·初始化配置
一休哥助手9 分钟前
Redis 五种数据类型及底层数据结构详解
数据结构·数据库·redis
这可就有点麻烦了9 分钟前
强化学习笔记之【TD3算法】
linux·笔记·算法·机器学习
翔云12345617 分钟前
MVCC(多版本并发控制)
数据库·mysql
代码敲上天.33 分钟前
数据库语句优化
android·数据库·adb
盒马盒马1 小时前
Redis:zset类型
数据库·redis
静听山水1 小时前
mysql语句执行过程
数据库·mysql
虽千万人 吾往矣1 小时前
golang gorm
开发语言·数据库·后端·tcp/ip·golang
Q_w77422 小时前
一个真实可用的登录界面!
javascript·mysql·php·html5·网站登录
mariokkm2 小时前
Django一分钟:在Django中怎么存储树形结构的数据,DRF校验递归嵌套模型的替代方案
数据库·django·sqlite