• 第十三章 分组数据


    学习目的:
    了解如何分组数据,以便能汇总表内容的子集。GROUP BY 和HAVING的使用。
     
    数据分组:
    分组允许把数据分成多个逻辑组,以便能对每个组进行聚集计算。
     
    创建分组:
    分组是在SELECT语句的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 子句之前。
     Q:检索每个供应商的产品数目?
    SELECT vend_id, COUNT(*) AS num_prods
    FROM products
    GROUP BY vend_id;
     
    使用WITH ROLLUP关键字,可以得到每个分组以及每个分组汇总级别的值。
    SELECT vend_id,COUNT(*) AS num_prod
    FROM products
    GROUP BY vend_id WITH ROLLUP;
     
    过滤分组:
    除了能用GROUP BY 分组数据外,MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组。MySQL为对组进行过滤提供了另外的子句HAVING。
    HAVING和WHERE非常类似,唯一差别是WHERE过滤行(WHERE没有组的概念),而HAVING过滤分组。
     
    Q:列出具有2个(含)以上,价格为10(含)以上的产品的供应商。
    SELECT vend_id, COUNT(*) AS num_prods
    FROM products
    WHERE prod_price >= 10
    GROUP BY vend_id
    HAVING COUNT(*) >= 2;
     
    分组和排序:
    ORDER BY 和GROUP BY 的区别
    ORDER BY
    GROUP BY
    排序产生的输出
    任意列都可以使用(甚至非选择的列也可以使用)
    不一定需要
    分组行。但输出可能不是分组的顺序
    只可能使用选择列或表达式,而且必须使用每个选择列表达式
    如果与聚集函数一起使用列(表达式),则必须使用
    Q:检索总计订单价格大于50的订单的订单号和总计订单价格按照降序排列。
    SELECT order_num, SUM(quantity*item_price) AS total_price
    FROM orderitems
    GROUP BY order_num
    HAVING SUM(quantity*item_price) >= 50
    ORDER BY total_price DESC;
     
    SELECT 子句顺序:
    子句
    说明
    是否必须使用
    SELECT
    要返回的列或表达式
    FROM
    从中检索数据的表
    仅在从表选择数据时使用
    WHERE
    行级过滤
    GROUP BY
    分组说明
    仅在按组计算聚集时使用
    HAVING
    组级过滤
    ORDER BY
    输出排序顺序
    LIMIT
    要检索的行数
     
     

  • 相关阅读:
    “终身幼儿园”:学习是一个创造的过程
    我对ERP实质的理解(陈启申)
    Java学习记录1java并发编程之synchronized初学
    谈谈你对Spring的理解
    java中的==与equals的区别
    Windows下编译安装perl Module
    win系统用virtualBox安装Ubuntu虚拟机,如何共享数据
    Windows下emacsw3m设置代理
    自我介绍
    document 对象
  • 原文地址:https://www.cnblogs.com/mumulin99/p/9838367.html
Copyright © 2020-2023  润新知