组函数:

组函数操作行集,给出每组的结果。组函数不象单行函数,组函数对行的集合进行操作,对每组给出一个结果。这些集合可能是整个表或者是表分成的组。

组函数与单行函数区别:

单行函数对查询到每个结果集做处理,而组函数只对分组数据做处理。

单行函数对每个结果集返回一个结果,而组函数对每个分组返回一个结果。

 组函数的类型:

•AVG 平均值

• COUNT 计数

• MAX 最大值

• MIN 最小值

• SUM 合计

组函数的语法:

 使用组函数的原则:

• 用于函数的参数的数据类型可以是 CHAR、VARCHAR2、NUMBER 或 DATE。

• 所有组函数忽略空值。为了用一个值代替空值,用 NVL、NVL2 或 COALESCE 函数。

组函数的使用:

1.使用 AVG 和 和 SUM 

AVG(arg)函数:对分组数据做平均值运算。

arg:参数类型只能是数字类型。

SUM(arg)函数:对分组数据求和。

arg:参数类型只能是数字类型 。

 例:  求雇员表中的的平均薪水与薪水总额。

  1. SQL> select sum(e.salary) "薪水总额:",avg(e.salary) "平均薪水:" from employees e;
  2. 薪水总额: 平均薪水:
  3. ---------- ----------
  4. 681816 6432.22641

2.用 使用 MIN 和 和 MAX 

MIN(arg)函数:求分组中最小数据。

arg:参数类型可以是字符、数字、日期。

MAX(arg)函数:求分组中最大数据。

arg:参数类型可以是字符、数字、日期。

例: 求雇员表中的最高薪水与最低薪水。

  1. SQL> select min(e.salary) MIN_SALARY,max(e.salary) MAX_SALARY from employees e;
  2. MIN_SALARY MAX_SALARY
  3. ---------- ----------
  4. 2100 24000

3.用 使用 COUNT  函数

COUNT 函数:返回一个表中的行数。
COUNT 函数有三种格式:
• COUNT(*)

• COUNT(expr)

• COUNT(DISTINCT expr)

COUNT(*):

返回表中满足 SELECT 语句标准的行数,包括重复行,包括有空值列的行。如果WHERE 子句包括在 SELECT 语句中,COUNT(*) 返回满足 WHERE 子句条件的行数.

例:返回查询结果的总条数:

  1. SQL> select count(*) from employees;
  2. COUNT(*)
  3. ----------
  4. 106

COUNT(expr)

返回在列中的由 expr 指定的非空值的数

例:显示部门 80 中有佣金的雇员人数

  1. SQL> select count(e.commission_pct) from employees e where e.department_id=80;
  2. COUNT(E.COMMISSION_PCT)
  3. -----------------------
  4. 33

