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

    输出顺序排序

  • 相关阅读:
    检测c/c++中内存泄露
    在一个集合S中寻找最大的C使A+B=C且A,B,C均在集合当中
    《为学》
    U盘windows无法格式化的解决办法
    java.lang.AbstractMethodError: oracle.jdbc.driver...解决方法
    sqlplus连接远程Oracle
    oracle字符集导致的乱码问题
    大端与小端存储模式详解
    《劝学》原文
    《报任安书》司马迁
  • 原文地址:https://www.cnblogs.com/Sumomo0516/p/6131529.html
Copyright © 2011-2022 走看看