SQL - HAVING 与 WHERE

标签 sql where-clause having

我有以下两个表:

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 子句引入了聚合的条件,即从生成单个结果(例如计数、平均值、最小值、最大值或总和)的选择结果>多行。您的查询需要第二种条件(即聚合条件),因此 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

关于SQL - HAVING 与 WHERE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57814980/

相关文章:

sql - Postgres 从 jsonb 数组中获取值匹配的所有元素

带有 group by 和 having 子句的 Mysql 查询

php - 面向 PHP 开发人员的 PostgreSQL 和 MySQL 之间的差异

sql - SQL WHERE 子句中的条件检查

sql - Oracle - 在何处连接字段

MYSQL - 在 WHERE BETWEEN 中使用 CURDATE() 返回 NULL

MySQL - select 子句的奇怪返回

sql - 将结果限制为只有一个值只出现一次的行

带有明细表和事务的 MySQL 存储过程

SQL Server : RowVersion equivalent in Oracle