MySQL数据库 WHERE与HAVING的区别


总结自己面试遇到手写sql题

一个SQL查询出表fenshu, 语文课程的成绩都大于80的学生姓名

如下一张表:
+--------+---------+---------+
| name   | kecheng | chengji |
+--------+---------+---------+
| 张三   | 语文    |      81 |
| 张三   | 数学    |      75 |
| 李四   | 语文    |      76 |
| 李四   | 数学    |      90 |
| 王五   | 语文    |      81 |
| 王五   | 数学    |     100 |
| 王五   | 英语    |      90 |
+--------+---------+---------+
select kecheng, group_concat(name) from fenshu where chengji >80  group by kecheng having kecheng='语文';
+---------+--------------------+
| kecheng | group_concat(name) |
+---------+--------------------+
| 语文    | 张三,王五          |
+---------+--------------------+
当时自己写成 'select kecheng, group_concat(name) from fenshu group by kecheng ~~having kecheng > 80~~ ;' 忘记了 WHERE 与HAVING 区别, 只知道HAVING作用与GROUP BY 之后. 应该在查询结果集之前用WHERE过滤掉 chengji > 80, 然后用 HAVING 查询 kecheng='语文'

总结: WHERE与HAVING区别在于, HAVING是对聚合后的结果进行条件的过滤, 而WHERE是在聚合前对记录进行过滤. 如果逻辑允许, 尽可能用WHERE先过滤记录, 这样能减少结果集, 提高查询效率, 最后再根据逻辑时候用HAVING进行再过滤