04.SQL基礎-->分組與分組函數
一、分組:
分組函數可以對行集進行操作,並且為每組給出一個結果。 使用group by column1,column2,..按columm1,column2進行分組,即column1,column2組合相同的值為一個組
二、常用分組函數:
AVG([DISTINCT|ALL]n) -- 求平均值,忽略空值 COUNT({*|[DISTINCT|ALL]expr}) -- 統計個數,其中expr用來判定非空值(使用*計算所有選定行,包括重復行和帶有空值的行) MAX([DISTINCT|ALL]expr) -- 求最大值,忽略空值 MIN([DISTINCT|ALL]expr) -- 求最小值,忽略空值 SUM([DISTINCT|ALL]n) -- 求和,忽略空值
三、分組函數語法:*/
SELECT [column,] group_function(column), ... FROM table [WHERE condition] [GROUP BY column] [ORDER BY column];
/*
四、分組函數使用準則:
DISTINCT 使函數只考慮非重復值,ALL則考慮包括重復值在內的所有值。默認為ALL. 帶有expr參數的函數的數據類型可以為CHAR,VARCHAR2,NUMBER,DATE. 所有分組函數都忽略空值。可以使用NVL,NVL2,或COALESCE函數代替空值 使用GROUP BY 時,Oralce服務器隱式地按照升序對結果集進行排序。可以使用ORDER BY 更改排序結果。 可以使用NVL 函數強制分組函數包含空值,如: select avg(nvl(comm,0)) from emp;
五、GROUP BY 子句的語法:
使用GROUP BY 子句可以將表中的行分成更小的組,然後使用分組函數返回每一組的匯總信息 SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [ORDER BY column];
GROUP BY --group_by_expression 即為對哪些列進行分組
六、GROUP BY 使用準則:
SELECT 中出現的列,如果未出現在分組函數中,則GROUP BY子句必須包含這些列 WHERE 子句可以某些行在分組之前排除在外 不能在GROUP BY 中使用列別名 默認情況下GROUP BY列表中的列按升序排列 GROUP BY 的列可以不出現在分組中
七、分組過濾:
使用having子句
having使用的情況: 行已經被分組 使用了組函數 滿足having子句中條件的分組將被顯示
八、演示:*/
--為數字數據使用AVG和SUM方法
select min(sal) as min_sal,max(sal) as max_sal,
avg(sal) as avg_sal,sum(sal) as sum_sal
from scott.emp;
idle> select min(sal) as min_sal,max(sal) as max_sal, avg(sal) as avg_sal,sum(sal) as sum_sal from scott.emp; 2 3 MIN_SAL MAX_SAL AVG_SAL SUM_SAL ---------- ---------- ---------- ---------- 800 5000 2073.21429 29025
--對於數字,字符和日期數據類型,你能使用MIN和MAX方法
select min(hiredate) as min_hiredate,max(hiredate) as max_hiredate from scott.emp;
idle> select min(hiredate) as min_hiredate,max(hiredate) as max_hiredate from scott.emp; MIN_HIREDA MAX_HIREDA ---------- ---------- 1980-12-17 1987-05-23
--使用count(*),count(expr),count(distinct expr)
--註意coung(*)包含空值、重復值,count(expr)過濾空值,count(distinct expr)即過濾空值,也過濾重復值
SQL> select count(*),count(mgr),count(distinct mgr) from emp;
idle> select count(*),count(mgr),count(distinct mgr) from emp; COUNT(*) COUNT(MGR) COUNT(DISTINCTMGR) ---------- ---------- ------------------ 14 13 6
--使用NVL 函數強制分組函數包含空值
SQL>
idle> select avg(comm) ,avg(nvl(comm,0)) from emp; AVG(COMM) AVG(NVL(COMM,0)) ---------- ---------------- 550 157.142857
--使用group by 子句來分組
SQL> select job ,avg(sal) from emp group by job;
idle> select job ,avg(sal) from emp group by job; JOB AVG(SAL) --------- ---------- CLERK 1037.5 SALESMAN 1400 PRESIDENT 5000 MANAGER 2758.33333 ANALYST 3000
--GROUP BY 的列可以不出現在分組中
SQL> select avg(sal) from emp group by job order by avg(sal) desc;
idle> select avg(sal) from emp group by job order by avg(sal) desc; AVG(SAL) ---------- 5000 3000 2758.33333 1400 1037.5
--錯誤的用法,SELECT 中的有些列沒有在GROUP BY子句中出現
SQL> select job,avg(sal) from emp;
select job,avg(sal) from emp
*
ERROR at line 1:
ORA-00937: not a single-group group function
--使用having子句過濾分組結果
--查詢平均工資高於的部門號,及其平均工資。
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
idle> select deptno,avg(sal) from emp group by deptno having avg(sal)>2000; DEPTNO AVG(SAL) ---------- ---------- 20 2175 10 2916.66667
--查出平均工資在以上的工種(job)
select job,avg(sal) from emp group by job having avg(sal)>2000;
idle> select job,avg(sal) from emp group by job having avg(sal)>2000; JOB AVG(SAL) --------- ---------- PRESIDENT 5000 MANAGER 2758.33333 ANALYST 3000
--求人數在人以上的部門
select deptno,count(*) from emp group by deptno having count(*)>5;
idle> select deptno,count(*) from emp group by deptno having count(*)>5; DEPTNO COUNT(*) ---------- ---------- 30 6
--使用分組函數的嵌套
SQL> select max(avg(sal)) from emp group by deptno;
idle> select max(avg(sal)) from emp group by deptno; MAX(AVG(SAL)) ------------- 2916.66667
04.SQL基礎-->分組與分組函數