在关系型数据库中,JOIN操作用于将两个或多个表的行组合在一起,基于这些表之间的共同列。常见的JOIN类型有LEFT JOIN、RIGHT JOIN和INNER JOIN。本文将介绍这三种JOIN类型的区别以及它们的用法。
INNER JOIN(内连接)
内连接是最常用的JOIN类型,它会返回两个表中具有匹配值的行。如果某个表中的行在另一个表中没有匹配的值,则不会返回该行。
语法:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
示例: 假设我们有两个表,一个是学生表(students),另一个是成绩表(scores)。
学生表(students):
id | name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
成绩表(scores):
student_id | grade |
---|---|
1 | 90 |
2 | 85 |
3 | 95 |
我们想要查询所有学生的姓名和他们的成绩。可以使用以下SQL语句:
SELECT students.name, scores.grade
FROM students
INNER JOIN scores
ON students.id = scores.student_id;
查询出来的内容如下:
name | grade |
---|---|
张三 | 90 |
李四 | 85 |
王五 | 95 |
LEFT JOIN(左连接)
左连接会返回左表中的所有行,即使在右表中没有匹配的值。如果在右表中没有匹配的值,则会返回NULL。
语法:
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
示例: 假设我们有以下两个表:
学生表(students):
id | name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
成绩表(scores):
student_id | grade |
---|---|
1 | 90 |
3 | 95 |
如果我们想要查询所有学生的姓名和他们的成绩,即使有些学生没有成绩,可以使用以下SQL语句:
SELECT students.name, scores.grade
FROM students
LEFT JOIN scores
ON students.id = scores.student_id;
查询出来的内容如下:
name | grade |
---|---|
张三 | 90 |
李四 | NULL |
王五 | 95 |
RIGHT JOIN(右连接)
右连接与左连接相反,它会返回右表中的所有行,即使在左表中没有匹配的值。如果在左表中没有匹配的值,则会返回NULL。
语法:
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
示例: 使用上面的学生表和成绩表,
学生表(students):
id | name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
成绩表(scores):
student_id | grade |
---|---|
1 | 90 |
3 | 95 |
如果我们想要查询所有学生的成绩,即使有些学生没有成绩,可以使用以下SQL语句:
SELECT students.name, scores.grade
FROM students
RIGHT JOIN scores
ON students.id = scores.student_id;
查询出来的内容如下:
name | grade |
---|---|
张三 | 90 |
王五 | 95 |
总结:
-
left join: 包含左表的所有行,对应的右表行可能为空
-
right join: 包含右表的所有行,对应的左表行可能为空
-
inner join: 只包含左右表都匹配并且不为空的行