1、数据分组入门

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

虽然GROUP BY子句常常和聚合函数起使用,不过GROUP BY子句并不是不能离开聚合函数而单独使用的。虽然不使用聚合函数的GROUP BY子句看起来影响不大,但它能够帮助我们更好地理解数据分组的原理。

2、数据分组

2.1 准备测试数据

create table t_employee (
number varchar(20),
`name` varchar(20),
age int,
salary  decimal(10,2),
subcompany varchar(20),
department varchar(20),
primary key(number)
);
insert into t_employee (number,`name`,age,salary,subcompany,department) values ('dev001','tom',25,5000,'shengzhen','Development');
insert into t_employee (number,`name`,age,salary,subcompany,department) values ('dev002','adam',25,5000,'shengzhen','Development');
insert into t_employee (number,`name`,age,salary,subcompany,department) values ('sales001','bill',27,8000,'shanghai','Sales');
insert into t_employee (number,`name`,age,salary,subcompany,department) values ('sales002','billy',27,8000,'shanghai','Sales');
insert into t_employee (number,`name`,age,salary,subcompany,department) values ('sales003','bob',27,8000,'shanghai','Sales');
insert into t_employee (number,`name`,age,salary,subcompany,department) values ('hr001','brad',30,9000,'beijing','HumanResource');
insert into t_employee (number,`name`,age,salary,subcompany,department) values ('hr002','brant',30,9000,'beijing','HumanResource');
insert into t_employee (number,`name`,age,salary,subcompany,department) values ('it001','brown',35,4000,'hangzhou','InfoTech');

2.2 数据分组

select age from t_employee group by age;

1.png

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

2.3 数据分组与行记录的区别

上图所示,看似是行,其实是逻辑分组,虽然两者在外观显示上是一致的,但是要特别注意两者的区别。数据分组有以下三大特点。

3、数据分组特点一:分组与聚合函数

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

SELECT age, salary FROM t_employee GROUP BY age;

道理非常简单,采用分组以后的查询结果集是以分组形式提供的,由于每组中人员的工资都不样,所以就不存在能够统代表本组工资水平的salary字段了,所以上面的SQL语句是错误的。不过每组中员工的平均工资却能够统一代表本组工水平,所以可以对Salary使用聚合函数,下面的SQL语句则是正确的:

SELECT age, AVG(salary) FROM t_Employee GROUP BY age;

4、数据分组特点二:多级数据分组

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

SELECT subcompany, department FROM t_employee GROUP BY subcompany, department;

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

2.png

5、数据分组特点三:数据分组过滤使用HAVING语句

有的时候需要对部分分组进行过滤,比如只检索人数大于1的年龄段,有的开发人员会使用下面的SQL语句:

SELECT age,count(*) FROM t_employee GROUP BY age where count(*) > 1 ;

在数据库系统中执行上面的SQL语句时,数据库系统会提示语法错误。这是因为聚合函数不能在WHERE语句中使用,必须使用HAVING子句来代替,比如:

SELECT age,count(*) FROM t_employee GROUP BY age having count(*) > 1 ;

标签: none

添加新评论