MySQL数据库——分组数据

上一节我们说到,SQL聚集函数可以用来汇总数据。这使我们能够对 行 进行计数 ,计算和 与 平均值 ,获得 最大 和 最小 值 而不用检索所有数据!

到目前来说,我们的所有数据都要匹配WHERE子句的数据 基础上来进行。 例如 我们要返回 id 为 5 的行 where users_id = 5 但是,如果要返回年纪为15的行的 代码作品,或者返回具有10个以上作品的 行(程序员) 怎么办?

这时候就能用上分组了,分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。

part 1 创建分组
分组实在SELECT语句的GROUP BY子句中建立的。
看一个例子:

SELECT users.user_id,COUNT(*) AS ID FROM users GROUP BY users.user_id;

上面的SQL语句将会返回 user_id出现的次数 ,GROUP BY子句指示MySQL按user_id 排序并分组数据 。这导致每个user_id而不是整个表计算 ID 一次。

因为使用了GROUP BY,就不必指定要计算和估值的每个组了。系统会自动完成。GROUP BY 子句 指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。

GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。

如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都在一起计算。

GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能使聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式,不能使用别名。

GROUP BY 子句必须出现在WHERE子句之后,ORDER BY 子句之前!

part 2 过滤分组

我们知道在WHERE子句中可以完成过滤数据的作用,同样,我们的分组也能完成,过滤分组。 但是需要注意的是,我们这里使用的是HAVING而不是WHERE。为什么呢?因为WHERE过滤 针对的是行 而不是分组 ,但是 HAVING 支持行 也支持分组。所学过有关WHERE 的所有技术和 选项 都适用与 HAVING 。 看下面的例子:

SELECT code_id,COUNT(*) AS NUM FROM coder GROUP BY CODER.code_id HAVING COUNT(*) >=2;

上面的语句将会检索 code_id 和所有的行数 并且以code_id进行分组,这样不同的code_id就会有不同的行数,相同的code_id行数就会加一 然后用 HAVING 对分组中 累计行数 达标的 行 进行过滤,筛选出来。

part 3 分组和排序

聪明的你可能已经发现了,GROUP BY 和 ORDER BY 经常完成相同的工作,但是他们是非常不同的!

他们之间存在一个非常重要的差别!ORDER BY 排序产生的输出;GROUP BY 是分组行!但输出可能不是分组的顺序

我们完全可以在分组,然后过滤,之后,在加上ORDER BY 子句 !

猜你喜欢

转载自blog.csdn.net/qq_36120793/article/details/78836949