今天有个同事给我打电话问我题目列出的这个问题,在日常开发中,确实它们俩都是与分组有关的,但是需要注意的是一个是分组函数另一个是分析函数,讲解用到的表就以Oracle中schema的scott的EMP表和DEPT表为例做讲解:

老总下命令说:需要统计下公司里每个部门的人数以及每个部门的工资发放的工资总和;先分析下统计每个部门的人数和工资总和,指的是将不同部门的人员分别放到不同的地方,然后再将不同部门的人数一个个数出来,以及工资一个个加出来,也就是说表里面的数据是零散的,通过分组函数分组后展示出来的是以组为单位的几个数据块,需要注意的是分组完成之后的数据块是一个整体为单位的,所以对于这个整体不允许使用比如针对块里单个对象做处理

,正式因为如此,很多初学的人都会犯这种类型的错误,好的,上SQL;

SELECT DEPTNO 部门编号,COUNT(*) AS 部门人数,SUM(sal) 部门工资总和 FROM emp GROUP BY deptno ORDER BY SUM(sal) DESC;

结果就不贴出来了,可以看到的是整个EMP表里面的数据分成了三条,每条数据针对一个部门,对于分组函数而言,它不关心每个分组里面到底是由谁构成的,或者是相对于个体,分组函数是站在一个宏观的角度上看待数据的;

好的,那么又一个需求来了,如果需要显示每个部门的员工姓名、工资、该员工在部门里的工资排序,部门的工资总和呢?那么这个时候使用partition by就要方便的多,看代码:

SELECT deptno 部门名称 ,ename 员工姓名, sal 员工工资, ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal) 所在部门工资排序  FROM emp;

说到这,大家估计开始琢磨到底什么区别了,同样,以求部门工资总和为例:

-- 使用分组函数GROUP BY方式
SELECT deptno 部门编号,SUM(sal) 部门工资总和 FROM emp GROUP BY deptno;

执行结果为:
下面再看一下:

-- 使用分析函数 PARTITION BY方式
SELECT deptno 部门编号,SUM(SAL) OVER (partition by sal) 部门工资总和 FROM emp;

输出结果为:


对于这个结果大家可能会比较奇怪,其实这也正是这两个函数的区别,如果还是觉得不清晰,再看下面这个更具体的例子:

SELECT deptno 部门名称 ,ename 员工姓名, sal 员工工资, SUM(sal) OVER(PARTITION BY deptno ORDER BY sal) 所在部门工资总和  FROM emp;

输出结果:


通过上面三个例子可以得出以下结论:

1、字面意思上来看,分组函数是对于整体而言的,分析函数是用来分析个体而言的,呈现的结果也验证了这一点;

2、对于GROUP BY而言,是从整体宏观上把握分组后的数据模块,对于PARTITION BY而言,它虽然也是讲数据分组,但是它是从每个数据模块的个体出发,进行相应操作的,比如上述工资总和,比如每个部门有100个员工,用了它之后会有100条求和累加数据显示出来;

总之一句话,GROUP BY将分组后的块看成一个整体,忽略个体;PARTITION BY也是看成整体,但是重视个体!

