与 sql 中的查询混淆
Confusing with Having query in sql
我正在使用 sql server management studio 2012 并且必须查询以显示学生不及格的科目(不及格条件是分<5.0)第一次来自这个table
StudentID | SubjectID | First/Second_Time | Point.
1 | 02 | 1 | 5.0
2 | 04 | 2 | 7.0
3 | 03 | 2 | 9
... etc
这是我老师的问题:
SELECT SubjectID
FROM Result(NAME OF the TABLE)
WHERE [First/Second_Time] = 1 AND Point < 5
GROUP BY SubjectID
HAVING count(point) >= ALL
(
SELECT count(point)
FROM Result
WHERE [First/Second_Time] = 1 AND point < 5
GROUP BY SubjectID
)
我不明白进行 having 查询的原因。因为 Count(point)
总是 >=all(select count(point)
from Result
where First/Second_Time=1 and point<5
group by SubjectID)
,不是吗?
而且这并不表明该科目有大多数学生第一次不及格。提前致谢,抱歉我的英语不好
子查询正在 return 列出主题失败的次数(第一次尝试时)。如果您 运行 像这样,您可能更容易看到它在做什么:
SELECT SubjectID, count(point)
FROM Result
WHERE [First/Second_Time] = 1 AND point < 5
GROUP BY SubjectID
所以如果某人数学失败两次,科学失败一次,子查询将 return:
2
1
您想知道哪个主题失败次数最多(在这种情况下,哪个主题失败 2 次或更多次,因为这是子查询中失败次数最多的)。所以你再算一次(也按主题分组),并且使用having
到return只有主题有2个或更多失败(大于或等于最高值)在你的子查询中)。
SELECT SubjectID
FROM Result
WHERE [First/Second_Time] = 1 AND Point < 5
GROUP BY SubjectID
HAVING count(point)...
有关更多示例,请参阅 https://msdn.microsoft.com/en-us/library/ms178543.aspx。
听起来你正在为 class 做一个项目,所以我什至不确定我是否应该回答这个问题,但就这样吧。问题是为什么要有 having 子句。您是否阅读了 having and all 的说明?
全部"Compares a scalar value with a single-column set of values"。
这种情况下的标量值是计数(点)或点小于 5 的主题 ID 的出现次数。这种情况下的单列集是每个主题小于 5 的出现次数的列表点.
比较的最终结果在“>=”中。 "All" 只有在子查询中的每个值都为真时才会计算为真。子查询 returns 一组满足 <5 和第一次要求的所有主题的计数。如果你有3个subject满足<5和1st time的条件,他们的频率分别是1,2,3次,那么主查询就会有3个"having"的结果; 1,2,3。每个主查询结果必须 >= 该主值的每个子查询结果才能评估为真。因此,逐步进行,第一个主要值 1 >= 1,但不是 >= 2,因此 1 下降,因为 "having" 为假。第二个主要值 2 >=1,>=2,但不是 >=3,所以它会下降。第三个值 3 的计算结果为 >= 1、2 和 3,因此您最终会返回频率最高的主题。
这在 "All" 关键字的 MSDN 讨论的 "remarks" 部分相当清楚,但与您的特定应用程序无关。
记住,MSDN 是我们的朋友!
我正在使用 sql server management studio 2012 并且必须查询以显示学生不及格的科目(不及格条件是分<5.0)第一次来自这个table
StudentID | SubjectID | First/Second_Time | Point.
1 | 02 | 1 | 5.0
2 | 04 | 2 | 7.0
3 | 03 | 2 | 9
... etc
这是我老师的问题:
SELECT SubjectID
FROM Result(NAME OF the TABLE)
WHERE [First/Second_Time] = 1 AND Point < 5
GROUP BY SubjectID
HAVING count(point) >= ALL
(
SELECT count(point)
FROM Result
WHERE [First/Second_Time] = 1 AND point < 5
GROUP BY SubjectID
)
我不明白进行 having 查询的原因。因为 Count(point)
总是 >=all(select count(point)
from Result
where First/Second_Time=1 and point<5
group by SubjectID)
,不是吗?
而且这并不表明该科目有大多数学生第一次不及格。提前致谢,抱歉我的英语不好
子查询正在 return 列出主题失败的次数(第一次尝试时)。如果您 运行 像这样,您可能更容易看到它在做什么:
SELECT SubjectID, count(point)
FROM Result
WHERE [First/Second_Time] = 1 AND point < 5
GROUP BY SubjectID
所以如果某人数学失败两次,科学失败一次,子查询将 return:
2
1
您想知道哪个主题失败次数最多(在这种情况下,哪个主题失败 2 次或更多次,因为这是子查询中失败次数最多的)。所以你再算一次(也按主题分组),并且使用having
到return只有主题有2个或更多失败(大于或等于最高值)在你的子查询中)。
SELECT SubjectID
FROM Result
WHERE [First/Second_Time] = 1 AND Point < 5
GROUP BY SubjectID
HAVING count(point)...
有关更多示例,请参阅 https://msdn.microsoft.com/en-us/library/ms178543.aspx。
听起来你正在为 class 做一个项目,所以我什至不确定我是否应该回答这个问题,但就这样吧。问题是为什么要有 having 子句。您是否阅读了 having and all 的说明?
全部"Compares a scalar value with a single-column set of values"。 这种情况下的标量值是计数(点)或点小于 5 的主题 ID 的出现次数。这种情况下的单列集是每个主题小于 5 的出现次数的列表点.
比较的最终结果在“>=”中。 "All" 只有在子查询中的每个值都为真时才会计算为真。子查询 returns 一组满足 <5 和第一次要求的所有主题的计数。如果你有3个subject满足<5和1st time的条件,他们的频率分别是1,2,3次,那么主查询就会有3个"having"的结果; 1,2,3。每个主查询结果必须 >= 该主值的每个子查询结果才能评估为真。因此,逐步进行,第一个主要值 1 >= 1,但不是 >= 2,因此 1 下降,因为 "having" 为假。第二个主要值 2 >=1,>=2,但不是 >=3,所以它会下降。第三个值 3 的计算结果为 >= 1、2 和 3,因此您最终会返回频率最高的主题。
这在 "All" 关键字的 MSDN 讨论的 "remarks" 部分相当清楚,但与您的特定应用程序无关。
记住,MSDN 是我们的朋友!