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

    1.数据分组

    目前为止的所有计算都是在表的所有数据或匹配特定的WHERE子句的数据上进行的,如返回供应商DLL01提供的产品数目,输入:

    SELECT COUNT(*) AS num_prods

    FROM Products

    WHERE vend_id = 'DLL01';

    输出:

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

    2.创建分组

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

    使用要点:

    1)GROUP BY子句可以包含任意数目的列,因此可以对分组进行嵌套,进行更细致的数据分组。

    2)GROUP BY子句嵌套了分组,数据将在最后指定的分组上进行汇总。

    3)GROUP BY子句中列出的每一列都必须是检索列或有效表达式,不能是聚集函数。若在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。

    4)大多数SQL实现不允许GROUP BY列带有长度可变的数据类型。

    5)除聚集计算外,SELECT语句中每一列都必须在GROUP BY子句中给出。

    6)如果分组列中包含具有NULL值的行,则NULL将作为一个分组返回。若列中有多行NULL值,将分为一组。

    7)GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

    输入:

    SELECT vend_id, COUNT(*) AS num_prods

    FROM Products

    GROUP BY vend_id;

    输出:

    GROUP BY子句指示DBMSvend_id排序并分组数据,这样对每个vend_id而不是整个表计算num_prods一次。

    3.过滤分组

    WHERE子句只能过滤指定行,要规定包括哪些分组,排除哪些分组,可以使用HAVING子句来过滤分组。HAVING支持所有的WHERE操作符。

    输入:

    SELECT cust_id, COUNT(*) AS orders

    FROM Orders

    GROUP BY cust_id

    HAVING COUNT(*) >= 2;

    输出:

    过滤了COUNT(*) >= 2(两个以上订单)的分组。

    同时使用WHEREHAVING子句:假设想进一步过滤上面的语句,使其返回过去12个月内具有两个以上订单的顾客,可增加WHERE子句,过滤出过去12个月内具有两个以上订单的顾客,然后增加HAVING子句过滤出具有两个以上订单的分组。

    为了列出具有两个以上产品且其价格大于等于4的供应商,输入:

    SELECT vend_id, COUNT(*) AS num_prods

    FROM Products

    WHERE prod_price >= 4

    GROUP BY vend_id

    HAVING COUNT(*) >= 2;

    输出:

    如果没有WHERE子句,会多检索出一行(供应商DLL01,销售4个产品,价格都在4以下)。

    输入:

    SELECT vend_id, COUNT(*) AS num_prods

    FROM Products

    GROUP BY vend_id

    HAVING COUNT(*) >= 2;

    输出:

    4.分组和排序

    ORDER BYGROUP BY

    ORDER BY

    GROUP BY

    对产生的输出排序

    对行分组,但输出可能不是分组的顺序

    任意列都可以使用(甚至非选择的列也可以使用)

    只可能使用选择列或表达式列,而且必须使用每个选择列表达式

    不一定需要

    如果与聚集函数一起使用列(表达式),则必须使用

    要保证数据正确的唯一方法是在使用GROUP BY子句的同时,应该也给出ORDER BY子句,不能依赖于GROUP BY排序数据。

    为了检索包含三个或更多物品的订单号和订购物品的数目,输入:

    SELECT order_num, COUNT(*) AS items

    FROM OrderItems

    GROUP BY order_num

    HAVING COUNT(*) >= 3;

    输出:

    要按订购物品的数目排序输入,需要添加ORDER BY子句,输入:

    SELECT order_num, COUNT(*) AS items

    FROM OrderItems

    GROUP BY order_num

    HAVING COUNT(*) >= 3

    ORDER BY items, order_num;

    输出:

    必须提供明确的ORDER BY子句,即使其效果等同于GROUP BY子句。

    5.SELECT子句顺序

    子句

    说明

    是否必须使用

    SELECT

    要返回的列或表达式

    FROM

    从中检索数据的表

    仅从表选择数据时使用

    WHERE

    行级过滤

    GROUP BY

    分组说明

    仅在按组进行聚集计算时使用

    HAVING

    组级过滤

    ORDER BY

    输出顺序排序

  • 相关阅读:
    HDU 5059 Help him
    HDU 5058 So easy
    HDU 5056 Boring count
    HDU 5055 Bob and math problem
    HDU 5054 Alice and Bob
    HDU 5019 Revenge of GCD
    HDU 5018 Revenge of Fibonacci
    HDU 1556 Color the ball
    CodeForces 702D Road to Post Office
    CodeForces 702C Cellular Network
  • 原文地址:https://www.cnblogs.com/Sumomo0516/p/6131529.html
Copyright © 2011-2022 走看看