--=================================
--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 方法
??? SQL > select min ( sal ) as min_sal , max ( sal ) as max_sal ,
??? ? 2 ??? avg ( sal ) as avg_sal , sum ( sal ) as sum_sal
??? ? 3 ? from scott . emp ;
?
??? ?? MIN_SAL ??? MAX_SAL ??? AVG_SAL ??? SUM_SAL
??? ---------- ---------- ---------- ----------
?????? ?? 800 ?????? 5000 2073.21429 ????? 29025
?
-- 對于數字 , 字符和日期數據類型 , 你能使用 MIN 和 MAX 方法 ?? ??
??? SQL > select min ( hiredate ) as min_hiredate , max ( hiredate ) as max_hiredate from scott . emp ;
?
??? MIN_HIRED MAX_HIRED
??? --------- ---------
??? 17 - DEC - 80 23 - MAY - 87
?
-- 使用 count(*),count(expr),count(distinct expr)
-- 注意 coung(*) 包含空值、重復值, count(expr) 過濾空值, count(distinct expr) 即過濾空值,也過濾重復值
??? SQL > select count (*), count ( mgr ), count ( distinct mgr ) from emp ;
?
??? ? COUNT (*) COUNT ( MGR ) COUNT ( DISTINCTMGR )
??? ---------- ---------- ------------------
?????????? 14 ???????? 13 ????????????????? 6
?
-- 使用 NVL 函數強制分組函數包含空值
??? SQL > 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 ;
?
??? 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 ;
?
??? ? 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 ;
?
-- 查出平均工資在以上的工種 (job)
??? select job , avg ( sal ) from emp group by job having avg ( sal )> 2000 ;
???
-- 求人數在人以上的部門
??? select deptno , count (*) from emp group by deptno having count (*)> 5 ;
???
-- 使用分組函數的嵌套
??? SQL > select max ( avg ( sal )) from emp group by deptno ;
?
??? MAX ( AVG ( SAL ))
??? -------------
??? ?? 2916.66667
/*
九、更多 */
?
?
使用 OEM,SQL*Plus,iSQL*Plus 管理 Oracle 實例
?
Oracle 實例和 Oracle 數據庫 (Oracle 體系結構 )
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
