group by 和 having子句
阿新 • • 發佈:2017-09-04
列名 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
- SELECT dept,edlevel,MAX(salary) AS MAXIMUM
- FROM STAFF
- WHERE hiredate > ‘2010-01-01‘
- 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
- SELECT dept ,MAX(salary) AS MAXIMUM ,MIN(salary) AS MINIMUM
- FROM STAFF
- GROUP BY dept
- HAVING COUNT(*) > 2
- ORDER BY dept
查詢結果如下:
dept MAXIMUM MINIMUM
設計部 2600 2100 銷售部 3500 3000
例如,查找雇員平均工資大於3000的部門的最高薪水和最低薪水:[sql] view plain copy
- SELECT dept,MAX(salary) AS MAXIMUM,MIN(salary) AS MINIMUM
- FROM STAFF
- GROUP BY dept
- HAVING AVG(salary) > 3000
- ORDER BY dept
查詢結果如下:
dept MAXIMUM MINIMUM
銷售部 3500 3000
group by 和 having子句