1. 程式人生 > >oracle數據集合的操作

oracle數據集合的操作

manage HERE 完成 color 區別 數據排序 span 情況 計算

一、統計函數 統計函數包括: COUNT():統計個數 SUM():計算求和 MIN():求最小值 AVG():求平均值 MAX():求最大值 範例:計算emp表中的總人數、平均工資、總工資、最低工資與最高工資 SELECT COUNT(*) 人數, AVG(sal) 平均工資, SUM(sal) 每月總支出,MIN(sal) 最低工資,MAX(sal) 最高工資 FROM emp; 範例:統計出公司的平均雇傭年限 SELECT AVG(MONTHS_BETWEEN(SYSDATE,hiredate)/12) FROM emp; ---統計函數允許與其他的函數嵌套 註意:以上的幾個操作函數,在表中沒有數據的時候,只有COUNT()函數會返回結果,其他都是null。
二、分組統計 如果要進行分組則應該使用GROUP BY句子完成,那麽此時的SQL語法結構變為如下形式: 【4選出所需要的數據列】SELECT [DISTINCT] * | 分組列[別名],分組列 [別名]… 【1確定數據來源】FROM 表名 【2篩選數據行】[WHERE 限定條件(s)];稱[別名] 【3對篩選的行分組】[GROUP BY 分組字段,分組字段…] 【5數據排序】ORDER BY 排序字段 [ASC|DESC],排序字段 [ASC|DESC], … 範例:根據部門編號分組,查詢出每個部門的編號、人數、平均工資 SELECT deptno, COUNT(*), AVG(sal) FROM emp GROUP BY deptno; 使用分組需要註意三個條件: 1、如果查詢不使用GROUP BY 子句,那麽SELECT 子句中只允許出現統計函數,其他任何字段不允許出現。 2、如果查詢中使用了GROUP BY 子句,那麽SELECT子句中只允許出現分組字段、統計函數、其他字段都不允許出現。 3、統計函數允許嵌套,但是嵌套之後的SELECT子句裏面只允許出現嵌套函數,而不允許出現任何字段,包括分組字段。 三、HAVING 子句 HAVING 子句:有HAVING時必然有GROUP BY。反之未必。 【5選出所需要的數據列】SELECT [DISTINCT] * | 分組列[別名],分組列 [別名]… 【1確定數據來源】FROM 表名稱[別名] 【2篩選數據行】[WHERE 限定條件(s)]; 【3對篩選的行分組】[GROUP BY 分組字段,分組字段…] 【4 針對於篩選的行分組】[HAVING 分組過濾] 【6數據排序】ORDER BY 排序字段 [ASC|DESC],排序字段 [ASC|DESC], … 範例:要求查詢出每個職位的名稱,職位的平均工資,但是要求顯示的平均工資高於2000。 SELECT job, AVG(sal) FROM emp GROUP BY job HAVING AVG(sal) > 2000; 說明:關於WHERE與HAVING的區別? WHERE子句是在GROUP BY 分組之前進行篩選,指的是選出那些可以參與分組的數據,並且WHERE子句中不允許使用統計函數; HAVING子句實在GROUP BY分組之後執行的,可以使用統計函數 四、子查詢嵌套 子查詢就是查詢嵌套。都需要使用()。而且查詢子句的一個任意位置上都可以隨意出現子查詢。但是出現子查詢最多的位置:WHERE, FROM,HAVING 。如下使用推薦方案。 WHERE子句:子查詢返回單行單列、單行多列、多行單列;
HAVING子句:子查詢返回單行單列,而且要使用統計函數過濾; FROM子句:子查詢返回的是多行多列; 1、where子句: where子句中主要返回單行單列、單行多列、多行單列等幾種情況: 範例:要求查詢出工資工資最低的固原信息。 SELECT * FROM emp WHERE sal=(SELECT MIN(sal) FROM emp); 對於where子句查詢返回多行單列的情況,那麽實質上就相當於告訴用戶一個數據的操作範圍。而對範圍的判斷,主要有三個運算符:IN 、ANY 、ALL IN 操作: 範例:找出工資在MANAGER職員範圍內的雇員信息 SELECT * FROM emp WHERE sal IN(SELECT sal FROM emp WHERE job = ‘MANAGER‘); NOT IN操作: 範例:找出工資不在MANAGER職員範圍內的雇員信息 SELECT * FROM emp WHERE sal IN(SELECT sal FROM emp WHERE job = ‘MANAGER‘); 註意,這裏的操作,一定要保證子句裏查詢的結果不為null。 ANY操作: 1、=ANY: 功能上與IN完全沒有任何區別 SELECT * FROM emp WHERE sal = ANY (SELECT sal FROM emp WHERE job = ‘MANAGER‘); 2、>ANY: 比子查詢返回的最小的內容要大 SELECT * FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE job = ‘MANAGER‘); 3、<ANY: 比查詢返回的最大值的內容要小 SELECT * FROM emp WHERE sal < ANY (SELECT sal FROM emp WHERE job = ‘MANAGER‘); ALL操作: 1、>ALL: 比子查詢返回最大的值要大 SELECT * FROM emp WHERE sal > All (SELECT sal FROM emp WHERE job = ‘MANAGER‘); 2、<ALL: 比子查詢返回的最小的值還要小 SELECT * FROM emp WHERE sal < All (SELECT sal FROM emp WHERE job = ‘MANAGER‘); Exists()判斷是否滿足條件 如果現在子查詢有數據返回(不管任何數據)就表示條件滿足。那麽就顯示出數據,否則不顯示。 使用exists()只關心子查詢裏面返回的是否有行,至於什麽行,它不關心 SELECT * FROM EMP
WHERE EXISTS( SELECT * FROM emp WHERE empno=7839); 2、having 子句使用子查詢 使用HAVING的前提是得使用了GROUP BY,而使用了GROUP BY就一定要分組。 範例:要求統計出所有高於公司平均工資的部門編號、平均工資、部門人數。 SELECT deptno, COUNT(*),AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal) > (SELECT AVG(sal) FROM emp); 3、from子句使用子查詢 範例:將這個語句查詢出來的表最為一張臨時表:SELECT deptno, COUNT(empno) count, AVG(sal) avg FROM emp GROUP BY deptno---根據部門進行分組查詢出部門人數、平均工資等信息。 然後將temp這張表與dept這張表進行多表查詢。 SELECT d.deptno, d.dname, d.loc, temp.count, temp.avg FROM dept d, ( SELECT deptno, COUNT(empno) count, AVG(sal) avg FROM emp GROUP BY deptno ) temp WHERE d.deptno = temp.deptno(+);

oracle數據集合的操作