ON 被称为「连接条件」,而 WHERE 被称为「过滤条件」。
在 SQL 中使用 LEFT JOIN 时,ON 和 WHERE 子句有所区别。下面通过两个例子来说明,这两个例子将展示不同的结果集。
例子 1:使用 ON 子句
假设我们有两个表:students(学生表)和 enrollments(选课表)。我们想要查询所有学生及其是否选修了数学课。
SELECT students.name, enrollments.course_id
FROM students
LEFT JOIN enrollments ON students.student_id = enrollments.student_id AND enrollments.course_id = 'Math';
在这个例子中,ON 子句用于指定连接条件,并且立即应用这个条件。结果集将包含所有学生,无论他们是否选修了数学课。如果学生选修了数学课,则 course_id
为 ‘Math’;否则,course_id
为 NULL。未选修数学课的学生也会出现在结果集中,只是对应的 course_id
为 NULL。
例子 2:使用 WHERE 子句
现在,我们使用相同的表,但是这次我们将选课条件放在 WHERE
子句中。
SELECT students.name, enrollments.course_id
FROM students
LEFT JOIN enrollments ON students.student_id = enrollments.student_id
WHERE enrollments.course_id = 'Math';
在这个例子中,WHERE
子句用于过滤连接后的结果集。这意味着只有当 enrollments
表中的 course_id
为 'Math'
时,对应的学生记录才会被包含在结果集中。因此,结果集将只包含那些选修了数学课的学生,未选修数学课的学生不会出现在结果集中。
如果上面使用的是内连接(Inner Join),那结果就是一致的了。