美文网首页
数据库学习笔记——10分组数据

数据库学习笔记——10分组数据

作者: Love零O | 来源:发表于2018-10-12 15:22 被阅读0次

    主要学习GROUP BY子句和HAVING子句

    1 数据分组

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

    2 创建分组

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

    group.jpg
    GROUP BY子句指示DBMS按 vend_id 排序并分组数据。这样就会对每个vend_id而不是整个表计算num_prods一次。
    GROUP BY子句指示DBMS分组数据,然后对每个组而不是整个结果集进行聚集。

    通过相对位置指定列
    SELECT vend_id , COUNT(*) AS num_prods FROM products GROUP BY 1

    group_1.jpg

    3 过滤分组

    目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是,WHERE过滤行,而HAVING过滤分组。HAVING支持所有的WHERE操作符。WHERE在数据分组前进行过滤,HAVING在数据后进行过滤。

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

    having.png

    例子:列出具有两个以上产品且其价格大于等于4的供应商:

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

    filter.jpg

    说明:使用HAVING和WHERE
    HAVING与WHERE非常类似,如果不指定GROUP BY,则大多数DBMS会同等对待它们。不过,使用HAVING时应该结合GROUP BY子句,而WHERE子句用于标准的行级过滤。

    4 分组和排序

    一般在使用GROUP BY子句时,应该也给出ORDER BY子句。

    例子:检索包含3个及以上物品的订单号和订购物品的数目:
    SELECT order_num,COUNT(*) AS items FROM orderitems GROUP BY order_num HAVING COUNT(*) >=3

    group_2.png
    如果按订单物品的数量排序,需要添加ORDER BY子句,如下所示:
    SELECT order_num,COUNT(*) AS items FROM orderitems GROUP BY order_num HAVING COUNT(*) >=3 ORDER BY items,order_num
    group_order.png

    ORDER BY子句还可以写成ORDER BY COUNT(*),order_num或者ORDER BY 2,1


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

    5 SELECT子句顺序

    列举目前所学的SELECT语句中使用时必须遵循的次序。

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

    相关文章

      网友评论

          本文标题:数据库学习笔记——10分组数据

          本文链接:https://www.haomeiwen.com/subject/eaubaftx.html