HAVING子句在GROUP BY后面什么时候使用,什么时候不使用?

HAVING子句在GROUP BY后面什么时候使用,什么时候不使用?
例如第一题:查询选修了课程1或课程2的学生姓名

SELECT sname
FROM student,sc
WHERE (cno='1' OR cno='2') AND student.sno=sc.sno
GROUP BY student.sno;

但如果我加上一句:HAVING COUNT (*)=1;

SELECT sname
FROM student,sc
WHERE (cno='1' OR cno='2') AND student.sno=sc.sno
GROUP BY student.sno
HAVING COUNT (*)=1;

显示报错
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*)=1' at line 5

但是在第二题中:查询同时选修了课程1与课程2的学生姓名
标准答案为


SELECT sname
FROM student,sc
WHERE student.sno=sc.sno AND cno IN ('1','2')
GROUP BY student.sno
HAVING COUNT(*)=2;

请问为什么这里有having子句,而第一题没有having子句呢

第一个错了是因为在count和()之间多打了个空格。然后having的用法是当有聚合函数的条件作为判断时,放在group by后面使用。

你这些语句按道理来说严格模式下都是要报错的,使用group by 后select 后面只能跟group by 字段或者是聚合函数

  • 以下回答由chatgpt基于相关博客总结生成:

    答案:

    1. HAVING子句在GROUP BY后面的使用场景是用于筛选分组后的数据,选取符合条件的分组。在分组语句中,WHERE子句对原始表进行数据筛选,而HAVING子句则对分组后的数据进行筛选。当需要对分组后的数据进行进一步筛选时,可以使用HAVING子句。例如,在查询选修了课程1或课程2的学生姓名时,如果需要筛选出只选了其中一门课程的学生,则可以使用HAVING COUNT(*)=1的条件来选取数据。

    2. 当需要对整个表进行数据筛选时,不需要使用HAVING子句。在查询语句中,可以通过WHERE子句对原始表的数据进行筛选,而不是对分组后的数据进行筛选。例如,当需要在一张表中选取所有选修了课程1或课程2的学生姓名时,可以使用SELECT语句和WHERE子句来实现,而不需要使用HAVING子句。

    3. 在查询同时选修了课程1与课程2的学生姓名时,使用了HAVING子句是因为这个查询需要选取两个条件都满足的数据。在这种情况下,需要对数据进行两次分组,分别按照选修了课程1和选修了课程2的情况进行分组,然后再将两次分组的结果进行合并,得到同时选修了课程1与课程2的学生姓名。由于需要对分组后的数据进行两次筛选,因此需要使用两个HAVING子句来完成筛选。而在查询选修了课程1或课程2的学生姓名时,只需要对分组后的数据进行一次筛选,因此只需要使用一个HAVING子句即可。

    至于出现语法错误的原因,需要具体查看查询语句和错误信息才能确定。可能是语法错误,也可能是数据类型错误或其他错误。因此,需要仔细检查查询语句和错误信息,进行逐步排查。