sql中的group by 和 having 用法解析

來源:互聯網
上載者:User

標籤:

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 用法解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.