MySQL必知必会--分 组 数 据
数据分组
目前为止的所有计算都是在表的所有数据或匹配特定的 WHERE 子句的
数据上进行的。提示一下,下面的例子返回供应商 1003 提供的产品数目

但如果要返回每个供应商提供的产品数目怎么办?或者返回只提供
单项产品的供应商所提供的产品,或返回提供10个以上产品的供应商怎
么办?
这就是分组显身手的时候了。分组允许把数据分为多个逻辑组,以
便能对每个组进行聚集计算
创建分组
分组是在 SELECT 语句的 GROUP BY 子句中建立的。理解分组的最好办
法是看一个例子

上面的 SELECT 语句指定了两个列, vend_id 包含产品供应商的ID,
num_prods 为计算字段(用 COUNT(*) 函数建立)。 GROUP BY 子句指
示MySQL按 vend_id 排序并分组数据。这导致对每个 vend_id 而不是整个表
计算 num_prods 一次。从输出中可以看到,供应商 1001 有 3 个产品,供应商
1002 有 2 个产品,供应商 1003 有 7 个产品,而供应商 1005 有 2 个产品
因为使用了 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 关键字,可以得到每个分组以
及每个分组汇总级别(针对每个分组)的值,如下所示

过滤分组
除了能用 GROUP BY 分组数据外,MySQL还允许过滤分组,规定包括
哪些分组,排除哪些分组。例如,可能想要列出至少有两个订单的所有
顾客。为得出这种数据,必须基于完整的分组而不是个别的行进行过滤
HAVING 非常类似于 WHERE 。事实上,目前为止所
学过的所有类型的 WHERE 子句都可以用 HAVING 来替代。唯一的差别是
WHERE 过滤行,而 HAVING 过滤分组
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 之间的差异。
MySQL必知必会--分 组 数 据的更多相关文章
- 《MySQL必知必会》[01] 基本查询
<MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...
- 《MySQL必知必会》整理
目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...
- MySQL必知必会1-20章读书笔记
MySQL备忘 目录 目录 使用MySQL 检索数据 排序检索数据 过滤数据 数据过滤 用通配符进行过滤 用正则表达式进行搜索 创建计算字段 使用数据处理函数 数值处理函数 汇总数据 分组数据 使用子 ...
- 【MySQL 基础】MySQL必知必会
MySQL必知必会 简介 <MySQL必知必会>的学习笔记和总结. 书籍链接 了解SQL 数据库基础 什么是数据库 数据库(database):保存有组织的数据的容器(通常是一个文 件或一 ...
- mysql必知必会系列(一)
mysql必知必会系列是本人在读<mysql必知必会>中的笔记,方便自己以后查看. MySQL. Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据 ...
- mysql必知必会
春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...
- MySQL必知必会(第4版)整理笔记
参考书籍: BookName:<SQL必知必会(第4版)> BookName:<Mysql必知必会(第4版)> Author: Ben Forta 说明:本书学习笔记 1.了解 ...
- 《mysql 必知必会》 速查指南
目录 增 添加一整行 插入多行 删 删除指定行 删除所有行 改 查 简单检索 结果筛选 结果排序 结果过滤 创建字段 处理函数 数据分组 其他高级用法 文章内容均出自 <MySQL 必知必会&g ...
- mysql必知必会——GROUP BY和HAVING
mysql必知必会——GROUP BY和HAVING 创建表结构 create table `employ_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, ...
- 《MySQL 必知必会》读书总结
这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...
随机推荐
- window和 linux 在一起 ios和 android在一起 net和js在一起
step 1: Windows 10 的 Linux Bash 支持「并不是使用虚拟机/模拟器」实现的,而是嵌入一个完整的 Ubuntu Linux 环境.技术上是实时将 Linux 的系统调用转换为 ...
- Linux网络文件共享服务之smaba
一.SAMBA服务简介 samba是1991年由Andrew Tridgel开发实现,主要用于Windows和unix文件共享.samba实现了共享文件和打印,实现在线编辑,登录SAMBA用户的身份认 ...
- UML--->活动图梳理
活动图梳理 活动图 概述 活动图是UML用于对系统的动态行为建模的另一种常用工具,它描述活动的顺序,展现从一个活动到另一个活动的控制流,常常用于描述业务过程和并行处理过程,活动图在本质上是一种流程图. ...
- mysql--->MySQL错误日志
MySQL错误日志 简介 MySQL错误日志是记录MySQL 运行过程中较为严重的警告和错误信息,以及MySQL每次启动和关闭的详细信息.错误日志的命名通常为hostname.err.其中,hostn ...
- IDEA启动报错Plugin Error Problems found loading plugins的解决办法
错误描述 今天启动项目时发现IDEA控制台出错,tomcat的标志变成问号,启动不了服务器 Problems found loading plugins: Plugin "Persisten ...
- sass css样式:@for循环、样式变量与#{} 变量插值
/* sass 可以用写JS的思想来写CSS代码 * #{} 用来插值,大括号中填写需要插入的变量 * @for 变量 from ...
- 原生Ajax发送get、post请求每一步
说明 发送Ajax的请求的核心对象是XMLHttpRequest,因此我们需要了解该对象的相关属性和方法 方法(图一) 属性(图二) 第一步:创建 XMLHttpRequest对象,下面都简写为 xh ...
- Linux防火墙之iptables扩展处理动作
前文我们讲了iptables的扩展匹配,一些常用的扩展模块以及它的专有选项的使用和说明,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12285152.html ...
- oracle的锁种类知识普及
锁概念基础 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性. 加 ...
- HDU_1506_单调栈
http://acm.hdu.edu.cn/showproblem.php?pid=1506 从栈底到栈顶从小到大排序,碰到比栈定小的元素,出栈处理,直到栈顶比元素小或者栈为空. 数组最后多加了个-1 ...