分組查詢主要涉及到兩個子句,分別是:group by和having。
● 取得每個工作崗位的工資合計,要求顯示崗位名稱和工資合計
select job, sum(sal) from emp group by job;
如果使用了order by,order by必須放到group by后面
● 按照工作崗位和部門編碼分組,取得的工資合計
1、原始數據
2、分組語句
select job,deptno,sum(sal) from emp group by job,deptno;
mysql> select empno,deptno,avg(sal) from emp group by deptno;
+-------+--------+-------------+
| empno | deptno | avg(sal) |
+-------+--------+-------------+
| 7782 | 10 | 2916.666667 |
| 7369 | 20 | 2175.000000 |
| 7499 | 30 | 1566.666667 |
+-------+--------+-------------+
以上SQL語句在Oracle數據庫中無法執行,執行報錯。
以上SQL語句在Mysql數據庫中可以執行,但是執行結果矛盾。
在SQL語句中若有group by 語句,那么在select語句后面只能跟分組函數+參與分組的字段。
如果想對分組數據再進行過濾需要使用having子句;
取得每個崗位的平均工資大于2000;
select job, avg(sal) from emp group by job having avg(sal) >2000;
分組函數的執行順序:
● 根據條件查詢數據
● 分組
● 采用having過濾,取得正確的數據
一個完整的select語句格式如下:
select 字段
from 表名
where …….
group by ……..
having …….(就是為了過濾分組后的數據而存在的—不可以單獨的出現)
order by ……..
以上語句的執行順序
● 首先執行where語句過濾原始數據
● 執行group by進行分組
● 執行having對分組數據進行操作
● 執行select選出數據
● 執行order by排序
原則:能在where中過濾的數據,盡量在where中過濾,效率較高。having的過濾是專門對分組之后的數據進行過濾的。