版权声明:Ch3nnnnnnnnnn的博客 https://blog.csdn.net/weixin_43064185/article/details/88695050
总结自己面试遇到手写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进行再过滤