zoukankan      html  css  js  c++  java
  • SQL基础-汇总统计及GROUP BY

    一、汇总统计

    1、聚集函数

    COUNT()      计算总数
    SUM()        求和
    MAX()        最大值
    MIN()        最小值
    AVG()        平均值


    2、聚集函数使用

    总共有多少名学生?
    SELECT COUNT(*) FROM student;
    
    所有学生的数学成绩总和?
    SELECT SUM(score) FROM student;
    
    所有学生的数学成绩最高分?
    SELECT MAX(score) FROM student;
    
    所有学生的数学成绩最低分?
    SELECT MIN(score) FROM student;
    
    所有学生的数学成绩平均分?
    SELECT AVG(score) FROM student;
    
    
    ###
    有多少名学生?
        SELECT COUNT(*) FROM student;        219
    
    另一种写法:
        SELECT COUNT(score) FROM student;        219
        SELECT COUNT(student_id) FROM student;    219
        SELECT COUNT(1) FROM student;        219
        SELECT COUNT('ABC') FROM student;        219
        SELECT COUNT(teacher_id) FROM student;    205
    
        COUNT(teacher_id) 忽略掉了值为null的行;
    
    同样忽略值为NULL的行:
        SELECT MAX(score) FROM student;
        SELECT MIN(score) FROM student;
        SELECT SUM(score) FROM student;
        SELECT AVG(score) FROM student;
    
    
    count(*) 与count(1)比较:
        如果你的数据表没有主键,那么count(1)比count(*)快 
        如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快 
        如果你的表只有一个字段的话那count(*)就是最快的啦 
        count(*) count(1) 两者比较。主要还是要count(1)所相对应的数据字段。 
        如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 
        因为count(*),自动会优化指定到那一个字段。所以没必要去count(?),用count(*),sql会帮你完成优化的。
    
    AVG(score) 等价于SUM(score)/COUNT(score)


    3、分组汇总统计

    关键字:GROUP BY
    
    比如:
        如何获取每个班级的数学成绩平均分(因为学生太多,这里先不计算成绩在80分以下的学生),以便比较不同班级的成绩?
    
        SELECT class_id,avg(score) FROM student WHERE score > 80 GROUP BY class_id;
    
    
    注意:SELECT里除了使用聚集函数返回的字段外,其他所有的字段都必须原样出现在GROUP BY的后面;

    image

    比如:
        如何统计不同的交易所的总的买入金额?
    
        SELECT left(stock_code,2),sum(price*volume)
        FROM t_stock_trans_dtl
        WHERE opt_typ = '买入'
        GROUP BY left(stock_code,2);
    
    
    比如:
        如何统计不同的交易所的不同交易类型的总的交易金额?
        #根据多个字段分组
        SELECT left(stock_code,2),opt_typ,sum(price*volume)
        FROM t_stock_trans_dtl
        GROUP BY left(stock_code,2),opt_typ;
    
    
    GROUP BY会将NULL值的行,分到同一组计算统计值;
    
    SELECT teacher_id,count(*)
    FROM student
    GROUP BY teacher_id;


    二、汇总统计

    1、过滤分组结果

    关键字:GROUP BY + HAVING
    having关键字专门用来对group by进行指定条件;
    
    having和where比较:
        having:过滤分组,在GROUP BY后执行;
        where:过滤行,在GROUP BY前执行;
    
    
    比如:
        如何获取教授15名以上学名的老师?
    
        SELECT teacher_id,count(*)
        FROM student
        GROUP BY teacher_id
        HAVING count(*) > 15;
    
    比如:
        如何获取数学成绩平均分在70分及以上的班级?
    
        SELECT
        class_id,avg(score)
        FROM student
        GROUP BY class_id
        HAVING avg(score) >= 70;


    2、排序分组结果

    比如:
        如何获取每个班级的数学成绩平均分(不计算数学成绩在80分以下的学生),然后以平均分从高到低排序?
    
        使用关键字:GROUP BY + ORDER BY
        
        #会先执行where,再进行order by
        SELECT
        class_id,avg(score)
        FROM student
        WHERE score > 80
        GROUP BY class_id
        ORDER BY avg(score) DESC;
    
    
    如果每次查询都想得到确定的排序结果,则必须使用ORDER BY


    3、SELECT子句顺序

    image


    最简单的SQL语句:

    SELECT 1;
  • 相关阅读:
    无题
    1.1tensorflow2.0 张量
    某某大肠_tidb_集群创建用户
    某某大肠_替换TiDB 3.0集群的tidb-server命令工具
    某某大肠_配置spark的thriftserver模块
    date_and_time
    SpringBoot整合Mybatis
    SpringBoot(3)Thymeleaf使用详解
    SpringBoot(2)实现CRUD
    SpringBoot(1)入门篇
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/11430384.html
Copyright © 2011-2022 走看看