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

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

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

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

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

9e273b4ef480771efd24652407726dfb.png

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

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

65894d74a65da1c11ed64d15fef45ba5.png

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

68b37838f11fe006e2bf78b42d8d27b7.png

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

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

68d57056e7d7360f3937ef039b49184a.png

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

8fdd41419fc395c20479e0e4b87654d5.png

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

a7d3a702d28d324dad751dc684b8f885.png

运行分析结果如下,

2ddb4e0b71ba3627c3992fd1463d18ff.png

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

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

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

实例一:手写分组top3

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

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

6b8bf89570acdb8d76a4f5eb58af70c7.png

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

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

131a60f9547beefb3b5ca1db3e7aa01a.png

结果如下:

f5704ae64cfda20415f58c5e659eb8be.png

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

实例二:手写中位数

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

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

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

e2ba4a62f1682fcc74f2a69a439a1ccc.png

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

0e5d1613fd73c4bd45de98be93a0cd80.png

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值