这两个 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
  )

与其他解决方案相比,这可能不是最优雅的方法,但为了回答您的问题,这就是您的查询无法正常工作而正确的查询有效的原因。