• [SQL入门级] 接上篇,继续查询


    距离上一篇时间隔得蛮久了,这篇继续查询,简单总结一下聚合函数、分组的知识。

    一、聚合函数(组函数/多行函数)

    何谓多行函数,顾名思义就是函数作用于多行数据得出一个输出结果,什么意思呢?看图:

    image

    那么常用的有哪些这样的函数呢?

    AVG(平均值)

    SUM(合计)

    COUNT(计数)

    MAX(最大值)

    MIN(最小值)

    STDDEV(标准差)

    组函数使用的语法,用法很简单,但有两点要注意:

    image

    I. 函数参数类型

    1. 数值型数据使用AVGSUM函数
    2. 任意数据类型的数据使用MIN、MAX、COUNT函数

    II. 有关空值的处理

    1. 首先组函数是忽略空值的,例如COUNT(*)返回的是表中所有的记录数,而COUNT(expr)返回的是expr字段不为空的记录数
    2. 那么怎样来处理空值呢,就要用到上一篇中提到的NVL函数,SELECT AVG(NVL(commission_pct,0)) FROM employees
    3. DISTINCT关键字表达的非空且不重复,COUNT(DISTINCT expr)返回的expr非空且不重复的记录数

    III. 不能在WHERE子句中使用组函数,这点结合后面的HAVING子句解释。

    IV. 组函数可以嵌套使用

    二、数据分组

    GROUP BY子句,分组数据

    意思咱就不废话了,用的时候注意两点:

    • SELECT后面的所有列中,没有使用聚合函数的列,必须出现在GROUP BY后面,反过来包含在GROUP BY子句的中的列却不必包含在SELECT列表中。
    • GROUP BY子句可以包含多个列,同意也适用规则1。

    有点晕,什么意思呢?我来解释一下,判断一个sql语句是否合法其实可以试着去理解你要写的sql语句要表达的实际想法,例如:

    • select department_id,job_id,avg(salary)
      from employees
      group by department_id,
      job_id

    image

    如上语句,我想要表达的意思是:从雇员这张表中求出不同部门和不同工种的人的平均工资,输出的格式是按照SELECT语句列表。那么如果我从SELECT列表中随便删掉一个字段,改变的只是我输出的格式,我还是按部门和工种进行分类了;但是如果只从GROUP

    BY子句中删掉job_id,则语句表达的意思就不能成立了,我按部门进行分组,但是部门中有很多个工种,结果到底要怎样对应不得而知。

    HAVING子句,过滤分组

    • WHERE子句的作用是筛选满足条件的数据行,即在分组之前过滤数据,条件中不能使用聚合函数;使用WHERE条件显示特定的行;
    • HAVING子句的作用是筛选满足条件的组,即在分组之后过滤分组,条件中经常包含聚合函数;使用HAVING条件显示特定的分组;
  • 相关阅读:
    什么才是java的基础知识?
    Java的背景、影响及前景
    设计模式分类
    关于日期及日期格式转换的记录
    添加同名工具后台验证后不跳转且保留用户输入的数值
    案件讨论回复中出现把多个附件当成一个评论显示,导致分页出错
    指令发布详情弹窗实现“取消”按钮
    最大间隔分离超平面的唯一性完整证明
    CART算法与剪枝原理
    Spark MLlib学习
  • 原文地址:https://www.cnblogs.com/giserxiaoliang/p/4630673.html
Copyright © 2020-2023  润新知