MySQL必知必会--分 组 数 据

数据分组

目前为止的全部计算都是在表的全部数据或匹配特定的 WHERE 子句的
数据上进行的。提示一下,下面的例子返回供应商 1003 提供的产品数目函数

但若是要返回每一个供应商提供的产品数目怎么办?或者返回只提供
单项产品的供应商所提供的产品,或返回提供10个以上产品的供应商怎
么办?
这就是分组显身手的时候了。分组容许把数据分为多个逻辑组,以
便能对每一个组进行汇集计算学习

建立分组

分组是在 SELECT 语句的 GROUP BY 子句中创建的。理解分组的最好办
法是看一个例子3d


上面的 SELECT 语句指定了两个列, vend_id 包含产品供应商的ID,
num_prods 为计算字段(用 COUNT(*) 函数创建)。 GROUP BY 子句指
示MySQL按 vend_id 排序并分组数据。这致使对每一个 vend_id 而不是整个表
计算 num_prods 一次。从输出中能够看到,供应商 1001 有 3 个产品,供应商
1002 有 2 个产品,供应商 1003 有 7 个产品,而供应商 1005 有 2 个产品blog

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

在具体使用 GROUP BY 子句前,须要知道一些重要的规定。产品

  • GROUP BY 子句能够包含任意数目的列。这使得能对分组进行嵌套,
    为数据分组提供更细致的控制。
  • 若是在 GROUP BY 子句中嵌套了分组,数据将在最后规定的分组上
    进行汇总。换句话说,在创建分组时,指定的全部列都一块儿计算
    (因此不能从个别的列取回数据)。
  • GROUP BY 子句中列出的每一个列都必须是检索列或有效的表达式
    (但不能是汇集函数)。若是在 SELECT 中使用表达式,则必须在
    GROUP BY 子句中指定相同的表达式。不能使用别名。
  • 除汇集计算语句外, SELECT 语句中的每一个列都必须在 GROUP BY 子
    句中给出。
  • 若是分组列中具备 NULL 值,则 NULL 将做为一个分组返回。若是列
    中有多行 NULL 值,它们将分为一组。
  • GROUP BY 子句必须出如今 WHERE 子句以后, ORDER BY 子句以前。

使用 ROLLUP 使用 WITH ROLLUP 关键字,能够获得每一个分组以
及每一个分组汇总级别(针对每一个分组)的值,以下所示select

过滤分组

除了能用 GROUP BY 分组数据外,MySQL还容许过滤分组,规定包括
哪些分组,排除哪些分组。例如,可能想要列出至少有两个订单的全部
顾客。为得出这种数据,必须基于完整的分组而不是个别的行进行过滤方法

HAVING 很是相似于 WHERE 。事实上,目前为止所
学过的全部类型的 WHERE 子句均可以用 HAVING 来替代。惟一的差异是
WHERE 过滤行,而 HAVING 过滤分组im

HAVING 支持全部 WHERE 操做符 在第6章和第7章中,咱们学习
了 WHERE 子句的条件(包括通配符条件和带多个操做符的子
句)。所学过的有关 WHERE 的全部这些技术和选项都适用于
HAVING 。它们的句法是相同的,只是关键字有差异技术

这条 SELECT 语句的前3行相似于上面的语句。最后一行增长了
HAVING 子句,它过滤 COUNT(*) >=2 (两个以上的订单)的那些
分组。
正如所见,这里 WHERE 子句不起做用,由于过滤是基于分组汇集值而
不是特定行值的

HAVING 和 WHERE 的差异 这里有另外一种理解方法, WHERE 在数据
分组前进行过滤, HAVING 在数据分组后进行过滤。这是一个重
要的区别, WHERE 排除的行不包括在分组中。这可能会改变计
算值,从而影响 HAVING 子句中基于这些值过滤掉的分组

那么,有没有在一条语句中同时使用 WHERE 和 HAVING 子句的须要呢?
事实上,确实有。假如想进一步过滤上面的语句,使它返回过去12个月
内具备两个以上订单的顾客。为达到这一点,可增长一条 WHERE 子句,过
滤出过去12个月内下过的订单。而后再增长 HAVING 子句过滤出具备两个
以上订单的分组
为更好地理解,请看下面的例子,它列出具备 2 个(含)以上、价格
为 10 (含)以上的产品的供应商

分组和排序

虽然 GROUP BY 和 ORDER BY 常常完成相同的工做,但它们是很是不一样
的。表13-1汇总了它们之间的差异

表13-1中列出的第一项差异极为重要。咱们常常发现用 GROUP BY 分
组的数据确实是以分组顺序输出的。但状况并不老是这样,它并非SQL
规范所要求的。此外,用户也可能会要求以不一样于分组的顺序排序。仅
由于你以某种方式分组数据(得到特定的分组汇集值),并不表示你须要
以相同的方式排序输出。应该提供明确的 ORDER BY 子句,即便其效果等
同于 GROUP BY 子句也是如此

不要忘记 ORDER BY 通常在使用 GROUP BY 子句时,应该也给
出 ORDER BY 子句。这是保证数据正确排序的惟一方法。千万
不要仅依赖 GROUP BY 排序数据

检索总计订单价格大于等于 50 的订
单的订单号和总计订单价格

SELECT子句顺序

下面回顾一下 SELECT 语句中子句的顺序。表13-2以在 SELECT 语句中
使用时必须遵循的次序,列出迄今为止所学过的子句

咱们学习了如何用SQL汇集函数对数据进行汇总计算。 本章讲授了如何使用 GROUP BY 子句对数据组进行这些汇总计算,返回每 个组的结果。咱们看到了如何使用 HAVING 子句过滤特定的组,还知道了 ORDER BY 和 GROUP BY 之间以及 WHERE 和 HAVING 之间的差别。

相关文章
相关标签/搜索