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这一步的话,都是在后面一系列的操作上。很不错完成了整个复杂的题解,但确实理解了很久,一直又畏难情绪,想逃避,但现在自己确实已经充分理解了,希望也帮你理解了这一道题!!

相关推荐
咏方舟【长江支流】1 分钟前
【开源】跨语言·跨平台·跨数据库(2) —— 用宝轻量框架设计必读
数据库·架构·开源·ai编程·咏方舟-长江支流·用宝框架
LuminousCPP6 分钟前
C 语言集中实践全记录:顺序表 + 单链表原理实现与通讯录项目实战【附可运行源码】
c语言·开发语言·数据结构·经验分享·笔记
马里马里奥-21 分钟前
大模型应用开发笔记04:LangChain 工具(Tool)与中间件(Middleware)详解
笔记·中间件·langchain
手握风云-23 分钟前
Redis:不只是缓存那么简单(十五)
数据库·redis·缓存
weixin_3077791341 分钟前
Linux下Docker Compose里运行PostgreSQL数据库故障诊断Shell脚本
linux·运维·数据库·docker·postgresql
醉城夜风~1 小时前
MySQL 常用内置函数全解:字符串、数值、日期、流程控制实战教程
数据库·mysql
程序猿秃头之路1 小时前
DDD 系列:实体和值对象详解
数据库·oracle·ddd·领域驱动设计
Database_Cool_1 小时前
阿里云 RDS MySQL vs 腾讯云 CDB 国内云关系型数据库深度对比
数据库·mysql·阿里云
xiaohaiAIgeo1 小时前
【2026年】基于三维建模的实验室智慧管理平台:暖通能源照明的数字孪生方案
大数据·数据库·人工智能·科普知识
乐橙开放平台2 小时前
巡店系统笔记:乐橙 listDeviceDetailsByPage 台账 + bindDeviceLive 辅码流最小闭环
网络·笔记·物联网·自动化·音视频·智能家居