標籤:
group by 的執行的過程,先執行select 的操作返回一個程式集,然後去執行分組的操作,這時候他將根據group by 後面的欄位進行分組,並且將相同的欄位並稱一列資料,如果group by 後面沒有這個欄位的話就要分成好多的資料。但是分組就只能將相同的資料分成兩列資料,而一列中又只能放入一個欄位,所以那些沒有進行分組的資料系統不知道將資料放入哪裡,所以就出現此錯誤目前一種分組情況只有一條記錄,一個資料格是無法放入多個數值的,所以這裡就需要通過一定的處理將這些多值的列轉化成單值,然後將其放在對應的資料格中,那麼完成這個步驟的就是彙總函式。這就是為什麼這些函數叫彙總函式(aggregate functions)了
--group by all文法解析:
--如果使用 ALL 關鍵字,那麼查詢結果將包括由 GROUP BY 子句產生的所有組,即使某些組沒有符合搜尋條件的行。
--沒有 ALL 關鍵字,包含 GROUP BY 子句的 SELECT 語句將不顯示沒有合格行的組。
select DepartmentID,DepartmentName as ‘部門名稱‘,
COUNT(*) as ‘個數‘ from BasicDepartment group by all DepartmentID,DepartmentName
--group by 和having 解釋:前提必須瞭解sql語言中一種特殊的函數:彙總函式,
--例如SUM, COUNT, MAX, AVG等。這些函數和其它函數的根本區別就是它們一般作用在多條記錄上。
--WHERE關鍵字在使用集合函數時不能使用,所以在集合函數中加上了HAVING來起到測試查詢結果是否合格作用。(having可以是結果中的欄位,亦或別名)
--舉例子說明:查詢table表查詢每一個班級中年齡大於20,性別為男的人數
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的資料
sql中的group by 和 having 用法解析