1. 程式人生 > >04.SQL基礎-->分組與分組函數

04.SQL基礎-->分組與分組函數

tmg esc 組合 con 及其 語法 空值 com 其中

一、分組:

分組函數可以對行集進行操作,並且為每組給出一個結果。
使用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基礎-->分組與分組函數