天天看點

6.組函數(avg(),sum(),max(),min(),count())、多行函數,分組資料(group by,求各部門的平均工資),分組過濾(having和where),sql優化



1組函數 avg(),sum(),max(),min(),count()案例:

selectavg(sal),sum(sal),max(sal),min(sal),count(sal)

from emp

/

截圖:

6.組函數(avg(),sum(),max(),min(),count())、多行函數,分組資料(group by,求各部門的平均工資),分組過濾(having和where),sql優化

2

組函數和null在一起

案例:求員工的平均獎金

錯誤sql:

select avg(comm)

方式1,sum(comm)/count(comm)方式2,sum(comm)/count(*)

方式3

from emp;

6.組函數(avg(),sum(),max(),min(),count())、多行函數,分組資料(group by,求各部門的平均工資),分組過濾(having和where),sql優化

錯誤原因:

select count(comm),count(*) from emp;

6.組函數(avg(),sum(),max(),min(),count())、多行函數,分組資料(group by,求各部門的平均工資),分組過濾(having和where),sql優化

分析:

--組函數自動濾空,組函數忽略空值

--修正函數的濾空

select count(nvl(comm,0)),count(*) fromemp;

6.組函數(avg(),sum(),max(),min(),count())、多行函數,分組資料(group by,求各部門的平均工資),分組過濾(having和where),sql優化

3.分組資料

求各個部門的平均工資

思路:需要把各個部門的資料劃分….10部門

20部門 30部門….分組……

select deptno,avg(sal)

group by deptno;

運作結果:

6.組函數(avg(),sum(),max(),min(),count())、多行函數,分組資料(group by,求各部門的平均工資),分組過濾(having和where),sql優化

組函數設計的本意

(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;

6.組函數(avg(),sum(),max(),min(),count())、多行函數,分組資料(group by,求各部門的平均工資),分組過濾(having和where),sql優化

5

分組過濾

--查詢各個部門的平均工資

--進一步,查詢平均工資大于2000的部門

group by deptno

having avg(sal) > 2000;

6.組函數(avg(),sum(),max(),min(),count())、多行函數,分組資料(group by,求各部門的平均工資),分組過濾(having和where),sql優化

6 having和where子句差別

求10号部門的平均工資

方法1:先分組,在過濾

having deptno=10;

6.組函數(avg(),sum(),max(),min(),count())、多行函數,分組資料(group by,求各部門的平均工資),分組過濾(having和where),sql優化

方法2:先過濾再分組

where deptno = 10

6.組函數(avg(),sum(),max(),min(),count())、多行函數,分組資料(group by,求各部門的平均工資),分組過濾(having和where),sql優化

7

關于sql優化

select * from emp;

select deptno, ename, ..., 

from emp 把要顯示的所有的列都寫出來,速度快,,不需要"翻譯"

select *form emp

where (deptno = 10) and (deptno = 20) and (deptno=30)

<---------

oracle解析邏輯表達式

的方向....從右向左