sql中的group by 和 having 用法解析

group by 的執行的過程,先執行select 的操做返回一個程序集,而後去執行分組的操做,這時候他將根據group by 後面的字段進行分組,而且將相同的字段並稱一列數據,若是group by 後面沒有這個字段的話就要分紅好多的數據。可是分組就只能將相同的數據分紅兩列數據,而一列中又只能放入一個字段,因此那些沒有進行分組的數據系統不知道將數據放入哪裏,因此就出現此錯誤目前一種分組狀況只有一條記錄,一個數據格是沒法放入多個數值的,因此這裏就須要經過必定的處理將這些多值的列轉化成單值,而後將其放在對應的數據格中,那麼完成這個步驟的就是聚合函數。這就是爲何這些函數叫聚合函數(aggregate functions)了sql


--group by all語法解析:數據庫

--若是使用 ALL 關鍵字,那麼查詢結果將包括由 GROUP BY 子句產生的全部組,即便某些組沒有符合搜索條件的行。oracle

--沒有 ALL 關鍵字,包含 GROUP BY 子句的 SELECT 語句將不顯示沒有符合條件的行的組。框架

select DepartmentID,DepartmentName as '部門名稱',函數

COUNT(*) as '個數' from BasicDepartment group by all  DepartmentID,DepartmentName測試



--group by 和having 解釋:前提必須瞭解sql語言中一種特殊的函數:聚合函數,it

--例如SUM, COUNT, MAX, AVG等。這些函數和其它函數的根本區別就是它們通常做用在多條記錄上。 io

--WHERE關鍵字在使用集合函數時不能使用,因此在集合函數中加上了HAVING來起到測試查詢結果是否符合條件的做用。(having能夠是結果中的字段,亦或別名)table


--舉例子說明:查詢table表查詢每個班級中年齡大於20,性別爲男的人數function

select COUNT(*)as '>20歲人數',classid  from Table1 where sex='男' group by classid,age having age>20 

--須要注意說明:當同時含有where子句、group by 子句 、having子句及彙集函數時,執行順序以下:

--執行where子句查找符合條件的數據;

--使用group by 子句對數據進行分組;對group by 子句造成的組運行彙集函數計算每一組的值;最後用having 子句去掉不符合條件的組。

--having 子句中的每個元素也必須出如今select列表中。有些數據庫例外,如oracle.

--having子句和where子句均可以用來設定限制條件以使查詢結果知足必定的條件限制。

--having子句限制的是組,而不是行。where子句中不能使用匯集函數,而having子句中能夠。




例如:(YII2框架)


$query = YwOrder::find()

            ->select(['employee_id', "FROM_UNIXTIME(distribute_datetime, '%Y-%m-%d') as dis_time", 'employee_realname', 'count(id) as employee_statute'])

            ->leftJoin(YwAuthAssignment::tableName(),YwAuthAssignment::tableName().'.user_id=employee_id')

            ->where([YwAuthAssignment::tableName().'.item_name' => RbacConstant::$role_header])

            ->andWhere("delayed_contact_time>=".StatHeaderCustomerConstant::FIRST_CONTACT_DIFF_TIME)

            ->groupBy(['dis_time', 'employee_id'])

            ->orderBy(['distribute_datetime' => SORT_DESC, 'employee_statute' => SORT_DESC]);

isset($_POST['statute']) && $query->having('employee_statute = $_POST['statute']’);//好比數量爲4的數據

相關文章
相關標籤/搜索