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
之前使用WHERE
在GROUP 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子句将执行其工作。 所以我们可以在这里轻松的使用聚合函数
-
WHERE子句可以与SELECT,INSERT和UPDATE语句一起使用,而HAVING只能与SELECT语句一起使用。
-
WHERE在聚合之前过滤行(GROUP BY),而在聚合之后HAVING过滤器组被执行。
-
集合函数不能在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。