数据分组

目前为止的所有计算都是在表的所有数据或匹配特定的 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必知必会--分 组 数 据的更多相关文章

  1. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  2. 《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 ...

  3. MySQL必知必会1-20章读书笔记

    MySQL备忘 目录 目录 使用MySQL 检索数据 排序检索数据 过滤数据 数据过滤 用通配符进行过滤 用正则表达式进行搜索 创建计算字段 使用数据处理函数 数值处理函数 汇总数据 分组数据 使用子 ...

  4. 【MySQL 基础】MySQL必知必会

    MySQL必知必会 简介 <MySQL必知必会>的学习笔记和总结. 书籍链接 了解SQL 数据库基础 什么是数据库 数据库(database):保存有组织的数据的容器(通常是一个文 件或一 ...

  5. mysql必知必会系列(一)

    mysql必知必会系列是本人在读<mysql必知必会>中的笔记,方便自己以后查看. MySQL. Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据 ...

  6. mysql必知必会

    春节放假没事,找了本电子书mysql必知必会敲了下.用的工具是有道笔记的markdown文档类型. 下面是根据大纲已经敲完的章节,可复制到有道笔记的查看,更美观. # 第一章 了解SQL## 什么是S ...

  7. MySQL必知必会(第4版)整理笔记

    参考书籍: BookName:<SQL必知必会(第4版)> BookName:<Mysql必知必会(第4版)> Author: Ben Forta 说明:本书学习笔记 1.了解 ...

  8. 《mysql 必知必会》 速查指南

    目录 增 添加一整行 插入多行 删 删除指定行 删除所有行 改 查 简单检索 结果筛选 结果排序 结果过滤 创建字段 处理函数 数据分组 其他高级用法 文章内容均出自 <MySQL 必知必会&g ...

  9. mysql必知必会——GROUP BY和HAVING

    mysql必知必会——GROUP BY和HAVING 创建表结构 create table `employ_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, ...

  10. 《MySQL 必知必会》读书总结

    这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...

随机推荐

  1. Python Selenium定位元素常用解决办法

       在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况(报selenium.common.exceptions.NoSuchElementException), ...

  2. 大叔 EF 来分析 EntityFrameworks.Data.Core 2

    Extensions 1DbCommand拦截器扩展DbCommandInterceptorExtensions 2Class for IQuerable extensions methods Inc ...

  3. 说实话 NuGet Package Manager 网速不是一般的慢

  4. .Net Core建站(2):EF Core+CodeFirst数据库迁移

    上一篇的话,说了下怎么使用EF7 实现 CodeFirst去生成数据库, 其实还有好多问题的,这次一点一点的解决吧,都挺简单,不过零零散散的,, 1.读取配置文件,获得链接字符串 2.使用数据库进行增 ...

  5. [ Python入门教程 ] Python中日志记录模块logging使用实例

    python中的logging模块用于记录日志.用户可以根据程序实现需要自定义日志输出位置.日志级别以及日志格式. 将日志内容输出到屏幕 一个最简单的logging模块使用样例,直接打印显示日志内容到 ...

  6. sqli_labs学习笔记(一)Less-21~Less-37

    续上,开门见山 Less-21 Cookie Injection- Error Based- complex - string ( 基于错误的复杂的字符型Cookie注入) 登录后页面 圈出来的地方显 ...

  7. 快速构建第三方api应用

    1.使用框架和扩展 详细请看composer.json "php": "^7.1.3", "laravel-admin-ext/config" ...

  8. 基于Flask框架搭建视频网站的学习日志(一)

    ------------恢复内容开始------------ 基于Flask框架搭建视频网站的学习日志(一)2020/02/01 一.Flask环境搭建 创建虚拟环境 初次搭建虚拟环境 搭建完虚拟环境 ...

  9. CSS-04-层叠选择器

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. Fibonacci Nim(斐波那契尼姆)游戏

    游戏描述: Fibonacci Nim是Nim游戏的变种,其规则为两名玩家从一堆硬币中交替移除硬币,第一步中,不允许玩家拿走所有硬币,也不允许不取,并且在每次后续移动中,移除的硬币数量最多可以是上一次 ...