MYSQL查询执行顺序,查询结果进行分组group by/筛选having/去重distinct

MYSQL查询执行顺序,查询结果进行分组group by/筛选having/去重distinct

SQL查询

  1、执行顺序

    3、select ...聚合函数 from 表名

    1、where ...

    2、group by ...

    4、having ...

    5、order by ...

    6、limit ...

  2、group by

    1、作用 :给查询结果进行分组

    2、示例

      1、查询表中一共有几个国家


      2、计算每个国家的平均攻击力

        select country,avg(gongji) from sanguo

        group by country;

        

  先分组 -> 再聚合 -> 再去重

        蜀国

  蜀国

  蜀国   --> 120    --> 蜀国

  魏国

  魏国   --> 110    --> 魏国

  吴国   --> 115    --> 吴国

      3、查找所有国家中英雄数量最多的前2名的 国家名称和英雄数量

       select country,count(id) as number from sanguo

       group by country

       order by number desc

       limit 2;

    3、注意

      1、group by之后的字段名必须要为select之后的字段名

      2、如果select之后的字段名和group by之后的字段不一致,则必须对该字段进行聚合处理(聚合函数)

  3、having语句

    1、作用

      对查询的结果进行进一步筛选

    2、示例

      1、找出平均攻击力>105的国家的前2名,显示国家名和平均攻击力

       select country,avg(gongji) as pjgj from sanguo

       group by country

       having pjgj>105

       order by pjgj DESC

       limit 2;

    3、注意

      1、having语句通常和group by语句联合使用,过滤由group by语句返回的记录集

      2、where只能操作表中实际存在字段,having可操作由聚合函数生成的显示列

  4、distinct

    1、作用 :不显示字段重复值

    2、示例

      1、表中都有哪些国家

        select distinct country from sanguo;

      2、计算蜀国一共有多少个英雄

        select count(distinct id) from sanguo 

        where country="蜀国";

    3、注意

      1、distinct和from之间所有字段都相同才会去重

      2、distinct不能对任何字段做聚合处理

  5、查询表记录时做数学运算

    1、运算符

      +  -  *  /  % 

    2、示例

      1、查询时所有英雄攻击力翻倍

        select id,name,gongji*2 as gj from sanguo;

   

   ## sudo apt-get install python3-pip

   ## sudo pip3 install pymysql


最后编辑于:2019/10/04作者: 牛逼PHP

发表评论