group by 深入总结

一、不兼容的语法问题。

先看使用如下sql:SELECT count(*),town FROM `players` 结果会报错。从这里涉及到sql的一个原则:值的集合与一个行mysql认为是不兼容的。这里,count(*)的结果是一个值。而town列出的结果是很多行,也就是值组成的集合。所以,两者不不兼容的。

而如果加上group by,就不一样了,如下:

SELECT count(*),town FROM `players` group by sex

上面的sql,并没有报错。因为使用了group by子句后,count(*),town所显示的结果不一样了。count((*)是根据group by子句的要求进行聚合,结果是值组成的集合。右边显示对应的城市(虽然不一定正确和得出子句想要的结果,但语法上通过的)。最后,sql所表示的实际意思是:统计出每个性别所对应多少行。

二、更好地理解group by的内部机制



假如语句是 SELECT sex,name FROM `players` GROUP BY sex
结果如下:
name     sex
王滔  "空值"     
刘惠   女
王小明 男


假如语句是 SELECT name FROM `players` GROUP BY sex

结果如下:
 name
王滔
刘惠
王小明

假如语句是 SELECT sex FROM `players` GROUP BY sex,
结果就是:
 sex
"空值"




理解:group by的原理是将其指定列的值一致的行归为一组。那么,空值也归为一组。
实质上,使用了group by,上面三个sql语句原理是一样的,只是select子句告诉mysql需要的取出的列有不同

SELECT sex FROM `players` GROUP BY sex 与 SELECT sex,name FROM `players` GROUP BY sex没什么区别。
因为group by已经指定了操作方式,select需要显示行的那些列,随时指定。可以理解早就按照group by的要求将所有行就已经分组好了,之后根据需要取每行的哪一列的值了。

通俗理解group by:根据group by指定的列,列值如果相同行划分到一组中去。

一直认为,使用group by显示最后的结果应该是下面这样的:
字段值   a组
字段值   a组
字段值   b组
字段值   b组

实际情况却不是这样

先看测试的一个例子

group by指定一个字段:SELECT * FROM `fanwe_goods` GROUP BY cate_id
大致结果显示类似:
cate_id 其他字段....
40       ....
41       ....
46       ....
48       ....

说明,根据类别cate_id进行分组。结果,每个类只显示了一行数据。

group by指定多个字段:SELECT * FROM `fanwe_goods` GROUP BY cate_i,city_id

结果是将多行取出来了(整个表的所有行没有取出)。结果类似:
cate_id   city_id
40     16
40     20
41     16
41     20
还有一些行和其他字段的值省略了
看cate_id和city_id的值,都有重复的值。不知道怎么计算的,取出的结果还是有意外。

结论:
1.group by 后面指定的列不止一个。当我使用如下语句时,也出现了多行的结果(将该组的所有行都列出来了):
SELECT * FROM players GROUP BY sex, town

2.假如group by 后面只指定了一列,那么即使一个组有多行值。也不会全部取出,只取出一个。这样的情况,是什么原因?
3.分组后,如果select子句想取出某个字段,那么它不可能将都属于a组的记录都取出来。只是从a组中取出一个代表性的值出来。不知道原因,大概是:已经按照group by的规则进行分组后,如果想取出所有

数据,mysql变得无所适从。group by只有在需要进行统计的的时候非常有效。






使用经验:group by常常跟聚合函数count进行使用,这样实现按照分组进行统计的效果。比如:需要统计每个地方的商品数量。那么就按照地方进行分组(同一个地方的先划到一组中),之后使用统计函数,就

是针对组的成员进行统计了。

进行分组之后的好处,是方便按组别进行统计,并不能实现像上面效果(按组别显示出所有行)。如果不是需要进行统计,使用group by,我认为就没有实际意义,因为此时取出的结果比较意外,并不是自己想

要的。也得不到如下结果:
字段值   a组
字段值   a组
字段值   b组
字段值   b组
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 SQL 查询语言中,`COUNT` 和 `GROUP BY` 是两个非常重要的功能,它们用于处理大量数据时的数据分析和组织。 ### COUNT 函数 `COUNT` 函数主要用于计数。它可以用于统计各种类型的数量,包括但不限于记录总数、特定的非空值数量等。 #### `COUNT(*)` 这个是最常用的 `COUNT` 形式,它计算表中的总数,无论中有多少个NULL值都会被计算在内。 #### `COUNT(column)` 这个形式计算指定中有有效值的数,忽略NULL值。 #### 示例 假设有一张名为 `employees` 的表格,包含了员工信息: | employee_id | name | department | |--|--------------|------------| | 1 | Alice | HR | | 2 | Bob | Sales | | 3 | Charlie | IT | | 4 | David | HR | | NULL | Jane | NULL | 查询员工总数(包括有NULL值的记录): ```sql SELECT COUNT(*) FROM employees; ``` 查询部门“HR”的员工数: ```sql SELECT COUNT(department) FROM employees WHERE department = 'HR'; ``` ### GROUP BY 子句 `GROUP BY` 子句用于将查询结果按照某些的值分组,这样就可以对每组的结果进计算汇总,如求和、平均值、最大值、最小值等。 #### 示例 继续上面的 `employees` 表格例子,我们可以按部门统计员工总数: ```sql SELECT department, COUNT(employee_id) as num_employees FROM employees GROUP BY department; ``` 这里的结果将会显示出各个部门的员工人数,对于有NULL值的部门记录,NULL会被当作一个有效的部门进计数。 #### 组合使用 COUNT 和 GROUP BY 同时使用 `COUNT` 和 `GROUP BY` 来统计特定条件下的记录数量: ```sql SELECT department, COUNT(*) FROM employees GROUP BY department; ``` 这将会给出各部门的总记录数。 ### 总结 `COUNT` 和 `GROUP BY` 是 SQL 中非常强大的工具,它们共同作用可以帮助你快速地理解数据的基本情况,并进深入的数据分析。通过适当的组合使用这两个功能,你可以有效地解决各种数据分析需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值