zoukankan      html  css  js  c++  java
  • 数据分组入门

    数据分组用来将数据分为多个逻辑组,从而可以对每个组进行聚合运算。SQL语句中使用GROUP BY子句进行分组,使用方式为“GROUP BY 分组字段”。分组语句必须和聚合函数一起使用,GROUP BY子句负责将数据分成逻辑组,而聚合函数则对每一个组进行统计计算。

    虽然GROUP BY子句常常和聚合函数一起使用,不过GROUP BY子句并不是不能离开聚合函数而单独使用的,虽然不使用聚合函数的GROUP BY子句看起来用处不大,不过它能够帮助我们更好的理解数据分组的原理,所以本小节我们将演示GROUP BY子句的分组能力。

    我们首先来看一下如果通过SQL语句实现“查看公司员工有哪些年龄段的”,因为这里只需要列出员工的年龄段,所以使用GROUP BY子句就完全可以实现:

    
    SELECT FAge FROM T_Employee GROUP BY FAge
    

    执行完毕我们就能在输出结果中看到下面的执行结果:

    
    FAge
    
    22
    
    23
    
    25
    
    27
    
    28
    

    这个SQL语句处理表中的所有记录,并且将FAge相同的数据行放到一组,分组后的数据可以看作一个临时的结果集,而SELECT FAge语句则取出每组的FAge字段的值,这样我们就得到上表的员工年龄段表了。

    GROUP BY子句将检索结果划分为多个组,每个组是所有记录的一个子集。上面的SQL例子在执行的时候数据库系统将数据分成了下面的分组:

    需要注意的是GROUP BY子句的位置,GROUP BY子句必须放到SELECT语句的之后,如果SELECT语句有WHERE子句,则GROUP BY子句必须放到WHERE语句的之后。比如下面的SQL语句是错误的:

    
    SELECT FAge FROM T_Employee GROUP BY FAge WHERE FSubCompany = "Beijing"
    

    而下面的SQL语句则是正确的:

    
    SELECT FAge FROM T_Employee WHERE FSubCompany = "Beijing" GROUP BY FAge
    

    需要分组的所有列都必须位于GROUP BY子句的列名列表中,也就是没有出现在GROUP BY子句中的列(聚合函数除外)是不能放到SELECT语句后的列名列表中的。比如下面的SQL语句是错误的:

    
    SELECT FAge,FSalary FROM T_Employee GROUP BY FAge
    

    道理非常简单,因为采用分组以后的查询结果集是以分组形式提供的,由于每组中人员的

    员工工资都不一样,所以就不存在能够统一代表本组工资水平的FSalary字段了,所以上面的SQL语句是错误的。不过每组中员工的平均工资却是能够代表本组统一工资水平的,所以可以对FSalary使用聚合函数,下面的SQL语句是正确的:

    
    SELECT FAge,AVG(FSalary) FROM T_Employee GROUP BY FAge
    

    GROUP BY子句中可以指定多个列,只需要将多个列的列名用逗号隔开即可。指定多个分组规则以后,数据库系统将按照定义的分组顺序来对数据进行逐层分组,首先按照第一个分组列进行分组,然后在每个小组内按照第二个分组列进行再次分组……逐层分组,从而实现“组中组”的效果,而查询的结果集是以最末一级分组来进行输出的。比如下面的SQL语句将会列出所有分公司的所有部门情况:

    
    SELECT FSubCompany,FDepartment FROM T_Employee GROUP BY FSubCompany,FDepartment
    

    执行完毕我们就能在输出结果中看到下面的执行结果:

    上面的SQL例子在执行的时候数据库系统将数据分成了下面的分组:

  • 相关阅读:
    不吐不快之EJB演练——开篇概述
    URL重写:RewriteCond指令与RewriteRule 指令格式
    刚到公司有点压力山大,在此希望有大神给点正能量
    053第449题
    选择排序---简单选择排序 堆排序
    bzoj-1492 货币兑换Cash (2)——CDQ分治
    MySQL 提高Insert性能
    Codeforces Round #313 (Div. 2) 560C Gerald's Hexagon(脑洞)
    Matlab矩阵基础
    Android 带清除功能的输入框控件EditTextWithDel
  • 原文地址:https://www.cnblogs.com/yuyu666/p/9820065.html
Copyright © 2011-2022 走看看