天天看點

group by語句中的having和where子句

在sql語句中分組是很重要的一部分,在很多地方都用的着,他經常與聚合函數一起使用

聚合函數:

  1. count:計算個數

    select count (計算的字段名)from 表名

    select count (ifnull(字段名,替換值))from 表名

    select count(*) from 表名 ;隻要一列中有一個值非空,就會計算

  2. max:計算最大值
  3. min:計算最小值
  4. sum:計算和
  5. 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