组函数(聚合函数)

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

> 一、组函数与单行函数的区别

单行函数对查询到每个结果集做处理,而组函数只对分组数据做处理;
单行函数对每个结果集返回一个结果,而组函数对每个分组返回一个结果;

> 二、组函数的类型

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)相关推荐

  1. SQL语言之索引(Oracle)

    索引(index) 在关系型数据库中,索引是一种单独的.物理的对数据库表中的一列或多列的值进行排序的一种存储结构,他是某个表中一列或若干列值的集合和相应的指向表中物理标识,这些值的数据页的逻辑指针清 ...

  2. SQL语言之序列(Oracle)

    序列(sequence) 用户创建的数据库对象,序列会产生唯一的整数.序列的一个典型的用途是创建一个主键的值,它对于每一行必须是唯一的.序列有一个Oracle内部程序产生并增加或减少. 一个节省时 ...

  3. SQL语言之用户(Oracle)

    用户(user) Oracle用户是用来连接数据库和访问数据库对象的: 创建用户 需要具备创建用户的权限可以使用sys或者system用户来创建用户 1.使用默认表空间 例 创建一个用户名称为 u_ ...

  4. SQL语言之同义词(Oracle)

    同义词(synonym) 同义词可以除去对象名必须要的方案限制,并提供一个可替换表名.视图名.序列名和存储过程名或其他对象名.该方法对具有特别长的对象的名字很有用: 创建同义词 例 创建employ ...

  5. SQL语言之操作数据(Oracle)

    操作数据(DML) 当添加.更改或者删除数据库中的数据时需要使用DML语句.DML依据的一个集合构成了一个被称之为事务的逻辑单元: 当完成以下操作是,DML语句被执行: 添加新的行到表中: 修改表 ...

  6. Oracle PL/SQL语言初级教程(自学)

    Oracle PL/SQL语言初级教程 PL/SQL 语言基础 PL/SQL 是一种高性能的基于事务处理的语言,能运行在任何 ORACLE 环境中,支持所有数据处理命令. 通过使用 PL/SQL 程序 ...

  7. oracle数据库sql培训,Oracle数据库SQL语言实战培训教程(全面、详细、案例、精讲)套餐...

    风哥oracle数据库SQL语言实战培训教程(案例.精讲)套餐,DBA必备技能. 套餐介绍: 风哥Oracle数据库SQL语言实战培训教程(案例.精讲)套餐,DBA必备技能. 内容: SQL语言基础入 ...

  8. oracle stdevp函数,ORACLE 系统函数与SQLSERVER系统函数的区别是什么

    ORACLE 系统函数与SQLSERVER系统函数的区别是什么 发布时间:2021-03-17 14:40:36 来源:亿速云 阅读:57 作者:Leah 栏目:数据库 这篇文章给大家介绍ORACLE ...

  9. sql语句中的函数使用

    select *,sum(item_XXname) as itemSum from 表名. get(itemSum) 便可得到一系列的对应字段的和. 涉及到的其他的函数还有,摘自以下地址 http:/ ...

最新文章

  1. C#面向对象三大特性之二:继承
  2. 云炬Qtpy5开发与实战笔记 2PyCharm添加QTDesinger扩展并创建第一个.ui文件
  3. [译]Razor内幕之介绍
  4. Visual Basic.Net连各种数据库的几种方法
  5. 手机游戏上线前的准备
  6. php纯真ip调用,使用php调用纯真IP数据库信息的解析组件
  7. C++——STL容器
  8. emqx配置ssl/tsl实现双向认证
  9. 数据文件online和offline
  10. Winform从入门到精通(38)——StatusStrip(史上最全)
  11. mysql=mariadb
  12. Fragment重叠问题简单解决方案
  13. BZOJ1005 [HNOI2008]明明的烦恼
  14. 致远SPM解决方案之费用管理
  15. 会计 金融管理 计算机网络技术,天津海运职业学院专业排名,招生专业目录(10篇)...
  16. 像阿里一样充满使命愿景和价值观
  17. python时间间隔函数_python定间隔取点(np.linspace)的实现
  18. 走进“开源SDR实验室” 一起玩转GNU Radio:gr-qtgui
  19. 【A星算法的优化方案】
  20. SEO优化—知己知彼,百战百胜

热门文章

  1. 猴子吃桃问题 python
  2. [转]VMware虚拟机上网络连接(network type)的三种模式--bridged、host-only、NAT
  3. 1874 素数和最大 - Wikioi
  4. poj 2240 Arbitrage (floyd 变形)
  5. stm32多块开发板can总线互联卡死问题
  6. 关于ESP8266 GPIO中断使用的总结
  7. 数学建模——支持向量机模型详解Python代码
  8. buu [BJDCTF 2020]这是base??
  9. buu 密码学的心声
  10. 关于解决mybase7继续使用的方法