oracle數據集合的操作
阿新 • • 發佈:2018-07-06
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(+);
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數據集合的操作