where和having区别 - 图1

    在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:
    聚组函数,例如SUM, COUNT, MAX, AVG等。
    这些函数和其它函数的根本区别就是它们一般作用在多条记录上,多记录进去,返回一条记录

    1)SQL的书写顺序
    SELECT- DISTINCT- FROM- JOIN ON- WHERE- GROUP BY- HIVING- ORDER BY- LIMIT

    2)真正执行的顺序:
    随着Mysql版本的更新换代,其优化器也在不断的升级,优化器会分析不同执行顺序产生的性能消耗不同而动态调整执行顺序。下面是经常出现的查询顺序:
    FROM- ON- JOIN- WHERE- GROUP BY- HAVING- SELECT- DISTINCT- ORDER BY- LIMIT

    3)外连接
    外连接确定主从表:左外连左主右从,右外连右主左从!
    外连接的结果集:主表取所有,从表取匹配,主表与从表未匹配的数据通过null来补全.


    SQL实例:

    一、显示每个地区的总人口数和总面积:

    1. SELECT region, SUM(population), SUM(area)
    2. FROM bbc
    3. GROUP BY region

    先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。

    二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000的地区。

    SELECT region, SUM(population), SUM(area) 
    FROM bbc 
    GROUP BY region 
    HAVING SUM(area)>1000
    

    在这里,我们不能用where来筛选超过1000的地区,因为表中不存在这样一条记录。 相反,HAVING子句可以让我们筛选成组后的各组数据。



    如果一条sql使用了 group by 那么 select 后面可以显示的字段可以有:

    • group by 的字段(多个)
    • 聚合函数, 函数体中字段任意,只要是表中的字段就行,不需要非得是group by 后面的字段


      如果需要对分组后的每一组数据做细化的筛选,那么可以在group by 后面接having() 函数,having函数体多为聚合函数 。

      注意:group by 分组后,只能显示合法数据,一般都是每一组中的其中一条,违反这个规则, 一定会报语法错误。


      having 是对分组(group by)后的筛选条件,对分组后的数据进行筛选,作用于每个组,限制的是组,而不是行。

      WHERE过滤行,HAVING过滤组

      当同时含有 where 子句、group by 子句 、having 子句、聚集函数时,执行顺序如下:

      1、先执行where子句,查找(过滤出)表中符合条件的数据;
      2、再group by 子句,对where查找出的数据进行分组;
      3、对group by 子句形成的组,运行聚集函数计算每一组的值;
      4、最后用having 子句,查找(过滤出)符合条件的组