Skip to content

SQL 连接(JOIN)

SQL JOIN 子句用于从两个或多个表中基于它们之间的关系查询数据。

为什么需要 JOIN?

在关系型数据库中,数据通常被分散存储在多个表中,以避免数据冗余和确保数据一致性。当需要从多个表中获取相关数据时,就需要使用 JOIN 操作。

JOIN 类型

1. INNER JOIN

内连接,返回两个表中匹配的记录。

2. LEFT JOIN

左连接,返回左表中的所有记录和右表中匹配的记录。如果右表中没有匹配的记录,则返回 NULL。

3. RIGHT JOIN

右连接,返回右表中的所有记录和左表中匹配的记录。如果左表中没有匹配的记录,则返回 NULL。

4. FULL JOIN

全连接,返回两个表中的所有记录。如果其中一个表中没有匹配的记录,则返回 NULL。

示例表结构

假设我们有以下两个表:

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:INNER JOIN

查询所有有成绩的学生及其成绩:

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

结果:

idnamesubjectscore
1张三数学90
1张三语文85
2李四数学95
2李四语文88
3王五数学80

示例 2: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

示例 3:RIGHT JOIN

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

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

结果:

idnamesubjectscore
1张三数学90
1张三语文85
2李四数学95
2李四语文88
3王五数学80
NULLNULL数学75
NULLNULL语文82

示例 4:FULL JOIN

查询所有学生和所有成绩,匹配的显示对应数据,不匹配的显示 NULL:

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

结果:

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

注意事项

  1. 连接条件:JOIN 操作必须指定连接条件,否则会产生笛卡尔积(Cartesian Product),即两个表的所有行的组合,这通常不是我们想要的结果。

  2. 表别名:在使用 JOIN 操作时,为表指定别名可以简化查询语句,提高可读性。

  3. 性能考虑:对于大型表,JOIN 操作可能会影响查询性能。为了提高性能,应该确保连接的列上有索引,并只选择需要的列。

  4. 不同数据库的支持

    • MySQL 不支持 FULL JOIN,但可以使用 UNION 来模拟。
    • 所有主流关系型数据库都支持 INNER JOIN、LEFT JOIN 和 RIGHT JOIN。

小结

SQL JOIN 子句是从多个表中查询相关数据的强大工具,通过选择合适的 JOIN 类型,可以灵活地获取所需的数据。在实际应用中,INNER JOIN 和 LEFT JOIN 是最常用的连接类型。