当前位置: 首页 > news >正文

Oracle学习(4)---数据定义语言---分组查询

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

分组查询

源码项目地址

在Oracle数据库中,通过GROUP BY子句将分组的依据加入到查询语句中, 并可使用HAVING子句进一步限制查询结果。主要包括COUNT,AVG,SUM,MAX, MIN等几个分组函数。

  1. 分组函数的使用

  • COUNT

    COUNT函数用来计算表中的总记录条数。

    --例1: 分组函数COUNT

      SELECT COUNT(*) TOTAL_NUM
      FROM SCOTT.EMP;
    

    结果为: 分组函数COUNT

    我们经常习惯地使用SELECT COLUMN FROM TABLE这种方式做数据查询, 如果表记录条数非常庞大的话,比如达到了百万甚至千万级别的数据,这种查 询会花费很长时间输出结果,所以在做SELECT操作之前,可以先使用COUNT计 算一下数据条数,再根据结果做其它操作

  • AVG、SUM

    这两个函数用来统计列或表达式的平均值和和值。

    --例2: 分组函数AVG、SUM

          SELECT  AVG(SAL) AVG_SAL, SUM(SAL) SUM_SAL
          FROM SCOTT.EMP;
    

    结果为: 分组函数AVG、SUM AVG、SUM的计算会自动忽略NULL值

  • MAX、MIN

    这两个函数用来取得列的最大值和最小值。和AVG、SUM只能计算数字 不同,这两个函数可以统计任何数据类型,包括数字、日期和字符。

    --例3: 分组函数MAX、MIN

            SELECT MAX(SAL) MAX_SAL, MIN(SAL) MIN_SAL
            FROM SCOTT.EMP;
    
              SELECT MAX(HIREDATE) MAX_HIRE, MIN(HIREDATE) MIN_HIRE
              FROM SCOTT.EMP;
    

    结果为: 分组函数MAX、MIN

    分组函数MAX、MIN

  1. GROUP BY 短语及其子句

> 加入到GROUP BY和HAVING 子句后的SELECT 语句语法格式如下:

         SELECT <*, column [alias],...>
         FROM table [WHERE condition(s)]
         GROUP BY group_by_expression]
         [HAVING group_condition]
         [ORDER BY column [ASC | DESC]];

1. ### 单列分组
    > 所谓单列分组就是分组的依据是一个列

    --例4: 单列分组
    --按部门分组,计算每个部门的平均薪水、薪水总和、最高、最低
    --薪水以及该部门下的员工人数

              SELECT DEPTNO, AVG(SAL) AVG_SAL, SUM(SAL) SUM_SAL
              FROM SCOTT.EMP
              GROUP BY DEPTNO;

              SELECT DEPTNO, MAX(SAL) MAX_SAL, MIN(SAL) MIN_SAL, COUNT(*) COUNT_NUM
              FROM SCOTT.EMP
              GROUP BY DEPTNO;

    结果为:

单列分组

单列分组

2. ### 多列分组
    > 所谓多列分组就是分组的依据是多个列

    --例5: 多列分组
    --计算每个部门每个职位的平均薪水和最高薪水

              SELECT DEPTNO, JOB, AVG(SAL) AVG_SAL, MAX(SAL) MAX_SAL
              FROM SCOTT.EMP
              GROUP BY DEPTNO,JOB;

    结果为: ![多列分组](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/20.png)

3. ### GROUP BY 语句中的 ROLLUP 操作符
    > 使用ROLLUP操作符可以先按照预定的字段分组,再计算分组计算后每行的小计,
    相当于对于每行数据又执行了一次组函数的操作。

    --例6: GROUP BY 语句中的 ROLLUP 操作符

              SELECT DEPTNO, JOB, AVG(SAL) AVG_SAL
              FROM SCOTT.EMP
              GROUP BY ROLLUP (DEPTNO,JOB);

    结果为: ![GROUP BY 语句中的ROLLUP操作符](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/21.png)

