小编典典

SQL - HAVING vs. WHERE

all

我有以下两个表:

1. Lecturers (LectID, Fname, Lname, degree).
2. Lecturers_Specialization (LectID, Expertise).

我想找到最专业的讲师。当我尝试这个时,它不起作用:

SELECT
  L.LectID, 
  Fname, 
  Lname 
FROM Lecturers L, 
     Lecturers_Specialization S
WHERE L.LectID = S.LectID
AND COUNT(S.Expertise) >= ALL (SELECT
  COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID);

但是当我尝试这个时,它可以工作:

SELECT
  L.LectID,
  Fname,
  Lname 
FROM Lecturers L,
     Lecturers_Specialization S
WHERE L.LectID = S.LectID
GROUP BY L.LectID,
         Fname,
         Lname 
HAVING COUNT(S.Expertise) >= ALL (SELECT
  COUNT(Expertise)
FROM Lecturers_Specialization
GROUP BY LectID); 

是什么原因?谢谢。


阅读 74

收藏
2022-05-31

共1个答案

小编典典

WHERE子句在单个行上引入条件;HAVING子句引入了聚合条件,即从行生成单个结果(例如计数、平均值、最小值、最大值或总和)的选择结果。您的查询需要第二种条件(即聚合条件),因此HAVING可以正常工作。

根据经验,使用WHEREbeforeGROUP BYHAVINGafter GROUP BY。这是一个相当原始的规则,但在超过 90% 的情况下它是有用的。

当您使用它时,您可能希望使用 ANSI 版本的联接重新编写查询:

SELECT  L.LectID, Fname, Lname
FROM Lecturers L
JOIN Lecturers_Specialization S ON L.LectID=S.LectID
GROUP BY L.LectID, Fname, Lname
HAVING COUNT(S.Expertise)>=ALL
(SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)

这将消除WHERE用作theta join 条件的那个。

2022-05-31