max:屏幕前的同学,这个时候还在天善智能看博文,肯定是单身狗吧...
猿同学:520是什么鬼,我的世界只有1024...
大家好,距离上篇(面向集合的思想编写SQL的第八篇)已经过去N多个月了...
一直想给大家呈现一个体系,然而写了这么多篇,我的状态是时而清楚,时而糊涂...生怕有理说不清啊
今天先通过一个小案例让大家最直观的感受一下面向集合的思想,再引入两个实例,供大家进一步思考和学习。
案例一:苹果柿子李子栗子梨的那个橘子啊
现在有如下一张表,一列为水果的名字,一列为水果的价格:
现在我们想实现rank排名,当然啦,天下没有免费的午餐...早餐和晚餐....MySQL作为不花钱的数据库当然没有rank,花钱的MSSQL和Oracle分分钟实现,还是那句话,不想加钱,就只能技术来凑了...
解决代码如下(这里要注意,李子和栗子价格相同,我们的rank排名能否实现呢?):
结果如下,我们完美的解决了rank排名问题,李子和栗子并列第二:
现在我们化繁为简,讲解下思路,先从上面的解决代码中抽离核心代码部分,组内比较:
运行分析结果如下,
同一张表,非等值左连接,生成9个集合,进行组内比较及计数,rank排名是不是很容易!
那么这里为什么要用左连接,不用内连接呢,大家可以尝试一下,若是用内连接,排除空集,就没有排名第一的大樱桃啦!
接下来,大家要开动脑筋,用上面的思路来解决下面的两个实例
实例一:手写分组top3
分组函数及搭配其他函数运算,相信大家都会写,但是如果告别函数,仅用最简练的SQL语句,加持面向集合思想的你,脑海中是否已经显现出解决方案了呢?
如下场景,一个表中有三个列,分别代表商品种类,商品名称,商品销售额:
现在我们想求每类产品销售额Top3的商品信息,如果不使用函数,仅用面向集合的思想,用最简练的SQL解决一下。
解决代码如下(先想一下再看代码):
结果如下:
思路一旦打通,化繁为简,用最简单的语句解决最复杂的事情,是不是会很有成就感,思路也宽广了很多呢!
实例二:手写中位数
MySQL与MSSQL并没有中位数函数,而昂贵的Oracle拥有中位数函数median,果然,充钱使你变强啊...
既然不肯加钱,那就只好技术来凑了,手写一个中位数运算呗。
场景如下,现在有一张收入表如下。income列为月收入:
现在求解income列的中位数,大家要注意,该列一共8行记录(偶数行),中位数为中间两个数据的平均值,解决代码及结果如下:
那么问题来了,以上的代码,对于行记录为奇数的时候是否同样使用呢?
既然不过节,以上的问题,就好好考虑一下吧...
转移下注意力,不要被狗粮淹没~