4. ### GROUP BY 语句中的 CUBE 操作符
    > 和 ROLLUP 操作符类似, CUBE 操作符也是为了计算分组后的小计结果,
    除了可以像 ROLLUP 一样横向小计外,还可以生成纵向小计。小计的原则任然
    是根据所用的分组函数。

    --例7: GROUP BY 语句中的 CUBE 操作符

            SELECT DEPTNO, JOB, AVG(SAL) AVG_SAL
            FROM SCOTT.EMP
            GROUP BY CUBE (DEPTNO,JOB);

    结果为: ![GROUP BY 语句中的 CUBE 操作符](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/23.png)
    ![GROUP BY 语句中的 CUBE 操作符](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/22.png)

5. ### 使用 HAVING 子句限制分组结果
    > HAVING 子句用来对分组后的结果进一步限制,比如按部门分组后,得到每个部门的
    最高薪水,只有最高薪水大于4000的记录才能被输出显示

    --例8: 使用 HAVING 子句限制分组结果

              SELECT DEPTNO, MAX(SAL) MAX_SAL
              FROM SCOTT.EMP
              GROUP BY DEPTNO
              HAVING MAX(SAL) > 4000;

    结果为: ![使用 HAVING 子句限制分组结果](https://git.oschina.net/weiwei02/OracleDemo/raw/master/doc/oracle/resources/image/query/24.png)

6. ### 使用分组函数的注意事项
    * **首先分组函数只能出现在 SELECT 列表、 HAVING 子句和 ORDER BY 子句中,
    尤其注意不能出现在 WHERE 子句中。如果要限制分组结果,只能使用 HAVING 子句**
    * **另外,分组函数是忽略NULL值的**

转载于:https://my.oschina.net/weiwei02/blog/780909

相关文章:

  • 基于token的多平台身份认证架构设计
  • Heartbeat+Haresources+NFS配置一个简单的HA高可用+资源共享集群
  • Mybatis 轻松入门教程
  • 《疯狂java讲义2》读书笔记——面向对象的三大特性之一:继承(已更新完)...
  • Redis Cluster架构和设计机制简单介绍
  • Android View体系(六)从源码解析Activity的构成
  • EXCEL 读取
  • rip路由协议基本配置
  • [Unity3D]深度相机 Depth Camera
  • phpmyadmin安装教程及配置设置
  • 11.08---日记
  • 互斥量与信号量
  • 数据库备份那点事儿
  • maven 中使用jetty
  • 微软宣布Azure DNS全面通用
  • php的引用
  • [译] React v16.8: 含有Hooks的版本
  • [译]前端离线指南(上)
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Angular数据绑定机制
  • Centos6.8 使用rpm安装mysql5.7
  • Java应用性能调优
  • js对象的深浅拷贝
  • Python打包系统简单入门
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Spark学习笔记之相关记录
  • 讲清楚之javascript作用域
  • 使用docker-compose进行多节点部署
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 怎样选择前端框架
  • ​flutter 代码混淆
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • !!Dom4j 学习笔记
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (第二周)效能测试
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (七)理解angular中的module和injector,即依赖注入
  • (转)ORM
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .form文件_一篇文章学会文件上传
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net经典笔试题
  • .NET框架设计—常被忽视的C#设计技巧
  • @SpringBootApplication 包含的三个注解及其含义
  • [ JavaScript ] JSON方法
  • [2023-年度总结]凡是过往,皆为序章
  • [Angular 基础] - 表单:响应式表单
  • [BUG]vscode插件live server无法自动打开浏览器
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • [CVPR2021]Birds of a Feather: Capturing Avian Shape Models from Images
  • [ESP32 IDF]web server
  • [fsevents@^2.1.2] optional install error: Package require os(darwin) not compatible with your platfo
  • [Golang]K-V存储引擎的学习 从零实现 (RoseDB mini版本)
  • [iOS开发]iOS中TabBar中间按钮凸起的实现
  • [leetcode] Balanced Binary Tree