我有以下两张表:
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都用于过滤数据。
对于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子句对结果应用过滤器。
WHERE和HAVING都用于过滤数据。
对于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子句对结果应用过滤器。
在一个查询中没有看到两者兼有的例子。这个例子可能会有帮助。
/**
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过滤出我们想要的行。