zoukankan      html  css  js  c++  java
  • SQL总结(四)

    分组数据

    之前我们的处理都是针对表的所有数据或者通过WHERE限定的数据,现在我们需要只针对一部分数据(具有某一共同特征)进行处理。
    使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。GROUP BY子句 和HAVING子句。

    创建分组

    GROUP BY子句。
    SELECT vend_id,COUNT(*) AS num_prods FROM Products GROUP BY vend_id; 按照vend_id分组,然后在每个组中查找id和num_prods,具体输出每个供应商的产品数。
    注意:
    GROUP BY 可以包含任意数目的列,因此可以嵌套;更细致的分组,即组内组
    如果嵌套了分组,数据将在最后指定的分组上进行汇总,即在最后的组内进行SELECT;
    GROUP BY子句中列出的每一列都必须是检索列或者有效的表达式,如果SELECT使用表达式,那么GROUP BY 子句中必须使用相同的表达式;
    大多数SQL不允许GROUP BY使用长度可变的数据类型,如文本或者备注型字段;
    除聚集计算语句外,SELECT语句中的每一列必须都在GROUP BY子句中列出,见之前例子中的vend_id,但是COUNT(*)没有在GROUP BY中列出;
    如果分组列中含有NULL值的行,那么NULL将作为一个分组列出;
    GROUP BY必须出现在WHERE字句之后,ORDER BY之前。

    过滤分组

    HAVING子句,注意WHERE不能实现类似功能,因为WHERE过滤指定的是行而不是分组。
    目前所有WHERE都可以使用HAVING来替代。
    SELECT vend_id,COUNT(*) AS orders FROM Orders GROUP BY cust_id HAVING COUNT(*)>=2;先分组,然后取每个组中计数大于等于2的相关数据。
    SELECT vend_id,COUNT(*) AS orders FROM Orders WHERE prod_price >=4 GROUP BY cust_id HAVING COUNT(*)>=2;列出具有两个以上产品且其价格大于等于4的供应商。在这里先进行WHERE过滤,然后HAVING过滤计数为2及以上的分组。
    使用HAVING应结合使用GROUP BY。

    分组和排序

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

    使用子查询

    解释:就是将前一个查询的结果作为第二个查询的输入
    SELECT cust_id FROM Orders WHERE order_nums IN (SELECT order_num FROM OrderItems WHERE prod_id='RGAN01');将括号内的输出作为外层SELECT的输入(限定条件)。在SELECT语句中,子查询总是自内向外处理的。
    作为子查询的SELECT语句只能查询单个列,企图检索多个列将返回错误。

  • 相关阅读:
    JAVA基础:JAVA代码编写的30条建议
    Oracle学习之三 程序控制结构
    ExtJs 常用代码片段(7.30更新)
    ExtJs4 之数据模型
    .NET 大杂烩
    .NET 导出Excel
    Javascript实现IE直接打印
    C# Timer用法及实例
    AjaxPro实现无刷新多级联动实例
    VB6.0输入文本写进UTF8格式的文本文件
  • 原文地址:https://www.cnblogs.com/rayshaw/p/9029327.html
Copyright © 2011-2022 走看看