为什么 ON 子句和 WHERE 子句中的条件会使结果不同?

Why does a condition in ON clause and WHERE clause make the results different?

这些语句有不同的结果,第一个语句显示 2 个结果,包括空答案,而第二个语句显示 1 个没有空答案的结果。但为什么?使用 ON (statement...AND statement...) 与仅使用 AND 和 ON 条件有何不同?我已经阅读了很多关于这个主题的文章,但不明白我读了什么。如果有人能简单的解释一下,我将不胜感激。

SELECT E.EMPLOYEE_NO, S.SECTION_NO, S.START_DATE_TIME, S.LOCATION
FROM EMPLOYEE E LEFT OUTER JOIN SECTION S 
ON (S.COURSE_NO = E.EMPLOYEE_NO
AND OFFICE = 'RM30')
WHERE E.RECORD = 14;

SELECT E.EMPLOYEE_NO, S.SECTION_NO, S.START_DATE_TIME, 
S.OFFICE
FROM EMPLOYEE E LEFT OUTER JOIN SECTION S 
ON S.COURSE_NO = E.EMPLOYEE_NO
WHERE E.RECORD = 14
AND OFFICE = 'RM30';

您指的是条件:

AND s.LOCATION = 'RM30'

(请限定列名!)

A LEFT JOIN 保留第一个 table 中的所有行,当没有匹配第二个 table 时(以及所有匹配的对)。当没有匹配时,第二个 table 的值是 NULL.

当条件在WHERE子句中时:

WHERE s.LOCATION = 'RM30'

然后 s.LOCATIONNULL 对于不匹配的行。因此,条件失败(WHERE 过滤掉 NULL 和 "false" 条件)。换句话说,LEFT JOIN 变成了 INNER JOIN.

当然,当这个条件在 ON 子句中时,不会发生这种过滤,因为 LEFT JOIN.

的定义

Left outer join 可以提供与匹配记录无关的结果,但 where condition 过滤掉结果(即它只会给出匹配记录的结果)