面向集合的思维编写SQL(第九篇 --- “我说的是:苹果柿子李子栗子梨的那个橘子啊”)

浏览: 188

max:屏幕前的同学,这个时候还在天善智能看博文,肯定是单身狗吧...

猿同学:520是什么鬼,我的世界只有1024...


大家好,距离上篇(面向集合的思想编写SQL的第八篇)已经过去N多个月了...

一直想给大家呈现一个体系,然而写了这么多篇,我的状态是时而清楚,时而糊涂...生怕有理说不清啊

image.png

今天先通过一个小案例让大家最直观的感受一下面向集合的思想,再引入两个实例,供大家进一步思考和学习。

案例一:苹果柿子李子栗子梨的那个橘子啊

5.png

现在有如下一张表,一列为水果的名字,一列为水果的价格:

image.png

现在我们想实现rank排名,当然啦,天下没有免费的午餐...早餐和晚餐....MySQL作为不花钱的数据库当然没有rank,花钱的MSSQL和Oracle分分钟实现,还是那句话,不想加钱,就只能技术来凑了...

解决代码如下(这里要注意,李子和栗子价格相同,我们的rank排名能否实现呢?):

image.png

结果如下,我们完美的解决了rank排名问题,李子和栗子并列第二:

image.png

现在我们化繁为简,讲解下思路,先从上面的解决代码中抽离核心代码部分,组内比较:

image.png

运行分析结果如下,

image.png

同一张表,非等值左连接,生成9个集合,进行组内比较及计数,rank排名是不是很容易!

那么这里为什么要用左连接,不用内连接呢,大家可以尝试一下,若是用内连接,排除空集,就没有排名第一的大樱桃啦!


接下来,大家要开动脑筋,用上面的思路来解决下面的两个实例

实例一:手写分组top3

分组函数及搭配其他函数运算,相信大家都会写,但是如果告别函数,仅用最简练的SQL语句,加持面向集合思想的你,脑海中是否已经显现出解决方案了呢?

如下场景,一个表中有三个列,分别代表商品种类,商品名称,商品销售额:

image.png

现在我们想求每类产品销售额Top3的商品信息,如果不使用函数,仅用面向集合的思想,用最简练的SQL解决一下。

解决代码如下(先想一下再看代码):

image.png

结果如下:

image.png

思路一旦打通,化繁为简,用最简单的语句解决最复杂的事情,是不是会很有成就感,思路也宽广了很多呢!

实例二:手写中位数

MySQL与MSSQL并没有中位数函数,而昂贵的Oracle拥有中位数函数median,果然,充钱使你变强啊...

既然不肯加钱,那就只好技术来凑了,手写一个中位数运算呗。

场景如下,现在有一张收入表如下。income列为月收入:

image.png

现在求解income列的中位数,大家要注意,该列一共8行记录(偶数行),中位数为中间两个数据的平均值,解决代码及结果如下:

image.png

那么问题来了,以上的代码,对于行记录为奇数的时候是否同样使用呢?

既然不过节,以上的问题,就好好考虑一下吧...

转移下注意力,不要被狗粮淹没~

推荐 4
本文由 Max_Leo 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

最后一个,若为奇数行,也不影响吧

要回复文章请先登录注册