程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle學習筆記(7)——高級查詢(1)

Oracle學習筆記(7)——高級查詢(1)

編輯:Oracle教程

Oracle學習筆記(7)——高級查詢(1)


在學習高級查詢之前,我們先了解一下如何查看Oracle數據庫中的所有表。因為我們要使用到Oracle數據庫中SCOTT用戶下的幾張表(這些表是Oracle數據庫自帶的表)。

\

 

分組查詢 分組函數的概念:分組函數作用於一組數據,並對一組數據返回一個值。 常用的分組函數:AVG、SUM、MIN、MAX、COUNT、WM_CONCAT(行轉列) 語法: \ 分組函數的使用 AVG(平均值)和SUM(合計)函數 1、求出員工的平均工資和工資的總額 select avg(sal),sum(sal) from emp; MIN(最小值)和MAX(最大值)函數 2、求出員工工資的最大值和最小值 select max(sal),min(sal) from emp; COUNT(計數)函數 3、求出員工的總人數 select count(*) from emp; select count(empno) from emp; \ DISTINCE(distinct)關鍵字(DISTINCT用於去掉重復的記錄) 4、求出部門數 select count(deptno) from emp; select deptno from emp; select count(distinct deptno) from emp;
\ WM_CONCAT:行轉列 示例:select deptno,wm_concat(ename) from emp group by deptno; \
上面顯示的樣式很不好看,我們首先用host cls命令清屏,然後執行下面命令,格式化顯示的格式 set linesize 200 col 部門中員工的姓名 for a60 select deptno 部門號,wm_concat(ename) 部門中員工的姓名 from emp group by deptno; \ 分組函數與空值 1、統計員工的平均工資 select sum(sal)/count(*) 一,sum(sal)/count(sal) 二,avg(sal) 三 from emp; \
2、統計員工的平均獎金 select sum(comm)/count(*) 一,sum(comm)/count(comm) 二,avg(comm) 三 from emp; select count(*),count(comm) from emp; \
總結:分組函數會自動忽略空值,只會統計非空的個數 在分組函數中使用NVL函數 注意:NVL函數使用分組函數無法忽略空值 select count(*),count(nvl(comm,0)) from emp; \ 使用GROUP BY子句數據分組(GROUP BY可以作用在一個列上,也可以作用在多個列上) group by子句的使用 使用單個列分組 示例:求每個部門的平均工資,要求顯示:部門號,部門的平均工資 select deptno,avg(sal) from emp group by deptno; \
\
抽象:Oracle中語法的規定 select a,組函數(x) from table group by a; select a,b,c,組函數(x) from table group by a,b,c;
注意:在SELECT列表中所有未包含在組函數中的列都應該包含在GROUP BY子句中。包含在GROUP BY子句中的列不必包含在SELECT列表中 示例:求每個部門的平均工資,要求顯示:部門的平均工資 select avg(sal) from emp group by deptno; \ 使用多個列分組 示例:按部門、不同的職位,統計員工的工資總額 select deptno,job,sum(sal) from emp group by deptno,job; select deptno,job,sum(sal) from emp group by deptno,job order by deptno; \ 非法使用組函數: \ 修改: \ 使用HAVING子句過濾分組結果集 \ 求平均工資大於2000的部門,要求顯示:部門號,平均工資 select deptno,avg(sal) from emp group by deptno having avg(sal)>2000 \
\ where與having的區別 相同點:都是過濾結果集 不同點: 不能再WHERE子句中使用組函數(注意)。 可以在HAVING子句中使用組函數。 \ where與having通用的情況 select deptno,avg(sal) from emp group by deptno having deptno=10; select deptno,avg(sal) from emp where deptno=10 group by deptno; having 先分組 後過濾 where 先過濾 後分組 where使得分組記錄數大大降低,從而提高效率 注意:where子句中不能使用組函數 在分組查詢中使用order by字句 示例:求每個部門的平均工資,要求顯示:部門號,部門的平均工資並且按照工資升序排列 select deptno,avg(sal) from emp group by deptno order by avg(sal); select deptno,avg(sal) 平均工資 from emp group by deptno order by 平均工資; select deptno,avg(sal) 平均工資 from emp group by deptno order by 2; 可以按照:列,別名,表達式,序號進行排序 \

\
錯誤演示: \
\ 分組函數的嵌套 示例:求部門平均工資的最大值 1、通過AVG函數求出每個部門的平均工資 2、嵌套MAX函數求出部門平均工資的最大值 select max(avg(sal)) from emp group by deptno; \ group by語句的增強 break on deptno 2 相同部門號的值只顯示一次,不同的部門號之間跳過兩行 set pagesize 30 每頁顯示30條記錄 \
\
\
\
\
\ SQL*Plus的報表功能 報表包括:標題,頁碼,別名等 \
\
\

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved