SQL HAVING子句

 
SQL HAVING 子句通常与 GROUP BY 子句一起使用,用来过滤 GROUP BY 子句返回的分组结果集。

GROUP BY 子句通常和聚合函数(COUNT()、SUM()、AVG()、MIN()、MAX() 等)一起使用来对结果进行分组,而 WHERE 子句不能和聚合函数一起使用,所以 SQL 又提供了 HAVING 子句,以弥补了 WHERE 子句的不足。

WHERE 子句在分组操作之前起作用,HAVING 子句在分组操作之后起作用。

语法

HAVING 子句的基本语法如下:

SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2

和 WHERE 子句一样,HAVING 子句后面也跟筛选条件,只有满足条件的数据才会被返回。您可以在 condition 条件中使用 >、<、= 等比较运算符,或者使用 AND、OR 等逻辑运算符来指定多个条件,或者使用 LIKE、NOT LIKE 等进行模糊匹配。

另外需要注意各个语句出现的顺序:
  • WHERE 子句对表进行第一次筛选,它紧跟 FROM 之后;
  • GROUP BY 子句对 WHERE 的筛选结果进行分组,它必须位于 WHERE 之后;
  • HAVING 子句用来对分组的结果进行筛选,它必须位于 GROUP BY 子句之后;
  • ORDER BY 子句对最终的结果集进行排序,它位于整个 SQL 语句的最后。

示例

有包含如下记录的 user 表:
+----+------------+-----------------+--------------------------+-------------+-----------------+
| id | username   | password        | email                    | cellphone   | ip              |
+----+------------+-----------------+--------------------------+-------------+-----------------+
|  1 | mozhiyan   | 123456          | java@biancheng.net       | 13112344444 | 113.96.109.117  |
|  2 | fanhua     | xyzabc          | cplusplus@biancheng.net  | 15028882233 | 117.25.156.179  |
|  3 | greatman   | 123abc          | python@biancheng.net     | 13290029028 | 125.64.104.35   |
|  4 | xiaogun123 | hsdjs23ZX       | c@biancheng.net          | 19036895933 | 101.37.97.51    |
|  5 | my_code    | 19951206        | php@biancheng.net        | 19234561234 | 103.133.176.211 |
|  6 | guxiaonuan | xy232323        | javascript@biancheng.net | 13409873222 | 113.96.109.117  |
|  7 | coder      | 20200304shengri | python@biancheng.net     | 15645990222 | 101.37.97.51    |
|  8 | happy_gril | sd@@sd          | c@biancheng.net          | 19090903636 | 220.181.38.148  |
+----+------------+-----------------+--------------------------+-------------+-----------------+
统计同一个 IP 地址上的用户注册数,筛选出注册数大于 2 的结果集:
SQL> SELECT ip, COUNT( username ) AS total FROM user GROUP BY ip HAVING total >=2;
执行结果:
+----------------+-------+
| ip             | total |
+----------------+-------+
| 101.37.97.51   |     2 |
| 113.96.109.117 |     2 |
+----------------+-------+