分组函数group by和Oracle中分析函数partition by的用法以及区别相关推荐

  1. Oracle中INSTR和SUBSTR的用法

    2019独角兽企业重金招聘Python工程师标准>>> Oracle中INSTR和SUBSTR的用法 Oracle中INSTR的用法: INSTR方法的格式为 INSTR(源字符串, ...

  2. day12_oracle hint——SQL优化过程中常见Oracle中HINT的30个用法

    在SQL语句优化过程中,经常会用到hint, 以下是在SQL优化过程中常见Oracle中"HINT"的30个用法 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方 ...

  3. oracle8i substr,Oracle中INSTR和SUBSTR的用法

    Oracle中INSTR和SUBSTR的用法 Oracle中INSTR的用法: INSTR方法的格式为 INSTR(源字符串, 要查找的字符串, 从第几个字符开始, 要找到第几个匹配的序号) 返回找到 ...

  4. oracle中drop、delete和truncate的区别

    oracle中drop.delete和truncate的区别 oracle中可以使用drop.delete和truncate三个命令来删除数据库中的表,网上有许多文章和教程专门讲解了它们之间的异同,我 ...

  5. oracle pga的作用,浅析Oracle中PGA和UGA两者间的区别

    初学Oracle时,你可能会对Oracle中PGA和UGA两者间的区别产生疑问,这里就PGA和UGA两者间的区别发表下个人意见,在这里拿出来和大家分享一下. The Process Memory除SG ...

  6. Oracle中rownum的说明及用法总结

    Oracle中rownum的说明及用法总结 一.rownum的说明 rownum是Oracle特有的一个关键字. (1)对于基表,在insert记录时,oracle就按照insert的顺序,将rown ...

  7. Oracle中TRUNCATE、DELETE和DROP的区别?

    Oracle中TRUNCATE.DELETE和DROP的区别? 区别: 1.删除表时表数据方面 delete是每次从表中删除一行,同时将删除操作作为事务写进日志以便回滚操作,在有该操作的触发器时,执行 ...

  8. oracle中主键和唯一索引的区别说明

    上周六去参加上海Oracle WDP俱乐部沙龙的一次交流,其中提到了关于"Oracle中主键和唯一索引的区别",基本上大家都可以说上几个,在网上也可以找到,但是总感觉不太全,根据自 ...

  9. @ini_get php,php中get_cfg_var()和ini_get()的用法及区别_php技巧_脚本之家

    本文实例讲述了php中get_cfg_var()和ini_get()的用法及区别.分享给大家供大家参考.具体分析如下: php里get_cfg_var()和ini_get()都是取得配置值的函数,当你 ...

最新文章

  1. C Primer Plus_第8章_字符输入输出和输入确认_编程练习
  2. aDev第13期#个性化推荐技术#总结(Part III, Final: 稳国柱@豆瓣)
  3. python编写函数_python函数式编程
  4. C 11 实现的 100行 线程池
  5. JS实战 · 复选框全选操作
  6. 作者:海沫,女,博士,中央财经大学信息学院副教授,CCF高级会员。
  7. s7-300 400plc应用技术_西门子S7300/400顺序功能图设计教程,看完豁然开朗!
  8. 生活中有哪些越早明白越好的道理
  9. 怎么才能成为一名PHP专家?
  10. Kerberos安装及拖管Ambari 2.7
  11. Linux 僵尸进程查杀
  12. 《私募证券投资基金业绩报酬指引(征求意见稿)》
  13. 34 模板方法模式(模板方法设计模式)详解
  14. [Java]Axis需要高版本的J2sdk:j2sdk-1_4_2_08
  15. linux安装git lfs
  16. iOS 斯坦福大学公开课地址
  17. Python 学习笔记03 - 程序结构
  18. 翻译:PyTorch基础知识学习 - transforms(变换)
  19. 开发者账号注册的详细流程
  20. 架构设计:系统间通信(36)——Apache Camel快速入门(上)

热门文章

  1. centos 7上创建samba服务器
  2. tcp 出现rst情况整理
  3. 删除VisaulStudio2010产生的垃圾
  4. CAD答辩周 -- 与自己相关的几场
  5. Java框架数据库连接池比较(c3p0,dbcp和proxool)
  6. VS2015快捷键使用与常见问题
  7. php自动验证,ThinkPHP 自动验证及验证规则详解
  8. Modularity(模块化-无模块化)
  9. 鸿蒙系统对手机性能的提升,鸿蒙OS手机版再爆新特性,流畅度和性能大幅提升,用户评价很高...
  10. java biginteger log_java – BigInteger:计算可伸缩方法中的小数位数