SQL 4. 数据分组 - 数据分组入门

数据分组用来将数据分为多个逻辑组,从而可以对每个组进行聚合运算。

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

 

虽然GROUPT BY 子句常常和聚合函数一起使用,不过GROUP BY 子句并不是不能离开聚合函数而单独使用。虽然不使用聚合函数的

GROUP BY子句看起来影响不大,但它能够帮助我们更好地理解数据分组的原理。

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

SELECT FAge FROM T_Employee GROUP BY FAge

+------+
| fage |
+------+
|   23 |
|   25 |
|   27 |
|   28 |
|   35 |
+------+

 

这个SQL语句处理表中所有记录,并且将FAge相同的数据行放到一组,

分组后的数据可以看作一个临时的结果集,而SELECT FAge语句则取出魅族的FAge字段的值,这样我们就得到上面的员工年龄段表了。

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

22岁组,23岁组,25岁组,27岁组,28岁组。

 

 

注意:

1. 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

 

2. 需要分组的所有列都必须位于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

 

优先级:从左到右

 

+-------------+---------------+
| fsubcompany | fdepartment   |
+-------------+---------------+
| Beijing     | Development   |
| Beijing     | HumanResource |
| Beijing     | InfoTech      |
| Beijing     | Sales         |
| ShenZhen    | Development   |
| ShenZhen    | InfoTech      |
+-------------+---------------+

 

分组情况:

1. Beijing

 1)Development  

 2)HumanResource

 3)InfoTech     

 4)Sales        

2. ShenZhen   

 1)Development 

 2) InfoTech   

 

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值