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再無其他,再也說讓要他一鳴驚人,可是這一鳴驚人從何而來,一時之間李有爲陷入了懷疑之中。

預知後事如何,請聽下回分解。

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