zoukankan      html  css  js  c++  java
  • 第10课 分组数据

    第10课 分组数据

    10.1 数据分组

    使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。

    10.2 创建分组

    分组是使用SELECT语句的GROUP BY子句建立的。

    SELECT vend_id, COUNT(*) AS num_prods
    FROM Products
    GROUP BY vend_id;
    

    这就会对每个vend_id而不是整个表计算num_prods一次。

    GROUP BY子句指示DBMS分组数据,然后对每个组而不是整个结果集进行聚集。

    10.3 过滤分组

    WHERE过滤行,而HAVING过滤分组。

    SELECT cust_id, COUNT(*) AS orders
    FROM Orders
    GROUP BY cust_id
    HAVING COUNT(*) >= 2;
    

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

    SELECT vend_id, COUNT(*) AS num_prods
    FROM Products
    WHERE prod_price >= 4
    GROUP BY vend_id
    HAVING COUNT(*) >= 2;
    

    WHERE子句过滤所有prod_price至少为4的行,然后按vend_id分组数据,HAVING子句过滤计数为2或2以上的分组。

    10.4 分组和排序

    GROUP BY和ORDER BY经常完成相同的工作,但它们非常不同,理解这一点很重要。

    ORDER BY GROUP BY
    对产生的输出排序 对行分组,但输出可能不是分组的顺序
    任意列都可以使用(甚至非选择的列也可以使用) 只可能使用选择列或表达式列,而且必须使用每个选择列表达式
    不一定需要 如果与聚集函数一起使用列(或表达式),则必须使用

    要按订购物品的数目排序输出,需要添加ORDER BY子句,如下所示:

    SELECT order_num, COUNT(*) AS items
    FROM OrderItems
    GROUP BY order_num
    HAVING COUNT(*) >= 3
    ORDER BY items, order_num;
    

    在这个例子中,使用GROUP BY子句按订单号(order_num列)分组数据,以便COUNT(*)函数能够返回每个订单中的物品数目。HAVING子句过滤数据,使得只返回包含三个或更多物品的订单。最后,用ORDER BY子句排序输出。

    10.5 SELECT子句顺序

    在SELECT语句中使用时必须遵循的次序,列出迄今为止所学过的子句。

    子  句 说  明 是否必须使用
    SELECT 要返回的列或表达式
    FROM 从中检索数据的表 仅在从表选择数据时使用
    WHERE 行级过滤
    GROUP BY 分组说明 仅在按组计算聚集时使用
    HAVING 组级过滤
    ORDER BY 输出排序顺序

    10.6 小结

    我们看到了如何使用HAVING子句过滤特定的组,还知道了ORDER BY和GROUP BY之间以及WHERE和HAVING之间的差异。

  • 相关阅读:
    线程的简单介绍
    队列Joinablequeue的使用,以及生产者消费者模型的认识
    使用子线程来完成链接循环和通信循环
    使用socketserver实现简单的下载和上传
    类的绑定方法学习
    类的组合-多态-封装等特性的简单学习
    爬虫之亚马逊爬取
    JavaScript 面试中常见算法问题详解
    JavaScript 的 this 指向问题深度解析
    深入理解 JavaScript 中的函数
  • 原文地址:https://www.cnblogs.com/zhangsonghui/p/13210760.html
Copyright © 2011-2022 走看看