在sql語句中分組是很重要的一部分,在很多地方都用的着,他經常與聚合函數一起使用
聚合函數:
count:計算個數
select count (計算的字段名)from 表名
select count (ifnull(字段名,替換值))from 表名
select count(*) from 表名 ;隻要一列中有一個值非空,就會計算
- max:計算最大值
- min:計算最小值
- sum:計算和
- avg:計算平均值
用到分組的例子:
查詢公司中每個部門的人數
select count(*) from 表名 group by 部門編号
having 和Wehre 子句
當然在分組時和分組後有一些條件限制,這就用到了 having 和Wehre 子句
-
having是分組(group by)後的篩選條件,分組後的資料組内再篩選
where則是在分組前篩選
-
where子句中不能使用聚集函數,而having子句中可以,是以在集合函數中加上了HAVING來起到測試查詢結果是否符合條件的作用。
即having子句的适用場景是可以使用聚合函數
- having 子句限制的是組,而不是行
- having 子句中的每一個元素也必須出現在select清單中。有些資料庫例外,如oracle
當同時含有 where 子句、group by 子句 、having 子句及聚集函數時,執行順序如下:
- 執行where子句查找符合條件的資料;
- 使用group by 子句對資料進行分組;
- 對group by 子句形成的組運作聚集函數計算每一組的值;
- 最後用having 子句去掉不符合條件的組
例如 1:
查詢公司中相同年齡的人數,輸出年齡和對應人數,少于2個人的忽略
select
age,
count(*) num--用于計算一個年齡的人數,并重命名為num
from
表名
group by age --與年齡進行分組
having num>=2
having num>=2 --篩選同一年齡少于2人的組,值的一提的是這裡隻能用having 不能用where, 因為 num是count(*)的 重命名 ,然而在where語句中不用用聚合函數
例子 2:
查詢工齡大于5年的員工的年齡分布情況(查詢公司中相同年齡的人數,輸出年齡和對應人數,少于2個人的忽略)
select
age,
count(*) num --用于計算一個年齡的人數,并重命名為num
from
表名
where
工齡>5 先篩選出工齡大于5的員工,然後在進行分組
group by age
having num>=2
執行順序:where -> group by -> having