在實際應用中經常需要執行復雜的資料統計,經常需要顯示多張表的資料,現在我們給大家介紹較為複雜的select語句
n 資料分組 max min avg sum count
? 如何顯示所有員工中最高工資和最低工資
select max(sal),min(sal) from emp;
? 顯示所有員工的平均工資和工資總和
select avg(sal),sum(sal) from emp;
☞avg(comm)不會把comm為null的行進行統計,因此我們要注意,如果希望為null的也考慮,則我們可以這樣做:
select sum(comm)/count(*) form emp;
? 計算共有多少員工
select count(*) from emp;
細節:count(*),也可以對一個欄位進行統計,比如:count(sal);
count(comm)不考慮為null進行統計。
n 擴充套件要求:
? 請顯示工資最高的員工的名字,工作崗位
select ename,job from emp where sal=(select max(sal) from emp);
? 請顯示工資高於平均工資的員工資訊
select * from emp where sal>(select avg(sal) from emp);
select 語句執行的順序
(1)我們寫SQL語句是從左到右
(2)SQL執行在預設情況下是從右向左執行。
(3)無論select有多少,oracle有執行順序。
n group by和having字句
group by 用於對查詢的結果分組統計 having字句用於限制(過濾)分組顯示結果
? 如何顯示每個部門的平局工資和最高工資
select avg(sal),max(sal),deptno from emp group by deptno;
? 顯示每個部門的每種崗位的平均工資和最低工資
select avg(sal),min(sal),deptno,job from emp group by deptno,job order by deptno;
? 顯示平均工資低於2000的部門號和它的平均工資
select deptno,avg(sal) from emp group by deptno having avg(sal)<2000;
having不能使用別名
SQL> select deptno,avg(sal) myavg from emp group by deptno having myavg<2000;
select deptno,avg(sal) myavg from emp group by deptno having myavg<2000
ORA-00904: "MYAVG": 識別符號無效
n 對資料分組的總結
1、分組函式(avg...)只能出現在選擇列表、having、order by字句中
select avg(sal),deptno from emp group by deptno having avg(sal)>100 order by avg(sal) desc;
2、如果在select語句中同時包含有group by,having,order by,那麼它們的順序是group by,having,order by。
3、在選擇列中如果有列、表示式、分組函式,那麼這些列和表示式必須有一個出現在group by字句中,否則就會出錯
如select deptno,avg(sal),max(sal) from emp group by deptno having avg(sal)<2000;
這裡deptno就一定要出現在group by中。
SQL> select avg(sal),deptno,job from emp group by job having avg(sal)>100 order by avg(sal);
select avg(sal),deptno,job from emp group by job having avg(sal)>100 order by avg(sal)
ORA-00979: 不是 GROUP BY 表示式
SQL> select avg(sal),deptno,job from emp group by job,deptno having avg(sal)>100 order by avg(sal);
AVG(SAL) DEPTNO JOB
---------- ------ ---------
950 30 CLERK
950 20 CLERK
1300 10 CLERK
1400 30 SALESMAN
2450 10 MANAGER
2850 30 MANAGER
2975 20 MANAGER
3000 20 ANALYST
5000 10 PRESIDENT
9 rows selected