mysql SQL不为空不工作

oymdgrw7  于 2023-02-21  发布在  Mysql
关注(0)|答案(4)|浏览(216)

我正在尝试编写一个简短的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,这神奇地解决了问题。

谢谢大家的建设性见解。

zed5wv10

zed5wv101#

如所述:

SELECT CONCAT(area, yearlevel, code) AS SubjectCode, Count(student)
FROM StudentTakesSubject
WHERE result < 50 AND result <> NULL
GROUP BY code
HAVING Count(Student) > 1;

此查询不应返回任何行。为什么?result <> NULLNULL返回为布尔值(几乎所有与NULL的比较都将返回NULL)。AND NULL计算NULL--并且NULL不为真。所有行都将被过滤掉。
NULL比较实际上是多余的。result < 50也会过滤掉NULL值。
查看查询的其余部分,您会发现另一个问题。GROUP BYcode上。它实际上应该在SubjectCode上--CONCAT()的结果。实际上,当连接不同的列时,我建议使用分隔符,比如CONCAT_WS(':', area, yearlevel, code)。当然,分隔符可能不适合这种特殊情况。

5uzkadbs

5uzkadbs2#

result NOT NULL而不是result <> NULL

SELECT CONCAT(area, yearlevel, code) AS SubjectCode, Count(student)
FROM StudentTakesSubject
WHERE result < 50 
AND result NOT NULL
GROUP BY code
HAVING Count(Student) > 1;
plicqrtu

plicqrtu3#

result〈〉NULL不起作用,为什么?
比较非空表达式时,如果左操作数不等于右操作数,则结果为TRUE;否则,结果为FALSE。
检查此link以获取更多详细信息。

q7solyqu

q7solyqu4#

此SQL查询选择选修了具有代码、年级和地区的科目的学生数,其中他们的结果小于50但不为空,并按科目代码对结果进行分组。HAVING子句对结果进行筛选,以仅包括选修了该科目且结果小于50的多名学生的科目代码。
下面是查询的详细信息:

SELECT CONCAT(area, yearlevel, code) AS SubjectCode, Count(student)

这将选择连接的科目代码和选修该科目的学生人数。

FROM StudentTakesSubject
WHERE result < 50 AND result <> NULL

这将指定StudentTakesSubject表并筛选结果以仅包含结果小于50且不为空的行。

GROUP BY code
HAVING Count(Student) > 1;

这将按科目代码对结果进行分组,并应用HAVING子句对结果进行过滤,以仅包括具有多个学生的科目代码,这些学生选修了该科目并且结果小于50。
请注意,student列用在SELECT和COUNT子句中,但不用在GROUP BY或HAVING子句中。这是因为查询只对统计选修每门课程的学生人数感兴趣,而不管他们是哪些特定的学生。GROUP BY子句用于按科目代码对结果进行分组,因此不必将student包括在分组中。

相关问题