SQL – 有VS在哪里

我有两个表:

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); 

是什么原因? 谢谢。

WHERE子句在单个行上引入条件; HAVING子句引入了聚合的条件,即选择的结果,其中单个结果(如count,average,min,max或sum)已经从行生成。 你的查询需要第二种条件(即聚合条件),因此HAVING能够正常工作。

根据经验,在GROUP BY之前使用WHEREGROUP BY之后使用HAVING 。 这是一个相当原始的规则,但在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) 

这将消除用作theta连接条件的 WHERE

HAVING对聚合物进行操作。 由于COUNT是一个集合函数,因此不能在WHERE子句中使用它。

以下是 MSDN关于聚合函数的一些阅读。

你不能在where子句中使用聚集函数,因为在条件的基础上获取记录,它通过记录进入表记录,然后根据我们给出的条件获取记录。 所以那个时候我们不可能在哪儿子句。 在运行查询之后,我们最终得到的resultSet具有子句。

示例查询:

 select empName, sum(Bonus) from employees order by empName having sum(Bonus) > 5000; 

这会将resultSet存储在临时内存中,然后having子句将执行其工作。 所以我们可以在这里轻松的使用聚合函数

  1. WHERE子句可以与SELECT,INSERT和UPDATE语句一起使用,而HAVING只能与SELECT语句一起使用。

  2. WHERE在聚合之前过滤行(GROUP BY),而在聚合之后HAVING过滤器组被执行。

  3. 集合函数不能在WHERE子句中使用,除非它在HAVING子句中包含的子查询中,而集合函数可以在HAVING子句中使用。

资源

在一个查询中没有看到两个例子。 所以这个例子可能有帮助。

  /** INTERNATIONAL_ORDERS - table of orders by company by location by day companyId, country, city, total, date **/ SELECT country, city, sum(total) totalCityOrders FROM INTERNATIONAL_ORDERS with (nolock) WHERE companyId = 884501253109 GROUP BY country, city HAVING country = 'MX' ORDER BY sum(total) DESC 

这将首先由companyId过滤表,然后按国家和城市对其进行分组,然后再将其过滤为墨西哥城市聚合。 companyId在聚合中是不需要的,但是我们可以使用WHERE在使用GROUP BY之前过滤出我们想要的行。

首先我们应该知道子句的执行顺序,即FROM> WHERE> GROUP BY> HAVING> DISTINCT> SELECT> ORDER BY。 由于WHERE子句在GROUP BY子句之前执行,因此无法通过将WHERE应用于GROUP BY应用的记录来过滤记录。

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

首先WHERE子句根据条件获取记录,然后GROUP BY子句对它们进行相应的分组 ,然后HAVING子句根据条件获取组记录。

1.我们可以使用HAVING子句的聚合函数而不是WHERE子句,例如min,max,avg。

2. WHERE子句通过元组消除记录元组HAVING子句从集合中消除整个组

大多数情况下,当你有数据组时使用HAVING,当你有行数据时使用WHERE。