彙總函式:
count sum max min avg
count返回的結果集中行的數目
sum max min avg顧名思義。但是要注意彙總函式強調的是"結果集中……",強調了
現在進行的操作對象是結果集
注意NULL不參與彙總函式的預算,要想其參加運算那麼要將其轉換為非空的值
分組:
在一個查詢中需要進行多次統計就需要就必須使用分組
where是分組前過濾,過濾的是未經處理資料。這樣就過濾掉了不必要的資料提高了效率
having是分組後過濾,過濾的是統計結果
先要弄明白:分組,分組 什麼才叫一組——前提條件當然是相同的才叫一組
比如:班級同學分兩組,按照性別來分。只有都是男性才會在同一組
老師的筆記說得很清楚:分組函數運算每一組記錄,每一組返回一個結果
比如:select deptno,job,avg(sal) from emp group by deptno,job 把deptno,job相同的(其餘欄位不用多考慮,就以這兩個為關鍵)算作一組
所以最後Oracle返回的是九行資料,即九個結果
注意按照某些欄位分組後,已經是"組"的概念了,個體的特性已經消失了。
按照什麼分組,那麼當然可以從結果集中得到這些欄位!!!比如按照城市分組,就可以得到每一組的城市名。
除了分組欄位以外的欄位,其餘的欄位只可以參與彙總運算(count sum max min avg)——當然,前提是可以使用具體的彙總
函數,比如不可以avg(name),因為那麼根本就不是數字!!!!!!!!!!
再次強調:比如(在這裡我們假設沒有按照comm分組)員工編號是"9527"的comm(提成),但是可以得到平均的comm.
因為現在是以"組"的概念存在的。已經不存在個體了。
核心思想:分組以後個體的概念消失了,是"組"的概念。
比如這裡有學生的 姓名,年紀,性別,身高
按照身高分組——相同的身高在一個組。那麼當然可以select 身高,其餘的只可以用彙總函式了
按照性別分組——相同的性別放在一個組。那麼當然可以select 性別,其餘的只可以用彙總函式了
還有一個很值得注意:要是涉及到彙總,分組的時候order by的欄位也只能是分組裡的欄位!!!!!!!!!!!!!!
只要涉及到彙總函式就要想到分組!!!!!!!!!!!
要是前面出現了彙總函式,且後面沒有涉及到group by 那麼這是最特殊的分組。在select裡任意一個具體欄位都不可以使用。
只可以使用彙總函式
這裡有一堆這兩天敲的實驗資料:
select * from emp
select job,count(*) from emp group by job having count(*)>3
select job "工種" from emp where job='CLERK'--正確的
select job "工種",count(job) "此工種人數" from emp group by job--正確的
select count(*) "此工種人數" from emp where job='CLERK'--正確的
select job "工種",count(*) "此工種人數" from emp where job='CLERK'--錯誤的
select job "工種",sum(comm) from emp group by job--正確的
select job "工種",avg(comm) from emp group by job--正確的
select job "工種",max(comm) from emp group by job--正確的
select job "工種",min(comm) from emp group by job--正確的
select job "工種",sal "工資",sum(comm) from emp group by job--錯誤的
select job "工種",avg(sal) "平均工資",sum(comm) from emp group by job--正確的
select job "工種",max(sal) "最高工資",sum(comm) from emp group by job--正確的
select job "工種",max(mgr) "管理者為",sum(comm) from emp group by job--正確的
select job "工種",sum(mgr) "測試",sum(comm) from emp group by job--正確的
select job "工種",max(ename) "ename最大值",sum(comm) from emp group by job--正確的
select job "工種",count(mgr) "測試",sum(comm) from emp group by job--正確的
select job "工種",count(ename) "測試",sum(comm) from emp group by job--正確的
select job "工種",count(hiredate) "測試",sum(comm) from emp group by job--正確的
--關於分組後的order
select job "工種",max(sal) "最高工資",sum(comm) from emp group by job order by job desc--正確的
select job "工種",max(sal) "最高工資",sum(comm) from emp group by job order by comm desc--錯誤的
select job "工種",max(sal) "最高工資",comm "提成",sum(comm) from emp group by job,comm order by comm desc--正確的
select * from emp
--1clerk null
--2sale 300
--3sale 500
--4man null
--5sale 1400
--6man null
--7man null
--8ana null
--9pre null
--10sal 0
--11clerk null
--12clerk null