美文网首页
mysql~group by

mysql~group by

作者: 魏小小伊 | 来源:发表于2020-11-24 14:52 被阅读0次

    不知咋滴,sql里,group by真是最让我头疼的,其他的看过后就挺明白的,但是这个就像和我犯冲似的,一直不明白,洲哥已经给我讲了两年啦~我哭~也是辛苦他啦~所以整理记录其实是为了让自己记忆深刻。
    ———————————————————————————————————

    group by——>分组

    表先放这,学生表吧,最简单的。
    (数据咱先不管,连表那些咱也先不管,就把学生信息和成绩信息先放在一张表了)


    image.png

    第一部分:最简单的分组——单条件分组——“7年级,男/女,语文平均分”

    image.png

    分析:
    1、语文平均分是我们要查询的结果,平均分使用avg;
    2、第一个条件“7年级”,where后面的条件找到;
    3、与分组有关最重要的,分组“男/女”,group by后面的条件也找到。

    这里可以记录一下基本规则rule:
    1、使用group by一般会和聚合函数联合使用(聚合函数:count、avg、max、min、sum);
    2、group by 后面所加的内容,才可以出现在select后面,并且不加聚合函数。

    第二部分:也简单的分组——多条件分组——“不同年级,男/女,语文平均分”

    image.png

    分析:
    1、语文平均分是我们要查询的结果,平均分使用avg;
    2、第一个条件“不同年级”,说明是分组,group by 后面条件找到;
    3、“男/女”,说明也是分组,group by 后面第二条件也找到。

    第三部分:拓展与group by连用的having——““7年级,男/女,语文平均分,大于70分的性别””(虽然例子不是很好hh~)

    image.png

    分析:
    1、语文平均分是我们要查询的结果,平均分使用avg;
    2、第一个条件“7年级”,where后面的条件找到;
    3、与分组有关最重要的,分组“男/女”,group by后面的条件也找到;
    4、平均分大于70分,那得是平均分聚合后“>70”了;这一条件放在哪呢?

    结论:
    如果像如上这么写会报错,原因涉及到sql的exec_plan“执行计划”。
    解释一下,平均分的结果avg_score会在group by执行之后才得到,而我们在where后面就使用了avg_score>70,相当于已经使用了group by执行后得到的avg_score,显然,还没有avg_score的结果,那就一定会报错了。
    所以正确写法,是要引入与group by连用的having,正确写法如下:


    image.png
    由此得到where和having的区别:

    1、having与group by一起用;
    2、聚合值作为的条件只能放在having的后面;
    3、运行顺序where会前于having。

    相关文章

      网友评论

          本文标题:mysql~group by

          本文链接:https://www.haomeiwen.com/subject/sjqbiktx.html