SQL-vsvswhere

SQL-vsvswhere

我有以下两张表:

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

我想找一个专业程度最高的讲师。当我尝试这个时,它是不起作用的:

SELECT
  L.LectID, 
  Fname, 
  Lname 
FROM Lecturers L, 
     Lecturers_Specialization SWHERE L.LectID = S.LectIDAND COUNT(S.Expertise) >= ALL (SELECT
  COUNT(Expertise)FROM Lecturers_SpecializationGROUP BY LectID);

但当我尝试这个时,它起作用了:

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

原因是什么?谢谢。


有只小跳蛙
浏览 552回答 3
3回答

ITMISS

WHERE从句引入一个条件个别行; HAVING从句引入一个条件集合体,即选择的结果,其中产生了单个结果,如计数、平均值、最小值、最大值或和。倍数一排排。因此,查询会调用第二种条件(即聚合的条件)。HAVING工作正常。作为经验法则,使用WHERE以前GROUP BY和HAVING后GROUP BY..这是一个相当原始的规则,但在90%以上的情况下是有用的。在进行此操作时,您可能希望使用连接的ANSI版本重写查询:SELECT  L.LectID, Fname, LnameFROM Lecturers LJOIN Lecturers_Specialization S ON L.LectID=S.LectIDGROUP BY L.LectID, Fname,  LnameHAVING COUNT(S.Expertise)>=ALL(SELECT COUNT(Expertise) FROM Lecturers_Specialization GROUP BY LectID)这样可以消除WHERE被用作Theta加入条件.

浮云间

HAVING运行在集合上。自COUNT是聚合函数,不能在WHERE条款。这是一些从MSDN中读取聚合函数的文章。

慕慕森

首先,我们应该知道条款的执行顺序。从>WHERE>GROUP按>有>DISTIVE>SELECT>OR自哪里子句在执行之前按组子句不能通过应用程序过滤记录。哪里转到按组应用记录。“WHERE子句与WHERE子句相同,但适用于分组记录”。第一哪里子句根据条件获取记录,然后按组子句对它们进行相应的分组,然后有子句根据已有条件获取组记录。
打开App,查看更多内容
随时随地看视频慕课网APP