COUNT(DISTINCT expr:

使用 DISTINCT 关键字禁止计算在一列中的重复值。

例:显示 EMPLOYEES 表中不重复的部门数。

  1. SQL> select count(e.department_id) from employees e;
  2. COUNT(E.DEPARTMENT_ID)
  3. ----------------------
  4. 105
  5. SQL> select count(distinct e.department_id) from employees e;
  6. COUNT(DISTINCTE.DEPARTMENT_ID)
  7. ------------------------------
  8. 11

4.组函数和 Null :

所有组函数忽略列中的空值。

在组函数中使用 NVL 函数来处理空值。

例:计算有佣金的员工的佣金平均值。

  1. SQL> select avg(e.commission_pct) from employees e where e.commission_pct is not null;
  2. AVG(E.COMMISSION_PCT)
  3. ---------------------
  4. 0.223529411764706
  5. SQL> select avg(e.commission_pct) from employees e;
  6. AVG(E.COMMISSION_PCT)
  7. ---------------------
  8. 0.223529411764706

例:计算所有员工的佣金的平均值。

  1. SQL> select avg(nvl(e.commission_pct,0)) from employees e;
  2. AVG(NVL(E.COMMISSION_PCT,0))
  3. ----------------------------
  4. 0.0716981132075472

创建数据组(GROUPBY):

可以根据需要将查询到的结果集信息划分为较小的组,用 GROUP BY 子句实现。

GROUP BY 子句用法:

GROUP BY 子句:GROUP BY 子句可以把表中的行划分为组。然后可以用组函数返回每一组的摘要信息

使用分组原则:

• 如果在 SELECT 子句中包含了组函数,就不能选择单独的结果,除非单独的列出现在 GROUP BY 子句中。如果未能在 GROUP BY 子句中包含一个字段列表,你会收到一个错误信息。

• 使用 WHERE 子句,你可以在划分行成组以前过滤行。

• 在 GROUP BY 子句中必须包含列。

• 在 GROUP BY 子句中你不能用列别名。

• 默认情况下,行以包含在 GROUP BY 列表中的字段的升序排序。可以用 ORDER BY子句覆盖这个默认值。

GROUP BY  子句 的使用:

我们可以根据自己的需要对数据进行分组,在分组时,只要将需要做分组的列的列名添加到 GROUP BY 子句后侧就可以。GROUP BY 列不必在 SELECT 列表中。

例:求每个部门的平均薪水

  1. SQL> select avg(e.salary),e.department_id from employees e where e.department_id is not null group by e.department_id;
  2. AVG(E.SALARY) DEPARTMENT_ID
  3. ------------- -------------
  4. 8601.33333333 100
  5. 4150 30
  6. 19333.3333333 90
  7. 9500 20
  8. 10000 70
  9. 10154 110
  10. 3475.55555555 50
  11. 8936.36363636 80
  12. 6500 40
  13. 5760 60
  14. 4400 10
  15. 11 rows selected

 多于一个列的分组:

例:显示在每个部门中付给每个工作岗位的合计薪水的报告。

  1. SQL> select sum(e.salary),e.job_id,e.department_id from employees e
  2. 2 group by e.department_id,e.job_id;
  3. SUM(E.SALARY) JOB_ID DEPARTMENT_ID
  4. ------------- ---------- -------------
  5. 8300 AC_ACCOUNT 110
  6. 34000 AD_VP 90
  7. 55700 ST_CLERK 50
  8. 233900 SA_REP 80
  9. 36400 ST_MAN 50
  10. 61000 SA_MAN 80
  11. 12008 AC_MGR 110
  12. 24000 AD_PRES 90
  13. 28800 IT_PROG 60
  14. 12008 FI_MGR 100
  15. 13900 PU_CLERK 30
  16. 64300 SH_CLERK 50
  17. 13000 MK_MAN 20
  18. 39600 FI_ACCOUNT 100
  19. 7000 SA_REP
  20. 10000 PR_REP 70
  21. 11000 PU_MAN 30
  22. 4400 AD_ASST 10
  23. 6000 MK_REP 20
  24. 6500 HR_REP 40
  25. 20 rows selected

GROUP BY 子句执行的顺序

先进行数据查询,在对数据进行分组,然后执行组函数。

约束分结果(having子句)

having子句通常都是和group by一起用,可以放在group by的前面,也可以放在后面(建议:放在group by的后面,方便自己查看。),having子句是用来弥补group by子句不能用where条件语句的不足,它的出现就是为了和where子句一样的效果,

HAVING 的用法:

例:显示那些最高薪水大于 $10,000 的部门的部门号和最高薪水

  1. SQL> select max(e.salary),e.department_id from employees e
  2. 2 group by e.department_id
  3. 3 having max(e.salary)>10000;
  4. MAX(E.SALARY) DEPARTMENT_ID
  5. ------------- -------------
  6. 12008 100
  7. 11000 30
  8. 24000 90
  9. 13000 20
  10. 12008 110
  11. 14000 80
  12. 6 rows selected

例:查询那些最高薪水大于 $10,000 的部门的部门号和平均薪水

  1. SQL> select avg(e.salary),e.department_id from employees e
  2. 2 group by e.department_id
  3. 3 having max(e.salary)>10000;
  4. AVG(E.SALARY) DEPARTMENT_ID
  5. ------------- -------------
  6. 8601.33333333 100
  7. 4150 30
  8. 19333.3333333 90
  9. 9500 20
  10. 10154 110
  11. 8936.36363636 80
  12. 6 rows selected

嵌套组函数:

在使用组函数时我们也可以根据需要来做组函数的嵌套使用。

例:显示部门中的最大平均薪水:

  1. SQL> select max(avg(e.salary))from employees e group by e.department_id;
  2. MAX(AVG(E.SALARY))
  3. ------------------
  4. 19333.3333333333

组函数小节练习:

1.显示所有雇员的最高、 、 最低、 、 合计和平均薪水, , 列标签分别为 :Maximum 、Minimum 、Sum 和 和 Average 。四     舍五入结果为最近的整数 :

  1. SQL> select max(e.salary) Maximum,min(e.salary) Minimum,sum(e.salary) Sum,avg(e.salary) Average from employees e
  2. 2 ;
  3. MAXIMUM MINIMUM SUM AVERAGE
  4. ---------- ---------- ---------- ----------
  5. 24000 2100 681816 6432.22641

2.修改上题 显示每中工作类型的最低、最高、合计和平均薪水:

  1. SQL> select e.job_id,max(e.salary) Maximum,min(e.salary) Minimum,sum(e.salary) Sum,avg(e.salary) Average from employees e group by e.job_id;
  2. JOB_ID MAXIMUM MINIMUM SUM AVERAGE
  3. ---------- ---------- ---------- ---------- ----------
  4. IT_PROG 9000 4200 28800 5760
  5. AC_MGR 12008 12008 12008 12008
  6. AC_ACCOUNT 8300 8300 8300 8300
  7. ST_MAN 8200 5800 36400 7280
  8. PU_MAN 11000 11000 11000 11000
  9. AD_ASST 4400 4400 4400 4400
  10. AD_VP 17000 17000 34000 17000
  11. SH_CLERK 4200 2500 64300 3215
  12. FI_ACCOUNT 9000 6900 39600 7920
  13. FI_MGR 12008 12008 12008 12008
  14. PU_CLERK 3100 2500 13900 2780
  15. SA_MAN 14000 10500 61000 12200
  16. MK_MAN 13000 13000 13000 13000
  17. PR_REP 10000 10000 10000 10000
  18. AD_PRES 24000 24000 24000 24000
  19. SA_REP 11500 6100 240900 8306.89655
  20. MK_REP 6000 6000 6000 6000
  21. ST_CLERK 3600 2100 55700 2785
  22. HR_REP 6500 6500 6500 6500
  23. 19 rows selected

3.写一个查询显示每一工作岗位的人数:

  1. SQL> select e.job_id,count(e.employee_id) from employees e group by e.job_id;
  2. JOB_ID COUNT(E.EMPLOYEE_ID)
  3. ---------- --------------------
  4. AC_ACCOUNT 1
  5. AC_MGR 1
  6. AD_ASST 1
  7. AD_PRES 1
  8. AD_VP 2
  9. FI_ACCOUNT 5
  10. FI_MGR 1
  11. HR_REP 1
  12. IT_PROG 5
  13. MK_MAN 1
  14. MK_REP 1
  15. PR_REP 1
  16. PU_CLERK 5
  17. PU_MAN 1
  18. SA_MAN 5
  19. SA_REP 29
  20. SH_CLERK 20
  21. ST_CLERK 20
  22. ST_MAN 5
  23. 19 rows selected

4.确定经理人数,不需要列出他们,列标签是 Number ofManagers 。

  1. SQL> select count(distinct e.manager_id) from employees e;
  2. COUNT(DISTINCTE.MANAGER_ID)
  3. ---------------------------
  4. 18

5.写一个查询显示最高和最低薪水之间的差。列标签是DIFFERENCE 。

  1. SQL> select (max(e.salary)-min(e.salary)) DIFFERENCE from employees e;
  2. DIFFERENCE
  3. ----------
  4. 21900

6.显示经理号和经理付给雇员的最低薪水。 。 排除那些经理未知的人 。排除最低薪水小于等于 $6,000  的组 。 按薪水降序排序输出。

  1. SQL> select e.manager_id, min(e.salary) from employees e where e.manager_id is not null
  2. 2 group by e.manager_id
  3. 3 having min(e.salary)<=6000
  4. 4 order by min(e.salary) desc;
  5. MANAGER_ID MIN(E.SALARY)
  6. ---------- -------------
  7. 201 6000
  8. 100 5800
  9. 101 4400
  10. 103 4200
  11. 123 2500
  12. 114 2500
  13. 124 2500
  14. 122 2200
  15. 120 2200
  16. 121 2100
  17. 10 rows selected

7. 写一个查询显示每个部门的名字、地点、人数和部门中所有雇员的平均薪水。四舍五入薪水到两位小数

  1. SQL> select d.department_name,d.location_id,count(e.employee_id),round(avg(e.salary),2) from employees e,departments d
  2. 2 where e.department_id=d.department_id
  3. 3 group by d.department_name,d.location_id;
  4. DEPARTMENT_NAME LOCATION_ID COUNT(E.EMPLOYEE_ID) ROUND(AVG(E.SALARY),2)
  5. ------------------------------ ----------- -------------------- ----------------------
  6. Administration 1700 1 4400
  7. Marketing 1800 2 9500
  8. Sales 2500 33 8936.36
  9. Purchasing 1700 6 4150
  10. Finance 1700 6 8601.33
  11. IT 1400 5 5760
  12. Executive 1700 3 19333.33
  13. Shipping 1500 45 3475.56
  14. Accounting 1700 2 10154
  15. Human Resources 2400 1 6500
  16. Public Relations 2700 1 10000

8.创建一个查询显示雇员总数,和在 2001 、2002 、2003  和受雇的雇员人数。创建适当的列标题。

  1. SQL> select count(e.employee_id),sum(decode(to_char(e.hire_date,'yyyy'),'2001',1,0)) "2001",sum(decode(to_char(e.hire_date,'yyyy'),'2002',1,0)) "2002",sum(decode(to_char(e.hire_date,'yyyy'),'2003',1,0)) "2003" from employees e;
  2. COUNT(E.EMPLOYEE_ID) 2001 2002 2003
  3. -------------------- ---------- ---------- ----------
  4. 106 1 7 6

9.创建一个混合查询显示工作岗位和工作岗位的薪水合计,并门 且合计部门 20 、50 、80 和 和 90  的工作岗位的薪水。给每

列一个恰当的列标题

  1. SQL> select e.job_id,sum(e.salary),sum(decode(e.department_id,20,e.salary)) "dept_20",sum(decode(e.department_id,50,e.salary)) "dept_50",sum(decode(e.department_id,20,e.salary)) "dept_80",sum(decode(e.department_id,90,e.salary)) "dept_90" from employees e group by e.job_id;
  2. JOB_ID SUM(E.SALARY) dept_20 dept_50 dept_80 dept_90
  3. ---------- ------------- ---------- ---------- ---------- ----------
  4. IT_PROG 28800
  5. AC_MGR 12008
  6. AC_ACCOUNT 8300
  7. ST_MAN 36400 36400
  8. PU_MAN 11000
  9. AD_ASST 4400
  10. AD_VP 34000 34000
  11. SH_CLERK 64300 64300
  12. FI_ACCOUNT 39600
  13. FI_MGR 12008
  14. PU_CLERK 13900
  15. SA_MAN 61000
  16. MK_MAN 13000 13000 13000
  17. PR_REP 10000
  18. AD_PRES 24000 24000
  19. SA_REP 240900
  20. MK_REP 6000 6000 6000
  21. ST_CLERK 55700 55700
  22. HR_REP 6500
  23. 19 rows selected

数据库Oracle组函数和分组函数的更多相关文章

  1. Oracle学习笔记_05_分组函数

    组函数:avg  sum  max  min   count group by having group by 增强:rollup      cube     grouping      groupi ...

  2. oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数

        花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用ora ...

  3. oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数

    花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用oracle用 ...

  4. DQL---条件查询、单行函数、多行函数、分组函数、数据类型

    一.DQL 1.基本规则: (1)对于日期型数据,做 *,/ 运算不合法,可以进行 +, - 运算.比如给日期加一天或减一个月,结果仍为一个日期.两个日期间只能为减法,返回两个日期相差的天数,两个日期 ...

  5. mysql 字符串函数、分组函数

    字符串函数 1.concat 函数 drop table test;create table test(id int(4), name varchar(10), sex char(2));insert ...

  6. 《官方资料》 例如:string 函数 、分组函数

    site:www.mysql.com SUBSTRING_INDEX ----------------------------------------------------------------- ...

  7. oracle强化练习之分组函数

    1.      显示平均工资为>2000的职位 select job,avg(sal) from emp group by job having avg(sal)>2500; 2.     ...

  8. oracle 10g 学习之多表查询、分组函数(6)

    笛卡尔集 l  笛卡尔集会在下面条件下产生: 省略连接条件 连接条件无效 所有表中的所有行互相连接 l  为了避免笛卡尔集, 可以在 WHERE 加入有效的连接条件. 自连接 select m.las ...

  9. Oracle系列六 分组函数

    分组函数作用于一组数据,并对一组数据返回一个值. 组函数类型 AVG COUNT MAX MIN STDDEV SUM 组函数语法 SELECT [column,] group_function(co ...

随机推荐

  1. 更新linux时候提示“由于没有公钥,无法验证下列签名".

    本文链接:https://blog.csdn.net/loovejava/article/details/21837935 新安装的Ubuntu在使用sudo apt-get update更新源码的时 ...

  2. 详解Kafka Producer

    上一篇文章我们主要介绍了什么是 Kafka,Kafka 的基本概念是什么,Kafka 单机和集群版的搭建,以及对基本的配置文件进行了大致的介绍,还对 Kafka 的几个主要角色进行了描述,我们知道,不 ...

  3. 微信小程序this.data和this.setData({})的区别

    this.data.xx是用来获取页面data对象的----------只是js(逻辑层)数据的更改: this.setData是用来更新界面的---------用于更新view层的.

  4. jwt 实践应用以及特殊案例思考

    JSON Web Token 是 rfc7519 出的一份标准,使用 JSON 来传递数据,用于判定用户是否登录状态. jwt 之前,使用 session 来做用户认证. 以下代码均使用 javasc ...

  5. scrapy介绍及使用

    scrapy的流程 其流程可以描述如下: 调度器把requests-->引擎-->下载中间件--->下载器 下载器发送请求,获取响应---->下载中间件---->引擎-- ...

  6. opencv 4 图像处理(漫水填充,图像金字塔与图片尺寸缩放,阈(yu)值化)

    漫水填充 实现漫水填充算法:floodFill函数 简单调用范例 #include <opencv2/opencv.hpp> #include <opencv2/imgproc/im ...

  7. js数组之sort()函数

    一般我们使用sort函数进行数组的排序,sort()方法有一个可选参数,是用来确定元素顺序的函数.如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序.如: var arr = [&q ...

  8. 关于.ssh目录下的known_hosts文件的补充

    一.关于.ssh目录下的known_hosts文件的补充 其实一开始是没有注意到的,按照网上的教程一步一步操作,并没有注意到这个文件的生成.直到有一次我试着去查询.ssh目录是否存在时,出现了下面的情 ...

  9. 【Luogu P3384】树链剖分模板

    树链剖分的基本思想是把一棵树剖分成若干条链,再利用线段树等数据结构维护相关数据,可以非常暴力优雅地解决很多问题. 树链剖分中的几个基本概念: 重儿子:对于当前节点的所有儿子中,子树大小最大的一个儿子就 ...

  10. 【2018寒假集训 Day1】【位运算】桐桐的运输方案

    桐桐的运输方案(transp) [问题描述] 桐桐有 N 件货物需要运送到目的地,它们的重量和价值分别记为: 重量:W1,W2,…,Wn: 价值:V1,V2,…,Vn: 已知某辆货车的最大载货量为 X ...