1組函數 avg(),sum(),max(),min(),count()案例:
selectavg(sal),sum(sal),max(sal),min(sal),count(sal)
from emp
/
截圖:
2
組函數和null在一起
案例:求員工的平均獎金
錯誤sql:
select avg(comm)
方式1,sum(comm)/count(comm)方式2,sum(comm)/count(*)
方式3
from emp;
錯誤原因:
select count(comm),count(*) from emp;
分析:
--組函數自動濾空,組函數忽略空值
--修正函數的濾空
select count(nvl(comm,0)),count(*) fromemp;
3.分組資料
a
求各個部門的平均工資
思路:需要把各個部門的資料劃分….10部門
20部門 30部門….分組……
select deptno,avg(sal)
group by deptno;
運作結果:
b
組函數設計的本意
(1)、select檢索的列
必須要位于group by後面的集合列中
(2)、組函數設計的本意:必須要在分組資料之上,進行結果集的檢索….
注意:group by子句要求:所有在select中出現的列,都必須在出現group
by分組子句中。
select a, b, c
group by a, b, c,d;
這種格式是對的,因為在select後的a、b、c都在groub
by後面。
select a, b, f
from emp
group by a, b, c,d;
這種格式是錯的,因為在select後的f不在group中
4
在group by子句中包含多個列
--按部門
不同的職位
統計平均工資
--先按照部門分組,在按照job分組,如果deptno和job一樣,就是同一組,然後求平均工資。
--求各個部門的,每一個工種的平均工資
select deptno,job,avg(sal),count(deptno)
group by deptno,job
order by 1;
5
分組過濾
--查詢各個部門的平均工資
--進一步,查詢平均工資大于2000的部門
group by deptno
having avg(sal) > 2000;
6 having和where子句差別
求10号部門的平均工資
方法1:先分組,在過濾
having deptno=10;
方法2:先過濾再分組
where deptno = 10
7
關于sql優化
select * from emp;
select deptno, ename, ...,
from emp 把要顯示的所有的列都寫出來,速度快,,不需要"翻譯"
select *form emp
where (deptno = 10) and (deptno = 20) and (deptno=30)
<---------
oracle解析邏輯表達式
的方向....從右向左