为了账号安全,请及时绑定邮箱和手机立即绑定

SQL-vsvswhere

SQL-vsvswhere

有只小跳蛙 2019-06-24 15:51:21
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);原因是什么?谢谢。
查看完整描述

3 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

WHERE从句引入一个条件个别行HAVING从句引入一个条件集合体,即选择的结果,其中产生了单个结果,如计数、平均值、最小值、最大值或和。倍数一排排。因此,查询会调用第二种条件(即聚合的条件)。HAVING工作正常。

作为经验法则,使用WHERE以前GROUP BYHAVINGGROUP 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加入条件.


查看完整回答
反对 回复 2019-06-24
?
浮云间

TA贡献1829条经验 获得超3个赞

HAVING运行在集合上。自COUNT是聚合函数,不能在WHERE条款。

这是一些从MSDN中读取聚合函数的文章。


查看完整回答
反对 回复 2019-06-24
?
慕慕森

TA贡献1856条经验 获得超17个赞

首先,我们应该知道条款的执行顺序。从>WHERE>GROUP按>有>DISTIVE>SELECT>OR哪里子句在执行之前按组子句不能通过应用程序过滤记录。哪里转到按组应用记录。

“WHERE子句与WHERE子句相同,但适用于分组记录”。

第一哪里子句根据条件获取记录,然后按组子句对它们进行相应的分组,然后子句根据已有条件获取组记录。


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 545 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信