Appearance
SQL 连接(JOIN)
SQL JOIN 子句用于从两个或多个表中基于它们之间的关系查询数据。
为什么需要 JOIN?
在关系型数据库中,数据通常被分散存储在多个表中,以避免数据冗余和确保数据一致性。当需要从多个表中获取相关数据时,就需要使用 JOIN 操作。
JOIN 类型
1. INNER JOIN
内连接,返回两个表中匹配的记录。
2. LEFT JOIN
左连接,返回左表中的所有记录和右表中匹配的记录。如果右表中没有匹配的记录,则返回 NULL。
3. RIGHT JOIN
右连接,返回右表中的所有记录和左表中匹配的记录。如果左表中没有匹配的记录,则返回 NULL。
4. FULL JOIN
全连接,返回两个表中的所有记录。如果其中一个表中没有匹配的记录,则返回 NULL。
示例表结构
假设我们有以下两个表:
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:INNER JOIN
查询所有有成绩的学生及其成绩:
sql
SELECT students.id, students.name, scores.subject, scores.score
FROM students
INNER JOIN scores ON students.id = scores.student_id;结果:
| id | name | subject | score |
|---|---|---|---|
| 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;结果:
| id | name | subject | score |
|---|---|---|---|
| 1 | 张三 | 数学 | 90 |
| 1 | 张三 | 语文 | 85 |
| 2 | 李四 | 数学 | 95 |
| 2 | 李四 | 语文 | 88 |
| 3 | 王五 | 数学 | 80 |
| 4 | 赵六 | NULL | NULL |
| 5 | 钱七 | NULL | NULL |
示例 3:RIGHT JOIN
查询所有成绩及其对应的学生(如果有的话):
sql
SELECT students.id, students.name, scores.subject, scores.score
FROM students
RIGHT JOIN scores ON students.id = scores.student_id;结果:
| id | name | subject | score |
|---|---|---|---|
| 1 | 张三 | 数学 | 90 |
| 1 | 张三 | 语文 | 85 |
| 2 | 李四 | 数学 | 95 |
| 2 | 李四 | 语文 | 88 |
| 3 | 王五 | 数学 | 80 |
| NULL | NULL | 数学 | 75 |
| NULL | NULL | 语文 | 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;结果:
| id | name | subject | score |
|---|---|---|---|
| 1 | 张三 | 数学 | 90 |
| 1 | 张三 | 语文 | 85 |
| 2 | 李四 | 数学 | 95 |
| 2 | 李四 | 语文 | 88 |
| 3 | 王五 | 数学 | 80 |
| 4 | 赵六 | NULL | NULL |
| 5 | 钱七 | NULL | NULL |
| NULL | NULL | 数学 | 75 |
| NULL | NULL | 语文 | 82 |
注意事项
连接条件:JOIN 操作必须指定连接条件,否则会产生笛卡尔积(Cartesian Product),即两个表的所有行的组合,这通常不是我们想要的结果。
表别名:在使用 JOIN 操作时,为表指定别名可以简化查询语句,提高可读性。
性能考虑:对于大型表,JOIN 操作可能会影响查询性能。为了提高性能,应该确保连接的列上有索引,并只选择需要的列。
不同数据库的支持:
- MySQL 不支持 FULL JOIN,但可以使用 UNION 来模拟。
- 所有主流关系型数据库都支持 INNER JOIN、LEFT JOIN 和 RIGHT JOIN。
小结
SQL JOIN 子句是从多个表中查询相关数据的强大工具,通过选择合适的 JOIN 类型,可以灵活地获取所需的数据。在实际应用中,INNER JOIN 和 LEFT JOIN 是最常用的连接类型。