MySQL从删库到跑路(9):group by——给漂亮小姐姐分个组

 上回说到,李有为学会了五个聚合函数,自那以后,谁是这个世界上最漂亮的人,谁是这世界上最高的人,谁是这个世界上最重的人,都逃不过她的火眼金睛,然后大爷的一个问题又让李有为陷入了难题的泥沼当中,在这个花花世界里,拥有沉鱼落雁之容,闭月羞花之貌的漂亮小姐姐究竟有多少人呢?

 这似乎好像是一个需求痛点,中华五千年历史长河里,出了无数的美人,什么四大妖姬妺喜、妲己、褒姒、骊姬,什么四大美人西施、王昭君、貂蝉、杨贵妃什么四大名妓柳如是、苏小小、李师师、陈圆圆,这些美人们的故事与传说在以传遍了神州大地,从春秋战国、秦汉三国,魏晋南北朝,唐宋元明清,青史留名的美女层出不穷,然而在这几千年里,几十个朝代中,似乎从来没有人统计过,每个朝代出过的美女究竟有多少人。

 这种事情如果从史书里面统计,可能会困难重重,但是如果你手头上有一个相关的数据库,那么就相当的简单了,为了形象生动一点,我们先举一个简单的例子。

&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再无其他,再也说让要他一鸣惊人,可是这一鸣惊人从何而来,一时之间李有为陷入了怀疑之中。

预知后事如何,请听下回分解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章