group by的使用說明

group by的使用說明

SQL HAVING 出現的原因

  在 SQL 中增加 HAVING 子句原因是,WHERE 關鍵字無法與合計函數一起使用。

SQL HAVING 語法

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
SQL HAVING 實例

我們擁有下面這個 “Orders” 表:

O_Id OrderDate OrderPrice Customer
1 2008/12/29 1000 Bush
2 2008/11/23 1600 Carter
3 2008/10/05 700 Bush
4 2008/09/28 300 Bush
5 2008/08/06 2000 Adams
6 2008/07/21 100 Carter
現在,我們希望查找訂單總金額少於 2000 的客戶。

我們使用如下 SQL 語句:

SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
結果集類似:

Customer SUM(OrderPrice)
Carter 1700
現在我們希望查找客戶 “Bush” 或 “Adams” 擁有超過 1500 的訂單總金額。

我們在 SQL 語句中增加了一個普通的 WHERE 子句:

SELECT Customer,SUM(OrderPrice) FROM Orders
WHERE Customer=’Bush’ OR Customer=’Adams’
GROUP BY Customer
HAVING SUM(OrderPrice)>1500
結果集:

Customer SUM(OrderPrice)
Bush 2000
Adams 2000

  在select 語句中可以使用group by 子句將行劃分成較小的組,然後,使用聚組函數返回每一個組的彙總信息,另外,可以使用having子句限制返回的結果集。group by 子句可以將查詢結果分組,並返回行的彙總信息Oracle 按照group by 子句中指定的表達式的值分組查詢結果。

  在帶有group by 子句的查詢語句中,在select 列表中指定的列要麼是group by 子句中指定的列,要麼包含聚組函數

select max(sal),job emp group by job;
//(注意max(sal), job 的job並非一定要出現,但有意義 )
  查詢語句的select 和group by ,having 子句是聚組函數唯一出現的地方,在where 子句中不能使用聚組函數。

select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;
  當在gropu by 子句中使用having 子句時,查詢結果中只返回滿足having條件的組。在一個sql語句中可以有where子句和having子句。having 與where 子句類似,均用於設置限定條件。

  where 子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行。
  having 子句的作用是篩選滿足條件的組,即在分組之後過濾數據,條件中經常包含聚組函數,使用having 條件顯示特定的組,也可以使用多個分組標準進行分組。

  查詢每個部門的每種職位的僱員數

select deptno,job,count(*) from emp group by deptno,job;

  如果你對何時應該使用WHERE,何時使用HAVING仍舊很迷惑,請遵照下面的說明:

  WHERE語句在GROUP BY語句之前;SQL會在分組之前計算WHERE語句。

  HAVING語句在GROUP BY語句之後;SQL會在分組之後計算HAVING語句。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章