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(*);
    
  • 相关阅读:
    LCA——最近公共祖先
    P1576 最小花费
    CollaQ复现
    人体姿态估计Alphapose安装
    mingw安装
    MADDPG实现
    MFMARL(Mean Field Multi-Agent Reinforcement Learning)实现
    MASK_RCNN实现
    Insightface实现
    .tar.002文件怎么解压
  • 原文地址:https://www.cnblogs.com/sanzashu/p/11011887.html
Copyright © 2011-2022 走看看