1. 程式人生 > >group by 和 having子句

group by 和 having子句

列名 2010年 article 入職 maximum 標準 imu taf 分組查詢

GROUP BY語法可以根據給定數據列的每個成員對查詢結果進行分組統計,最終得到一個分組匯總表。

select子句中的列名必須為分組列或列函數,列函數對於group by子句定義的每個組返回一個結果。

某個員工信息表結構和數據如下:

  id  name  dept  salary  edlevel  	 hiredate 
  1    張三  開發部 2000     3             2009-10-11
  2    李四  開發部 2500 	 3             2009-10-01
  3    王五  設計部 2600     5  	        2010-10-02
  4    王六  設計部 2300     4 	  	2010-10-03
  5    馬七  設計部 2100     4 		2010-10-06
  6    趙八  銷售部 3000     5 		2010-10-05
  7    錢九  銷售部 3100     7 		2010-10-07
  8    孫十  銷售部 3500     7 		2010-10-06 
我想列出每個部門最高薪水的結果,sql語句如下:
select dept , max(salary) AS MAXIMUM  
FROM STAFF  
GROUP BY DEPT  

查詢結果如下:
dept       MAXIMUM
開發部      4500
設計部      2600
銷售部      3500
解釋一下這個結果:
1、 滿足“SELECT子句中的列名必須為分組列或列函數”,因為SELECT有group by中包含的列dept;
2、“列函數對於group by子句定義的每個組各返回一個結果”,根據部門分組,對每個部門返回一個結果,就是每個部門的最高薪水。
將where子句與group by子句一起使用
分組查詢可以在形成組和計算列函數之前具有消除非限定行的標準where子句。必須在group by子句之前指定where子句
例如,查詢公司2010年入職的各個部門每個級別裏的最高薪水
[sql] view plain copy
  1. SELECT dept,edlevel,MAX(salary) AS MAXIMUM
  2. FROM STAFF
  3. WHERE hiredate > ‘2010-01-01‘
  4. GROUP BY dept,edlevel
查詢結果如下:
dept     edlevel     MAXIMUM
設計部      4             2300
設計部      5	       2600
銷售部      5	       3000
銷售部      7 	       3500
在SELECT語句中指定的每個列名也在GROUP BY子句中提到,未在這兩個地方提到的列名將產生錯誤。GROUP BY子句對dept和edlevel的每個唯一組合各返回一行。
GROUP BY子句之後使用Having子句
可應用限定條件進行分組,以便系統僅對滿足條件的組返回結果。因此,在GROUP BY子句後面包含了一個HAVING子句。HAVING類似於WHERE(唯一的差別是WHERE過濾行,HAVING過濾組)AVING支持所有WHERE操作符。
例如,查找雇員數超過2個的部門的最高和最低薪水:
[sql] view plain copy
  1. SELECT dept ,MAX(salary) AS MAXIMUM ,MIN(salary) AS MINIMUM
  2. FROM STAFF
  3. GROUP BY dept
  4. HAVING COUNT(*) > 2
  5. ORDER BY dept
查詢結果如下:
dept     MAXIMUM       MINIMUM
設計部      2600  		2100
銷售部 	3500 		3000
例如,查找雇員平均工資大於3000的部門的最高薪水和最低薪水:
[sql] view plain copy
  1. SELECT dept,MAX(salary) AS MAXIMUM,MIN(salary) AS MINIMUM
  2. FROM STAFF
  3. GROUP BY dept
  4. HAVING AVG(salary) > 3000
  5. ORDER BY dept
查詢結果如下:
dept   	MAXIMUM   MINIMUM
銷售部     	 3500		3000

group by 和 having子句