where:
資料庫中最常用的是where關鍵字,用于在初始表中篩選查詢。它是一個限制聲明,用于限制資料,在傳回結果集之前起作用。
group by:
對select查詢出來的結果集按照某個字段或者表達式進行分組,獲得一組組的集合,然後從每組中取出一個指定字段或者表達式的值。
having:
用于對where和group by查詢出來的分組經行過濾,查出滿足條件的分組結果。它是一個過濾聲明,是在查詢傳回結果集以後對查詢結果進行的過濾操作。
基本文法:
select 列a,聚合函數 from 表名 where 過濾條件 group by 列a having 過濾條件;
where與having的差別:
1、where一定在group by 之前,having一般在group by 之後;
2、where後的條件表達式裡不允許使用聚合函數,而having可以;
3、having 子句中的每一個元素也必須出現在select清單中(有些資料庫例外,如Oracle)
4、文法順序和執行順序:
①執行where子句查找符合條件的資料,傳回結果集1;
②使用group by 子句對結果集1進行分組;
③對group by 子句形成的組運作聚集函數計算每一組的值,傳回結果集2;
④最後用having 子句去掉不符合條件的組,傳回最終結果集。
即先對select xx from xx的記錄集合用where進行篩選,然後再使用group by 對篩選後的結果進行分組,最後使用having子句對分組後的結果進行篩選。
當加上其他sql語句時,執行順序如下:
select –>where –> group by–> having–>order by
group by 語句中,select中傳回的字段,必須滿足以下兩個條件之一:
①包含在group by語句的後面,作為分組的依據;
②這些字段包含在聚合函數中
相關概念:
聚合函數:聚合函數是SQL語言中一種特殊的函數,例如:
count(*):擷取數量
sum():求和(這裡要注意求和是忽略null值的,null與其他數值相加結果為null,是以可以通過isnull(xxx,0)将null的值賦為0)
avg():求平均數
max():求最大值
min():求最小值
這些函數和其它函數的根本差別就是它們一般作用在多條記錄上。