zoukankan      html  css  js  c++  java
  • 3、聚合与排序

    3-1:对表进行聚合查询

      1、使用聚合函数对表中的列进行合计值或者平均值等等合计操作

      2、聚合函数会对NULL以外的对象进行合计,但是COUNT(*)函数可以查出包含NULL的内的全部数据行数

      3、使用DISTINCT关键字删除重复值

    3-1-1:聚合函数

      COUNT:计算表中的记录数(行数)

      SUM:计算表中的数值列的数据合计值

      AVG:计算表中的数值列的数据平均值

      MAX:求出表中任意列中数据的最大值

      MIN:求出表中任意列中数据的最小值

    -- 计算全部数据行数
    SELECT COUNT(*)
    FROM Shohin;

    3-1-2:计算NULL以外数据的行数

    -- 计算shiire_tanka列中(进货单价)中非空行数
    SELECT COUNT(shiire_tanka)
    FROM Shohin;

      法则3-1:COUNT函数的结果根据参数的不同而不同,COUNT(*)会得到包含NULL的数据行数,而COUNT(<列名>)会得到NULL之外的数据行数。

    3-1-3:计算合值

    -- 销售单价的合计值
    SELECT SUM(hanbai_tanka)
    FROM Shohin;

      法则3-2:聚合函数会将NULL排除在外,但COUNT(*)例外,并不会排除NULL。

    3-1-3:计算平均值

    SELECT AVG(hanbai_tanka)
    FROM Shohin;

    3-1-3:计算最大值和最小值

    -- 计算销售单价最大值和进货单价的最小值
    SELECT MAX(hanbai_tanka), MIN(shiire_tanka)
    FROM Shohin;

      法则3-3:MAX/MIN函数几乎适用于所有数据类型的列,SUM/AVG函数只适用于数值类型的列。

    3-1-4:使用聚合函数删除重复值(关键字DISTINCT)

    SELECT COUNT(shohin_bunrui), COUNT(DISTINCT shohin_bunrui)
    FROM Shohin;

      法则3-4:计算值种类,可以在聚合函数参数前使用DISTINCT关键字,进行去重。

    3-2:对表进行分组

      1、使用GROUP BY子句可以对数据进行分割再聚合

      2、聚合中包含NULL时,在结果中会以“不确定”行(空行)的形式表现出来

      3、使用聚合函数和GROUP BY子句时需要注意以下4点:

        (1)只能写在SELECT子句中

        (2)GROUP BY子句中不能使用SELECT子句中列的别名

        (3)GROUP BY子句的聚合结果是无序的

        (4)WHERE子句中不能使用聚合函数

    3-2-1:GROUP BY子句

      语法3-1:使用GROUP BY子句进行聚合

           SELECT <列名1>,<列名2>,<列名3>,....

           FROM <表名>

           GROUP BY <列名1>,<列名2>,<列名3>,....;

    -- 按商品种类统计数据行数
    SELECT shohin_bunrui, COUNT(*) -- COUNT(shohin_bunrui)
    FROM Shohin
    GROUP BY shohin_bunrui;

      法则3-5:GROUP BY子句要写在最后。

    3-2-2:聚合中包含NULL的情况

    -- 按照进货碟单价统计数据行数
    SELECT shiire_tanka, COUNT(*) -- COUNT(shiire_tanka)
    FROM Shohin
    GROUP BY shiire_tanka;

      法则3-6:聚合键中包含NULL时,结果中会以“不确定”行(空行)的形式表现出来。

    3-2-3:使用WHERE子句时GROUP BY的执行结果

      语法3-2:使用WHERE子句和GROUP BY子句进行聚合

           SELECT <列名1>,<列名2>,<列名3>,....

           FROM <表名>

           WHERE <条件表达式>

           GROUP BY <列名1>,<列名2>,<列名3>,....;

    SELECT shiire_tanka, COUNT(*) -- COUNT(shiire_tanka)
    FROM Shohin
    WHERE shohin_bunrui = '衣服'
    GROUP BY shiire_tanka;

      说明:GROUP BY和WHERE并用时,SELECT语句的执行顺序是:

        FROM -> WHERE -> GROUP BY -> SELECT

    3-2-4:使用聚合函数和GROUP BY子句中常见的错误

      法则3-7:使用GROUP BY子句时,SELECT子句中不能出现聚合键之外的列名。

      法则3-8:在GROUP BY子句中不能使用SELECT子句中定义的别名。(在PostgreSQL中不会报错,但有些DBMS会报错)

      法则3-9:GROUP BY子句结果的输出是无序的。

      法则3-10:只有在SELECT子句和HAVING子句(以及ORDER BY子句)中能够使用聚合函数。

    3-2-5:DISTINCT和GROUP BY都能去除重复值

    -- DISTINCT和GROUP BY实现相同的功能
    SELECT DISTINCT shohin_bunrui
    FROM Shohin;
    
    SELECT shohin_bunrui
    FROM Shohin
    GROUP BY shohin_bunrui;

    如何选择使用这两个:

      想要删除选择结果的重复记录使用DISTINCT

      想要计算聚合结果时使用GROUP BY

    3-3:为聚合结果指定条件

       1、使用COUNT函数等对表中数据进行聚合操作时,为其指定的条件不是WHERE子句,而是HAVING子句

       2、聚合函数可以在SELECT、HAVING和ORDER BY子句中使用

       3、HAVING子句要写在GROUP BY子句之后

       4、WHERE子句用来指定数据行的条件,HAVING子句用来指定分组的条件

    3-3-1:HAVING子句

      语法3-3:SELECT <列名1>,<列名2>,<列名3>,....

           FROM <表名>

             GROUP BY <列名1>,<列名2>,<列名3>,....

           HAVING <分组结果对应的条件>;

      法则3-13:HAVING子句要写在GROUP BY子句之后。

    -- 取出包含数据的行数为2行的组
    SELECT shohin_bunrui, COUNT(*)
    FORM Shohin
    GROUP BY shohin_bunrui
    HAVING COUNT(*) = 2;

    3-3-2:HAVING子句的构成要素

      1、常数

      2、聚合函数

      3、GROUP BY子句中指定的列名

      法则3-14:指定行所对应的条件写在WHERE子句中,指定组所对应和条件写在HAVING子句中。

    3-4:对查询结果排序

      1、使用ORDER BY子句对查询结果排序

      2、在ORDER BY子句中的列名后使用关键字ASC升序排序,DESC降序排序

      3、ORDER BY子句中可以指定多个排序列名

      4、排序中包含NULL时,会在开头或结尾进行汇总

      5、ORDER BY子句中可以使用SELECT子句中定义的列的别名

      6、ORDER BY子句中可以使用SELECT子句中未出现的列或聚合函数

      7、ORDER BY子句中不能使用列的编号

    3-4-1:ORDER BY子句

      语法3-3:SELECT <列名1>,<列名2>,<列名3>,....

           FROM <表名>

             ORDER BY <列名1>,<列名2>,<列名3>,....

          

    -- 按销售单价从低向高排序
    SELECT shohin_id, shohin_mei,hanbai_tanka,shiire_tanka
    FROM Shohin
    ORDER BY hanbai_tanka;

    说明:子句的书写顺序

      SELECT子句->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句

        法则3-15:ORDER BY子句通常写在SELECT语句末尾。

    -- 按销售单价从高向低排序
    SELECT shohin_id, shohin_mei,hanbai_tanka,shiire_tanka
    FROM Shohin
    ORDER BY hanbai_tanka DESC;

    -- 按销售单价和商品编号从高向低排序
    SELECT shohin_id, shohin_mei,hanbai_tanka,shiire_tanka
    FROM Shohin
    ORDER BY hanbai_tanka DESC,shohin_id DESC;-- 每一个列都必须跟一个DSEC

      法则3-17:排序键中包含NULL时,会在开头或进行汇总

    3-4-2:在排序键中使用显示用别名

    SELECT shohin_id AS id, shohin_mei
    FROM Shohin
    ORDER BY id;

      说明:SELECT子句执行在GROUP BY子句之后,ORDER BY子句之前,所以在GROUP BY子句中不能用SELECT字义的别名,ORDER BY子句中可以。

      法则3-18:ORDER BY子句中可以使用SELECT子句中字义别名。

      法则3-19:ORDER BY子句中可以使用列中所有的列和聚合函数。

      法则3-20:ORDER BY子句中不要使用列编号。

  • 相关阅读:
    【高并发】面试官问我:为什么局部变量是线程安全的?
    Java中的String到底占用多大的内存空间?你所了解的可能都是错误的!!
    【高并发】学好并发编程,关键是要理解这三个核心问题
    【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!
    12张图带你彻底理解分布式事务产生的场景和解决方案!!
    【高并发】面试官:讲讲高并发场景下如何优化加锁方式?
    【高并发】秒杀系统架构解密,不是所有的秒杀都是秒杀(升级版)!!
    十一长假我肝了这本超硬核PDF,现决定开源!!
    一文搞懂PV、UV、VV、IP及其关系与计算
    我把这个贼好用的Excel导出工具开源了!!
  • 原文地址:https://www.cnblogs.com/jp-mao/p/6597645.html
Copyright © 2011-2022 走看看