SQL语言之组函数(Oracle)
組函數(聚合函數)
組函數操作行集,給出每組的結果。組函數不像單行函數,組函數對行的集合進行操作,對每組給出一個結果。這些集合可能是整個表或者是表分成的組;
> 一、組函數與單行函數的區別
?單行函數對查詢到每個結果集做處理,而組函數只對分組數據做處理;
?單行函數對每個結果集返回一個結果,而組函數對每個分組返回一個結果;
> 二、組函數的類型
?Avg 平均值
?Count 計算
?Max 最大值
?Min 最小值
?Sum 合計
三、組函數的語法
四、使用組函數的原則
?用于函數的參數的數據類型可以是char、vachar2、number、date;
?所有組函數忽略空值;為了用一個值代替空值,用nvl、nvl2、coalesce函數;
五、組函數的使用
?Avg(arg)函數
對分組數據做平均值運算;
Arg:參數類型只能是數字類型;
?Sum(arg)函數
對分組數據求和;
Arg:參數類型只能是數字類型;
(以hr用戶中的employees為例)
例
求雇員表中的的平均薪水與薪水總額。 Select avg(salary) , sum(salary) from employees;?Min(arg)函數
求分組數據中最小數據;
Arg:參數類型可以是字符,數字,日期;
?Max(arg)函數
求分組數據中最小數據;
Arg:參數類型可以是字符,數字,日期;
(以hr用戶中的employees為例)
例
求雇員表中的最高薪水與最低薪水; Select max(salary) , min(salary) from employees;
?count函數
返回一個表中的行數;
Count函數有三種格式:count(*)、count(expr)、count(distinct expr);
?Count(*)
返回表中滿足select語句標準的行數,包括重復行,包括有空值的行。如果 where子句包括在select語句中,count(*)返回滿足where子句條件的行數;
(以hr用戶中的employees為例)
例
返回查詢結果的總條數。 Select count(*) from employees;?Count(expr)
返回在列中的由expr指定的非空值的數;
(以hr用戶中的employees為例)
例
顯示部門 80 中有傭金的雇員人數;Select count(commission_pct) from employees where department_id = 80;?Count(distinct expr)
使用distinct關鍵字禁止計算在一列中的重復值;
(以hr用戶中的employees為例)
例
顯示 EMPLOYEES 表中不重復的部門數;Select count(distinct department_id) from employees;
?組函數和null值
所以組函數忽略列中的空值;
在組函數中使用nvl函數來處理空值;
(以hr用戶中的employees為例)
例
1.計算所有員工的傭金的平均值;Select avg(commission_pct) from employees; 2.計算有傭金的員工的傭金平均值。 Select avg(nvl(commission_pct,0)) from employees;?創建數據組(group by)
可以根據需要將查詢到的結果集信息劃分為較小的組,用group by子句實現;
?Group by子句語法
group by子句可以把表中的行劃分為組;然后可以用組函數返回每一組的摘要信息;
?使用分組原則
1.如果在select子句中包含了組函數,就不能選擇單獨的結果,除非單獨的列出現在group by子句中。如果未能在group by子句中包含一個字段列 表,會收到一個錯誤信息;
2.使用where子句,可以在劃分行成組以前過濾行;
3.在group by子句中必須包含列;
4.在group by子句中不能用列別名;
5.默認情況下,行以包含在group by列表中的字段的升序排序。可以用order by子句覆蓋這個默認值;
?多于一個列的分組
(以hr用戶中的employees為例)
例
顯示在每個部門中付給每個工作崗位的合計薪水的報告。Select department_id,job_id ,sum(salary) from employees group by department_id , job_id;
?Group by子句的執行順序
先執行數據查詢,再對數據進行分組,然后執行組函數;
?非法使用group函數的查詢
1.在select列表中的任何列必須在group by子句中;
2.在group by子句中的列或表達式不必在select列表中;
修改后可為:(求各部門下的員工數)
Select department_id , count(last_name) from employees group by department_id;
?約束分組結果
1.Having子句通常與group by語句聯合使用,用來過濾有group by語句返的 記錄集;
2.Having語句的存在彌補了where關鍵字不能與聚合函數聯合使用的不足;
3.Having子句語法
(以hr用戶中的employees為例)
例
一、顯示那些最高薪水大于 $10,000 的部門的部門號和最高薪水。 Select em.department_id,max(em.salary) from employees em group by em.department_id having max(em.salary)>10000; 二、查詢那些最高薪水大于 $10,000 的部門的部門號和平均薪水。 Select em.department_id,avg(salary) from employees em group by em.department_id having max(em.salary)>10000;?嵌套組函數
在使用組函數時我們也可以根據需要來做組函數的嵌套使用;
(以hr用戶中的employees為例)
例
顯示部門中的最大平均薪水; Select max(avg(salary)) from employees em group by em.department_id;總結
以上是生活随笔為你收集整理的SQL语言之组函数(Oracle)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL语言之多表查询(oracle)
- 下一篇: SQL语言之子查询(Oracle)