1. 程式人生 > >Group by 分組查詢 實戰

Group by 分組查詢 實戰

男女 img 通過 ont rom 出現的次數 是我 實現 一起

實戰經歷,由於本人在共享單車上班,我們的單車管理模塊,可以根據單車號查詢單車,但是單車號沒有設置unique(獨一無二約束),說以這就增加了單車號可能重復的風險,但是一般情況下,單車號是不會重復的,因為平臺的單車都是人工錄入的,但是二般情況下,就會出現,一旦出現,那麽就shit了,很不幸,今天就出現了這個問題,“一個單車號,可以在單車管理模塊查出來有兩條記錄”這個時候,我們就必須把出現這種問題的單車號,再次手動編輯改變,由於數據庫裏,單車管理表裏有成千上萬個單車,但是,都有哪一個單車號出現了兩次或者多次(也就是單車號重復出現了)我們是不確定的,基於這個問題,總監說,小李扶著1-500單車號排查,小張扶著500-1000單車號排查....我想說一句:shit!

於是我寫了一個分組查詢,“根據單車號分組差單車出現的次數和單車號,把單車出線次數大於1的,都having篩選出來,這樣這個問題就ok解決了”

//這是sql分組查詢代碼:
select PlateNumber ,count(PlateNumber) as bikeCounts from Bicycles group by PlateNumber having count(PlateNumber)>1 

技術分享

這是效果圖

由於很久沒有寫sql語句了,這些日子都是net core +ng.1.x ORM不帶寫sql的,感覺sql知識越來越淡薄,故,總結分享一下!

傳授一下思想:

先排序在匯總

sql server裏分組查詢通常用於配合聚合函數,達到分類匯總統計的信息。而其分類匯總的本質實際上就是先將信息排序,排序後相同類別的信息會聚在一起,然後通過需求進行統計計算。


使用GROUP BY進行分組查詢

實例演示

--查詢男女生的人數

在沒有學習分組查詢之前,我們可以安裝常規的思路解決查詢需求:

select count(*) from student where sex=‘男‘

select count(*) from student where sex=‘女‘

那麽現在又要個需要時,查詢每個班級的總人數

如果按照常規解決查詢,那麽我們應該思考的是:

1.每個班級,我們並不知道在表裏有哪些班級,那麽我們where 後的條件如何寫?

2.如果該表裏有1000個班級,那麽我難道要寫一千條where查詢語句?

面對這樣的問題 sql server為我們準備了Group by 關鍵字實現分組查詢

在使用介紹Group by關鍵字之前,我們先來看看系統實現分組查詢的原理和邏輯:

技術分享

映射成SQL語句:

select sex ,count(*)  as 人數  from student group by sex

這個簡短的語句,經過上圖的原理,應該要知道,第一步是先from查詢表的所有信息,然後group by根據字段進行分組後在統計匯總

上面的案例是通過Count()函數進行統計,當然分組匯總還可以使用其他的聚合函數進行匯總。

使用GROUP BY 語句註意事項一:

技術分享

圖中使用查詢語句,包含一個字段和一個聚合函數為什麽會報錯呢?

原因,我們把兩個字段分開來查詢:

技術分享

總結:為了保證完整性,系統約定俗成,在使用了聚合函數的查詢語句中,除了聚合函數,可以在查詢列表上,要出現其他字段,那麽該字段就必須為分組字段,而且該字段一定要跟隨在GROUP BY關鍵字後面。

    與聚合函數一起出現在select後面進行查詢的列,只有兩種可能性:被聚合 、被分組


多列分組查詢

--實例需求,查詢每一個班級,男女生的人數

分析:顯然需求是兩組,每一個班需要劃分組,男女也需要分組

實現圖解:

技術分享

SQL語句:

select  GradeId,sex,COUNT(*)  from student group by GradeId,Sex order by GradeId

經驗:搞清楚需要分幾組,搞清楚分組的順序,一輪一輪的分,系統是等分組之後才會進行匯總信息


使用HAVING子句

演示示例:--查詢每一個班級男女生的人數,同時只需要顯示人數數量超過3人的記錄

分析:此查詢顯然是對上一個示例的多列分組進行篩選。

試在這學的知識範圍內來解決此查詢需求。。。。

一、那麽就按照我們學的where來進行篩選

結果如圖:

技術分享

這個錯誤告訴了我們:where裏面不能出現聚合函數作為條件,失敗!

二、既然不能使用聚合函數,那就給聚合函數取一個別名,讓它當做一個列

結果如圖:

技術分享

錯誤原因:原因是where是對源數據進行篩選的,也就是對from 後面的表進行篩選,既然是源數據,那麽where去源數據表裏找一個別名字段,怎麽可能會有!所以才會報錯

讓我們來探討一下,這裏為什麽不能使用where

1.需求是對分組之後的數據集進行篩選,where只針對數據表原始數據篩選

2.where關鍵字顯然只能出現一次,而且根據查詢的順序,是先執行where條件篩選後得到的結果集,在進行的group by分組

解決辦法,使用HAVING關鍵字:

HAVING核心:是對分組統計之後的結果集,進行數據的篩選

SQL語句:

select  GradeId,sex,COUNT(*)  as renshu from student  group by GradeId,Sex  having count(*)>=3 order by GradeId

where和having的不同:where是對原始數據進行篩選,having是對分組時候的數據進行篩選


查詢語句的執行順序

在這裏引出查詢機制裏對查詢語句裏的關鍵字的執行順序

查詢關鍵字家族成員

select  top/distinct 字段列表 from 表列表 where 篩選條件 group by 分組字段列表 having  對分組之後得到的結果集篩選  order by 排序字段列表

執行順序:

1.from

2.where

3.group by

4.having

5.根據select 關鍵之後的要顯示的字段,進行結果集顯示

6.order by 對最終結果集進行排序

7.top/dictinct

覺得不錯可以推薦一下哦!

Group by 分組查詢 實戰