这两个 SQL 查询有什么区别?
What is the difference between the two SQL queries?
目标是显示特定 class 中最年轻的学生。我用 GROUP BY 和 HAVING 子句创建了一个,但建议的答案是不使用它们。虽然他们的答案如何起作用确实有意义,但我仍然不明白为什么我的答案不起作用。不应该一样吗?
我的打印多行可能是 ENROLLMENT table 中的所有学生。只有当我因为 GROUP BY 而省略了 HAVING 子句时,它才应该这样做。但为什么它仍然这样做,即使 HAVING 子句告诉它要消除不符合条件的组?
select
studfname
|| ' '
|| studlname as fullname,
studdob
from
uni.student s,
uni.enrolment e
where
s.studid = e.studid
and
e.unitcode = 'FIT1004'
and
studdob =
(
select
min(studdob)
from
uni.student s,
uni.enrolment e
where
s.studid = e.studid
and
e.unitcode = 'FIT1004'
)
order by
s.studid;
SELECT studfname|| ' ' ||studlname AS stud_name, studdob
FROM uni.student s, uni.enrolment e
WHERE e.studid = s.studid
AND unitcode = 'FIT1004'
GROUP BY studfname, studlname, studdob
HAVING studdob = min(studdob);
提前致谢!
GROUP BY
将具有相同列值的所有结果组合成一行(主要用于需要求和、求平均值等的情况)。虽然 HAVING
是一种 WHERE
,您可以在加载所有查询结果后使用(post-检索条件)
这些都不会让你自己成为最小的学生。我不确定您的列名是什么,但这是我要使用的查询:
SELECT studentname, studentage, class
FROM students S
WHERE studentage = (select MIN(studentage) from students where class = s.class)
它会选择年龄最小的所有学生 class
您要求将您组中的每个成员(studfname、studlname、studdob)限制为他们的最小 studdob(这就是您的 HAVING 子句所做的)。由于您组中的每个成员只有一个 studdob,因此该 studdob 与该组成员的 min(studdob) 相同。
如果您更改 HAVING 子句以使用正确答案中的子查询,它将按预期工作:
HAVING studdob = (
select
min(birthdate)
from
pat_Patient s,
phy_Physician e
where
s.PCPPhysicianSID = e.PhysicianSID
and
e.PhysicianSID = 26665
)
与其他解决方案相比,这可能不是最优雅的方法,但为了回答您的问题,这就是您的查询无法正常工作而正确的查询有效的原因。
目标是显示特定 class 中最年轻的学生。我用 GROUP BY 和 HAVING 子句创建了一个,但建议的答案是不使用它们。虽然他们的答案如何起作用确实有意义,但我仍然不明白为什么我的答案不起作用。不应该一样吗?
我的打印多行可能是 ENROLLMENT table 中的所有学生。只有当我因为 GROUP BY 而省略了 HAVING 子句时,它才应该这样做。但为什么它仍然这样做,即使 HAVING 子句告诉它要消除不符合条件的组?
select
studfname
|| ' '
|| studlname as fullname,
studdob
from
uni.student s,
uni.enrolment e
where
s.studid = e.studid
and
e.unitcode = 'FIT1004'
and
studdob =
(
select
min(studdob)
from
uni.student s,
uni.enrolment e
where
s.studid = e.studid
and
e.unitcode = 'FIT1004'
)
order by
s.studid;
SELECT studfname|| ' ' ||studlname AS stud_name, studdob
FROM uni.student s, uni.enrolment e
WHERE e.studid = s.studid
AND unitcode = 'FIT1004'
GROUP BY studfname, studlname, studdob
HAVING studdob = min(studdob);
提前致谢!
GROUP BY
将具有相同列值的所有结果组合成一行(主要用于需要求和、求平均值等的情况)。虽然 HAVING
是一种 WHERE
,您可以在加载所有查询结果后使用(post-检索条件)
这些都不会让你自己成为最小的学生。我不确定您的列名是什么,但这是我要使用的查询:
SELECT studentname, studentage, class
FROM students S
WHERE studentage = (select MIN(studentage) from students where class = s.class)
它会选择年龄最小的所有学生 class
您要求将您组中的每个成员(studfname、studlname、studdob)限制为他们的最小 studdob(这就是您的 HAVING 子句所做的)。由于您组中的每个成员只有一个 studdob,因此该 studdob 与该组成员的 min(studdob) 相同。
如果您更改 HAVING 子句以使用正确答案中的子查询,它将按预期工作:
HAVING studdob = (
select
min(birthdate)
from
pat_Patient s,
phy_Physician e
where
s.PCPPhysicianSID = e.PhysicianSID
and
e.PhysicianSID = 26665
)
与其他解决方案相比,这可能不是最优雅的方法,但为了回答您的问题,这就是您的查询无法正常工作而正确的查询有效的原因。