我正在尝试编写一个简短的SQL查询(在MySQL Workbench中),如果一个科目被多个学生挂了,该查询将输出该科目的不及格次数。
下面是我的尝试:
SELECT CONCAT(area, yearlevel, code) AS SubjectCode, Count(student)
FROM StudentTakesSubject
WHERE result < 50 AND result <> NULL
GROUP BY code
HAVING Count(Student) > 1;
问题是它一直输出包含空记录的计数,即使我已经在查询中指定不对它们计数(或者至少我认为我做了...)。
编辑:是GROUP BY
子句出错了!正如Gordon Linoff在他的回答中指出的,它本来应该是GROUP BY SubjectCode
,这神奇地解决了问题。
谢谢大家的建设性见解。
4条答案
按热度按时间zed5wv101#
如所述:
此查询不应返回任何行。为什么?
result <> NULL
将NULL
返回为布尔值(几乎所有与NULL
的比较都将返回NULL
)。AND NULL
计算NULL
--并且NULL
不为真。所有行都将被过滤掉。NULL
比较实际上是多余的。result < 50
也会过滤掉NULL
值。查看查询的其余部分,您会发现另一个问题。
GROUP BY
在code
上。它实际上应该在SubjectCode
上--CONCAT()
的结果。实际上,当连接不同的列时,我建议使用分隔符,比如CONCAT_WS(':', area, yearlevel, code)
。当然,分隔符可能不适合这种特殊情况。5uzkadbs2#
result NOT NULL
而不是result <> NULL
。plicqrtu3#
result〈〉NULL不起作用,为什么?
比较非空表达式时,如果左操作数不等于右操作数,则结果为TRUE;否则,结果为FALSE。
检查此link以获取更多详细信息。
q7solyqu4#
此SQL查询选择选修了具有代码、年级和地区的科目的学生数,其中他们的结果小于50但不为空,并按科目代码对结果进行分组。HAVING子句对结果进行筛选,以仅包括选修了该科目且结果小于50的多名学生的科目代码。
下面是查询的详细信息:
这将选择连接的科目代码和选修该科目的学生人数。
这将指定StudentTakesSubject表并筛选结果以仅包含结果小于50且不为空的行。
这将按科目代码对结果进行分组,并应用HAVING子句对结果进行过滤,以仅包括具有多个学生的科目代码,这些学生选修了该科目并且结果小于50。
请注意,student列用在SELECT和COUNT子句中,但不用在GROUP BY或HAVING子句中。这是因为查询只对统计选修每门课程的学生人数感兴趣,而不管他们是哪些特定的学生。GROUP BY子句用于按科目代码对结果进行分组,因此不必将student包括在分组中。