SQL HAVING子句
SQL HAVING 子句通常与 GROUP BY 子句一起使用,用来过滤 GROUP BY 子句返回的分组结果集。
GROUP BY 子句通常和聚合函数(COUNT()、SUM()、AVG()、MIN()、MAX() 等)一起使用来对结果进行分组,而 WHERE 子句不能和聚合函数一起使用,所以 SQL 又提供了 HAVING 子句,以弥补了 WHERE 子句的不足。
WHERE 子句在分组操作之前起作用,HAVING 子句在分组操作之后起作用。
另外需要注意各个语句出现的顺序:
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 子句对表进行第一次筛选,它紧跟 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 | +----------------+-------+