有和在哪里

我有以下两张表:

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

原因是什么?谢谢。

208652 次浏览

HAVING操作在聚合上。由于COUNT是一个聚合函数,所以不能在WHERE子句中使用它。

这是从MSDN读取聚合函数。

WHERE子句在个人行上引入了一个条件;HAVING子句在聚合上引入了一个条件,即从多个行中产生的单个结果,如count、average、min、max或sum。您的查询调用了第二种条件(即聚合上的条件),因此HAVING可以正常工作。

根据经验,在GROUP BY之前使用WHERE,在GROUP BY之后使用HAVING。这是一个相当原始的规则,但在90%以上的情况下是有用的。

当你这样做的时候,你可能想用ANSI版本的join重写你的查询:

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

你不能在聚合函数中使用where子句,因为where在条件的基础上获取记录,它会一个记录一个记录地进入表,然后根据我们给出的条件获取记录。所以那个时候我们不能在哪里从句。While having子句作用于运行查询后最终得到的resultSet。

示例查询:

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

这将把resultSet存储在临时内存中,然后having子句将执行它的工作。我们可以很容易地使用聚合函数。

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

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

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

Source .

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

< p > 2。 WHERE子句逐个删除记录元组 HAVING子句从group

集合中删除整个组

大多数情况下,HAVING在数据组中使用,WHERE在数据行中使用。

在一个查询中没有看到两者兼有的例子。这个例子可能会有帮助。

  /**
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,但我们能够在使用GROUP BY之前使用WHERE过滤出我们想要的行。

首先,我们应该知道从句的执行顺序 从>,>组>有>不同>选择>顺序。 由于在哪里子句在集团子句之前执行,因此不能通过对应用的集团记录应用在哪里来过滤记录

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

首先,在哪里子句根据条件获取记录,然后集团子句相应地将它们分组,然后子句根据having条件获取组记录。

WHERE子句用于消除关系中的元组,HAVING子句用于消除关系中的组。

HAVING子句用于聚合函数,例如 MINMAXCOUNTSUM .但是总是在HAVING子句之前使用GROUP BY子句,以尽量减少错误

WHEREHAVING都用于过滤数据。 在WHERE语句的情况下,在你提取数据进行操作之前进行数据过滤

SELECT name, age
FROM employees
WHERE age > 30;

在这里,WHERE子句在执行SELECT操作之前过滤行。

SELECT department, avg(age) avg_age
FROM employees
GROUP BY department
HAVING avg_age> 35;

HAVING在执行SELECT操作后过滤数据。这里首先进行计算(聚合)操作,然后使用HAVING子句对结果应用过滤器。