zoukankan      html  css  js  c++  java
  • 聚合函数与SQL排序

    聚合查询

    通过SQL对数据进行某种操作或计算时需要使用函数(聚合函数,将多行汇为一行)。

    常用函数(5个):
    • COUNT:计算表中的记录数(行数)
    • SUM: 计算表中数值列中数据的合计值
    • AVG: 计算表中数值列中数据的平均值
    • MAX: 计算表中数值列中数据的最大值
    • MIN: 计算表中数值列中数据的最小值
    COUNT()函数
    -- 1.计算全部行数:
    SELECT COUNT(*) FROM Product;
    
    -- 2.计算null之外的数据的行数(将对象列设为参数):
    SELECT COUNT(purchase_price) FROM Product;
    
    -- 3.将包含null的列作为参数时,count(*)和count(<列名>)的结果不一样
    SELECT COUNT(*), COUNT(purchase_price) FROM Product;
    
    SUM:计算合计值
    -- 1.计算单列合计值
    SELECT SUM(sale_price) FROM Product;
    
    -- 2.计算多列合计值
    SELECT SUM(sale_price), SUM(purchase_price) FROM Product;
    
    AVG:计算平均值
    -- 1.计算某列平均值(如果该列存在null,则会被删除后再计算)
    SELECT AVG(sale_price) FROM Product;
    
    MAX和MIN:计算最大值和最小值

    注:MAX/MIN使用于任何数据类型,只要能排序,就存在最大值和最小值

    -- 1.计算销售值的最大值和最小值
    SELECT MAX(sale_price),MIN(purchase_price) FROM Product;
    
    -- 2.计算日期的最大值和最小值
    SELECT MAX(regist_date), MIN(regist_date) FROM Product;
    

    注:MAX/MIN使用于任何数据类型,SUM/AVG只适用于数值类型的列。

    使用聚合函数删除重复值(先去除重复行,再计算; AVG也可使用)
    SELECT COUNT(DISTINCT product_type) FROM Product;
    

    分组(GROUP BY)

    -- 1.商品种类分组计算各组数量(GROUP BY指定的列被称为聚合列或分组列):
    SELECT product_type, COUNT(*)
      FROM Product
    GROUP BY product_type;
    
    -- 2.聚合键包含空值情况(空值也被当成一组):
    SELECT purchase_price, COUNT(*)
    FROM Product
    GROUP BY purchase_price;
    
    -- 3.同时使用where和GROUP BY子句
    SELECT purchase_price, COUNT(*)
    FROM Product
    WHERE product_type = '衣服'
    GROUP BY purchase_price;
    

    注:

    • 使用group by时,select子句不能出现聚合键之外的列名。
    • 使用group by时,不能使用select子句中定义的列的别名。主要是sqld的执行顺序,先执行group by再执行select。
    • 使用group by 时,不能在where子句中使用聚合函数,只有select子句和having子句及group by子句中能够使用聚合函数
      如:
    SELECT product_type, COUNT(*)
      ROM Product
    WHERE COUNT(*) = 2
    GROUP BY product_type
    > 1111 - Invalid use of group function
    > 时间: 0s
    

    为集合结果指定条件

    注:HAVING子句中能够使用三种要素:常数,聚合函数,GROUP BY子句中指定的列名(聚合建)
    HAVING子句:

    • 用having就一定要和group by连用
    • 用group by不一有having (它只是一个筛选条件用的)
     -- 1.分组,商品品种分组后结果中筛选出数据行数为2行的数据
     SELECT product_type, COUNT(*)
       FROM Product
      GROUP BY product_type
     HAVING COUNT(*) = 2;
    
     -- 2.平均数,销售价格大于2500的
    SELECT product_type, AVG(sale_price)
    	FROM Product
     GROUP BY product_type
    HAVING AVG(sale_price) >= 2500;
    

    相对于HAVING子句,更适合写再Where子句中的条件:

    • where子句 = 指定行所对应的条件
    • having子句 = 指定组所对应的条件
    • 聚合建所对应的条件不应该书写在HAVING子句中,而应书写在WHERE子句当中。
      • 虽执行结果一样,单更推荐第二种写法,将条件写在where子句中比写在having子句中的处理速度更快,返回结果时间更短。
      • 原因:聚合操作时,DBMS内部会进行排序处理,where在排序之前就对数据进行过滤,having是在排序之后在对数据进行分组。
    SELECT product_type, COUNT(*)
    	FROM Product
     GROUP BY product_type
    HAVING product_type = '衣服';
    
    SELECT product_type, COUNT(*)
    	FROM Product
    WHERE product_type = '衣服'
     GROUP BY product_type;
    

    对结果进行排序

    • 升序:ASC(不写默认)
    • 降序:DESC
      select的排序顺序是随机的,通常在句尾添加ORDER BY(排序建)子句来明确排序。
      注:子句书写顺序:select - from - where - group by - having - order by
    -- 1.销售价格升序:未指定GROUP BY子句中排列顺序默认为升序。
    	SELECT product_id, product_name, sale_price, purchase_price
    		FROM Product
    	ORDER BY sale_price;
    
    -- 2.销售价格降序(DESC关键字)
    SELECT product_id, product_name, sale_price, purchase_price
    	FROM Product
    ORDER BY sale_price DESC;
    
    -- 3.指定多个排序的键
    SELECT product_id, product_name, sale_price, purchase_price
    	FROM Product
    ORDER BY sale_price, product_id;
    

    注:1.优先使用左侧的键,如果存在相同值则使用右侧。2.排序键包含null时,会在开头或者末尾进行汇总。

    -- 4.在排序键中使用显示用的别名
    SELECT product_id AS id, product_name, sale_price AS sp, purchase_price
    	FROM Product
    ORDER BY sp, id;
    
    -- 5.ORDER BY子句可以使用聚合函数
    SELECT product_type, COUNT(*)
    	FROM Product
     GROUP BY product_type
    ORDER BY COUNT(*);
    
  • 相关阅读:
    Postman使用教程
    CAD和ArcGIS转换 矢量配准
    SAP CRM Advanced search和Simple search里Max hit表现行为的差异
    SAP CRM Product simple search的启用步骤
    如何快速定位SAP CRM订单应用(Order Application)错误消息抛出的准确位置
    如何动态修改SAP CRM WebClient UI表格栏的宽度
    如何在SAP CRM WebClient UI里创建web service并使用ABAP消费
    如何处理SAP CRM Web Service错误
    如何使用SAP CRM WebClient UI实现一个类似新浪微博的字数统计器
    如何开启SAP CRM基于WORD模板创建附件的功能
  • 原文地址:https://www.cnblogs.com/sanzashu/p/11011887.html
Copyright © 2011-2022 走看看