当前位置: 首页 > article >正文

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


http://www.kler.cn/news/163337.html

相关文章:

  • unity 2d 入门 飞翔小鸟 小鸟碰撞 及死亡(九)
  • EOCR-CT电流互感器与SR-CT区别简介
  • 『Linux升级路』进度条小程序
  • vue使用甘特图dhtmlxgantt + gantt.addTaskLayer
  • 基于高通MSM8953平台android9.0的GPIO驱动开发
  • Hbase JAVA API 增删改查操作
  • 【电子取证篇】汽车取证数据提取与汽车取证实例浅析(附标准下载)
  • imazing正在查找最新的apple mobile device组件
  • SpringBoot AOP切面实现对自定义注解的属性动态修改
  • 无重复字符的最长子串(LeetCode 3)
  • 记录一下Mac配置SpringBoot开发环境
  • “华为杯”研究生数学建模竞赛2016年-【华为杯】A题:无人机在抢险救灾中的优化运用(附获奖论文及MATLAB代码实现)
  • perf与火焰图-性能分析工具
  • IntelliJ IDEA使用Eval Reset
  • Unity使用打成图集的Sprite作为模型贴图使用的问题
  • ubuntu server 20.04 备份和恢复 系统 LTS
  • 小红书用户采集工具:掌握策略,轻松吸引潜在客户
  • 【flink番外篇】1、flink的23种常用算子介绍及详细示例(1)- map、flatmap和filter
  • 【链表Linked List】力扣-82 删除链表中的重复元素II
  • velocity-engine-core是什么?Velocity模板引擎的使用
  • pr抖音素材42个手机竖屏抖音视频转场特效PR剪辑模板
  • 浅谈5G基站节能及数字化管理解决方案的设计与应用-安科瑞 蒋静
  • 智慧城市是什么?为什么要建智慧城市?
  • 8_企业架构缓存中间件分布式memcached
  • 云原生系列1
  • 力扣(LeetCode)1038. 从二叉搜索树到更大和树(C++)
  • 卷积之后通道数为什么变了
  • java实现冒泡排序算法
  • 做题笔记:SQL Sever 方式做牛客SQL的题目--SQL156
  • 什么是Nginx反向代理?Nginx反向代理配置指南