上回说到,李有为学会了五个聚合函数,自那以后,谁是这个世界上最漂亮的人,谁是这世界上最高的人,谁是这个世界上最重的人,都逃不过她的火眼金睛,然后大爷的一个问题又让李有为陷入了难题的泥沼当中,在这个花花世界里,拥有沉鱼落雁之容,闭月羞花之貌的漂亮小姐姐究竟有多少人呢?
这似乎好像是一个需求痛点,中华五千年历史长河里,出了无数的美人,什么四大妖姬妺喜、妲己、褒姒、骊姬,什么四大美人西施、王昭君、貂蝉、杨贵妃什么四大名妓柳如是、苏小小、李师师、陈圆圆,这些美人们的故事与传说在以传遍了神州大地,从春秋战国、秦汉三国,魏晋南北朝,唐宋元明清,青史留名的美女层出不穷,然而在这几千年里,几十个朝代中,似乎从来没有人统计过,每个朝代出过的美女究竟有多少人。
这种事情如果从史书里面统计,可能会困难重重,但是如果你手头上有一个相关的数据库,那么就相当的简单了,为了形象生动一点,我们先举一个简单的例子。
&ermsp;
上面这个图里的表格记录了14个美女以及她们所处年代,如果要统计每个年代的美女数量,那么我们应该怎样做?
1、首先是不是应该按照每个美女的所处年代给她们分个组?
2、然后是不是应该在统计各个分组里面有多少个人?
3、最后是不是就可以得出结果就是了?
如果把上面的逻辑翻译成SQL语句,那么就如下面的代码块
SELECT
所处年代,
COUNT (1)
FROM
beautiful
GROUP BY
所处年代
这里 group by 所处年代,就表示按照所处年代分组,然后统计每个输出年代的人数
group by 注意事项
1、group by 可以包含许多列,也就是可以多分组进行嵌套,进行更细致的分组。
2、group by 将在最后制定的分组进行聚合
比如说 元明月、苏小小、冯小怜、张丽华是个人虽然都是南北朝的人,但是元明月和冯小怜是北朝时期的人,苏小小和张丽华是南朝时期的人。如果在细分的话,元明月是北魏时期,冯小怜是北齐时期人,苏小小是南齐时期人,张丽华则是南陈时期人。
3、group by 必须出现在where之后,order by之前
如果没有筛选条件,那么就表示对表中所有的数据进行group by分组,如果有where条件,就表示对满足筛选条件的结果进行分组。然后在进行排序
现在,我们有一个需求,我想要统计一下,颜值达到255巅峰的小姐姐,按照年龄(age)和情感状态(is_single)分组的人数分布情况,对最终的结果按照情感状态和人数排序,学完了上面的知识点后,这个需求可谓是信手拈来。
SELECT
age,is_single,
count( 1 ) AS num
FROM
human_base_info
WHERE
sex = 'F' AND looks = '255'
GROUP BY
age,is_single
ORDER BY
is_single,
count( 1 ) DESC
HAVING(过滤分组)
上面李有为统计了按照年龄和情感状态分组的、颜值高达255的小姐姐的人数分布情况,但是有打惯了光棍儿的李有为就是不管“1”这个数字,他想要把它给过滤掉,但这个时候where似乎并不起作用了,于是乎where只好看着having大显身手。
having的作用其实就是分组聚合完成之后,过滤分组李有为不喜欢单着、不喜欢“1”,那么他只需要在group by分组之后,加上一句 having count(1)>1即可
SELECT
age,is_single,
count( 1 ) AS num
FROM
human_base_info
WHERE
sex = 'F'
AND looks = '255'
GROUP BY
age,is_single
HAVING
COUNT( 1 ) >= 3
ORDER BY
is_single,
count( 1 ) DESC
where和having的区别
从普遍意义上来讲, WHERE的过滤条件都可以用 HAVING 来替代。唯一的差别是, WHERE过滤行,而 HAVING 过滤分组
听完大爷的话,李有为有点飘了,他觉得非单身的漂亮小姐姐已经不值得他关心了,于是乎他想要看一看单身小姐姐的年龄分布情况,他可以把筛选条件放在where里,也可以把筛选条件放在having里,两种写法查询结果都一样
SELECT
age,is_single,
count( 1 ) AS num
FROM
human_base_info
WHERE
sex = 'F'
AND looks = '255'
GROUP BY
age,is_single
HAVING
is_single = 'N' AND COUNT( 1 ) >1
ORDER BY
is_single,
count( 1 ) DESC
--------------
SELECT
age,is_single,
count( 1 ) AS num
FROM
human_base_info
WHERE
sex = 'F'
AND looks = '255'
AND is_single = 'N'
GROUP BY
age,is_single
HAVING
COUNT( 1 ) >1
ORDER BY
is_single,
count( 1 ) DESC
颜值举世无双、芳龄一十八的单身小姐姐竟然高达5人,一想到这里,李有为就忍不住吟诗一首。
十八新娘八十郎,苍苍白发对红妆。
大爷随即和而歌
鸳鸯被里成双夜,一树梨花压海棠。
朗诵完毕,两人对视了一眼,随后相视一笑,生命中沉睡的东西,渐渐苏醒。
嘿嘿嘿嘿嘿嘿嘿……
短短几日,李有为的SQL进步神勇,可是他无法把SQL水平的提高和装逼联系起来,后天就是装逼检验大会,相比于前一周,他除了会点SQL再无其他,再也说让要他一鸣惊人,可是这一鸣惊人从何而来,一时之间李有为陷入了怀疑之中。
预知后事如何,请听下回分解。