Skip to content

SQL LEFT JOIN

SQL LEFT JOIN 是一种连接类型,它返回左表中的所有记录和右表中匹配的记录。如果右表中没有匹配的记录,则返回 NULL。

语法

sql
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

示例

假设我们有以下两个表:

students 表

idnameagegrade
1张三18高三
2李四17高二
3王五19高三
4赵六16高一
5钱七18高三

scores 表

idstudent_idsubjectscore
11数学90
21语文85
32数学95
42语文88
53数学80
66数学75
76语文82

示例 1:基本 LEFT JOIN

查询所有学生及其成绩(如果有的话):

sql
SELECT students.id, students.name, scores.subject, scores.score
FROM students
LEFT JOIN scores ON students.id = scores.student_id;

结果:

idnamesubjectscore
1张三数学90
1张三语文85
2李四数学95
2李四语文88
3王五数学80
4赵六NULLNULL
5钱七NULLNULL

示例 2:使用表别名

为表指定别名,简化查询语句:

sql
SELECT s.id, s.name, sc.subject, sc.score
FROM students AS s
LEFT JOIN scores AS sc ON s.id = sc.student_id;

结果与示例 1 相同。

示例 3:添加 WHERE 子句

查询没有成绩的学生:

sql
SELECT s.id, s.name
FROM students AS s
LEFT JOIN scores AS sc ON s.id = sc.student_id
WHERE sc.student_id IS NULL;

结果:

idname
4赵六
5钱七

示例 4:使用 COALESCE 函数处理 NULL 值

查询所有学生及其数学成绩,如果没有数学成绩则显示 0:

sql
SELECT s.id, s.name, COALESCE(sc.score, 0) AS 数学成绩
FROM students AS s
LEFT JOIN scores AS sc ON s.id = sc.student_id AND sc.subject = '数学';

结果:

idname数学成绩
1张三90
2李四95
3王五80
4赵六0
5钱七0

注意事项

  1. 左表和右表:在 LEFT JOIN 中,table1 是左表,table2 是右表。左表中的所有记录都会被返回,无论右表中是否有匹配的记录。

  2. NULL 值:当右表中没有匹配的记录时,右表的列会返回 NULL。

  3. WHERE 子句与 ON 子句:在 LEFT JOIN 中,连接条件应该放在 ON 子句中,而不是 WHERE 子句中。如果将连接条件放在 WHERE 子句中,LEFT JOIN 会变成 INNER JOIN。

  4. 性能考虑:对于大型表,LEFT JOIN 可能会影响查询性能。为了提高性能,应该确保连接的列上有索引。

小结

SQL LEFT JOIN 是一种常用的连接类型,它返回左表中的所有记录和右表中匹配的记录。当需要查询左表中的所有记录,无论右表中是否有匹配的记录时,LEFT JOIN 非常有用。