1.Group By 和 Having, Where ,Order by這些關鍵字是按照如下順序進行執行的:Where, Group By, Having, Order by。
首先where將最原始記錄中不滿足條件的記錄刪除(所以應該在where語句中盡量的將不符合條件的記錄篩選掉,這樣可以減少分組的次數)
然后通過Group By關鍵字后面指定的分組條件將篩選得到的視圖進行分組
接着系統根據Having關鍵字后面指定的篩選條件,將分組視圖后不滿足條件的記錄篩選掉
最后按照Order By語句對視圖進行排序,這樣最終的結果就產生了。
在這四個關鍵字中,只有在Order By語句中才可以使用最終視圖的列名,如:
SELECT FruitName, ProductPlace, Price, ID AS IDE, Discount
FROM T_TEST_FRUITINFO
WHERE (ProductPlace = N'china')
ORDER BY IDE
這里只有在ORDER BY語句中才可以使用IDE,其他條件語句中如果需要引用列名則只能使用ID,而不能使用IDE。
2.需要注意說明:當同時含有where子句、group by 子句 、having子句及聚集函數時,執行順序如下:
執行where子句查找符合條件的數據;
使用group by 子句對數據進行分組;對group by 子句形成的組運行聚集函數計算每一組的值;最后用having 子句去掉不符合條件的組。
having子句和where子句都可以用來設定限制條件以使查詢結果滿足一定的條件限制。
having子句限制的是組,而不是行。where子句中不能使用聚集函數,而having子句中可以。
3.在group by 中用count(*) 獲取條數 ,你會很神奇的發現你獲取的不是總條數,而是每個組的條數,count(*)的結果是分組以后每組中的記錄的條數,而不是分組的數目,但是如果你要獲取總條數的話就會很麻煩,
group by 獲取總記錄數
適用於沒有having的條件情況
select count(distinct(column)) from table #可以用到索引
子查詢
select count(*) from (select dealer_id from card GROUP BY dealer_id)as tmp;
group by 里面的count是指每個分組里面的數量
select count(*) as tmp from table group by ziduan having tmp>2
用ziduan分組,把分組中數量大於2的選出來 having tmp>2
select count(*) as tmp from table group by ziduan order by tmp desc limit 1
用ziduan分組,把分組中數量最大的一組選出來, 用分組里面的個數排序