Appearance
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 表
| id | name | age | grade |
|---|---|---|---|
| 1 | 张三 | 18 | 高三 |
| 2 | 李四 | 17 | 高二 |
| 3 | 王五 | 19 | 高三 |
| 4 | 赵六 | 16 | 高一 |
| 5 | 钱七 | 18 | 高三 |
scores 表
| id | student_id | subject | score |
|---|---|---|---|
| 1 | 1 | 数学 | 90 |
| 2 | 1 | 语文 | 85 |
| 3 | 2 | 数学 | 95 |
| 4 | 2 | 语文 | 88 |
| 5 | 3 | 数学 | 80 |
| 6 | 6 | 数学 | 75 |
| 7 | 6 | 语文 | 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;结果:
| id | name | subject | score |
|---|---|---|---|
| 1 | 张三 | 数学 | 90 |
| 1 | 张三 | 语文 | 85 |
| 2 | 李四 | 数学 | 95 |
| 2 | 李四 | 语文 | 88 |
| 3 | 王五 | 数学 | 80 |
| 4 | 赵六 | NULL | NULL |
| 5 | 钱七 | NULL | NULL |
示例 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;结果:
| id | name |
|---|---|
| 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 = '数学';结果:
| id | name | 数学成绩 |
|---|---|---|
| 1 | 张三 | 90 |
| 2 | 李四 | 95 |
| 3 | 王五 | 80 |
| 4 | 赵六 | 0 |
| 5 | 钱七 | 0 |
注意事项
左表和右表:在 LEFT JOIN 中,
table1是左表,table2是右表。左表中的所有记录都会被返回,无论右表中是否有匹配的记录。NULL 值:当右表中没有匹配的记录时,右表的列会返回 NULL。
WHERE 子句与 ON 子句:在 LEFT JOIN 中,连接条件应该放在 ON 子句中,而不是 WHERE 子句中。如果将连接条件放在 WHERE 子句中,LEFT JOIN 会变成 INNER JOIN。
性能考虑:对于大型表,LEFT JOIN 可能会影响查询性能。为了提高性能,应该确保连接的列上有索引。
小结
SQL LEFT JOIN 是一种常用的连接类型,它返回左表中的所有记录和右表中匹配的记录。当需要查询左表中的所有记录,无论右表中是否有匹配的记录时,LEFT JOIN 非常有用。