sql server——分組查詢(方法和思想)

思想sql

先排序在彙總函數

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

 


 

 

使用GROUP BY進行分組查詢spa

 

實例演示3d

 

--查詢男女生的人數code

 

 在沒有學習分組查詢以前,咱們能夠安裝常規的思路解決查詢需求:server

 

select count(*) from student where sex='男'blog

 

select count(*) from student where sex='女'排序

 

那麼如今又要個須要時,查詢每一個班級的總人數io

若是按照常規解決查詢,那麼咱們應該思考的是:

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人的記錄

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

 

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

 

1、那麼就按照咱們學的where來進行篩選

結果如圖:

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

 

 

 

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

結果如圖:

錯誤緣由:緣由是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

相關文章
相關標籤/搜索