SQL 语句中的 内连接、外连接、左连接 和 右连接 是常见的用于联合多张表的数据查询方式。它们的区别主要体现在如何处理在连接的表中没有匹配数据的记录。
1. 内连接(INNER JOIN)
内连接是最常见的一种连接方式,它返回两个表中满足连接条件的记录。如果某个表中的记录在另一个表中没有匹配项,那么这条记录不会出现在结果中。
语法:
SELECT columns FROM table1 INNER JOIN table2 ON table1.column = table2.column;
示例:
假设有两个表:employees
(员工表)和 departments
(部门表),我们希望查询员工和他们所在部门的信息。
employees 表:
emp_id | emp_name | dept_id |
---|---|---|
1 | John | 10 |
2 | Jane | 20 |
3 | Alice | 10 |
4 | Bob | NULL |
departments 表:
dept_id | dept_name |
---|---|
10 | HR |
20 | IT |
查询所有有部门的员工及其部门信息:
SELECT e.emp_name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id = d.dept_id;
结果:
emp_name | dept_name |
---|---|
John | HR |
Jane | IT |
Alice | HR |
-
解释:内连接只返回两个表中
dept_id
匹配的记录,Bob 由于没有部门(dept_id
为 NULL)没有出现在结果中。
2. 外连接(OUTER JOIN)
外连接是一种包括左表和右表所有记录的连接方式。外连接分为 左外连接(LEFT OUTER JOIN) 和 右外连接(RIGHT OUTER JOIN),两者主要区别在于返回的记录集不同。
语法:
SELECT columns FROM table1 LEFT OUTER JOIN table2 ON table1.column = table2.column;
SELECT columns FROM table1 RIGHT OUTER JOIN table2 ON table1.column = table2.column;
3. 左外连接(LEFT JOIN 或 LEFT OUTER JOIN)
左外连接会返回左表(table1
)中的所有记录,以及右表(table2
)中与左表匹配的记录。如果右表中没有匹配项,左表的记录仍然会被返回,但右表的字段会显示为 NULL
。
示例:
继续使用 employees
和 departments
表,查询所有员工及其所在的部门(包括没有部门的员工)。
SELECT e.emp_name, d.dept_name FROM employees e LEFT JOIN departments d ON e.dept_id = d.dept_id;
结果:
emp_name | dept_name |
---|---|
John | HR |
Jane | IT |
Alice | HR |
Bob | NULL |
-
解释:左外连接返回了所有员工的信息,包括 Bob。由于 Bob 没有部门信息,
dept_name
返回了NULL
。
4. 右外连接(RIGHT JOIN 或 RIGHT OUTER JOIN)
右外连接与左外连接相似,但返回的是右表(table2
)中的所有记录,以及左表(table1
)中与右表匹配的记录。如果左表中没有匹配项,右表的记录仍然会被返回,左表的字段会显示为 NULL
。
示例:
同样查询所有部门及其员工的信息(包括没有员工的部门)。
SELECT e.emp_name, d.dept_name FROM employees e RIGHT JOIN departments d ON e.dept_id = d.dept_id;
结果:
emp_name | dept_name |
---|---|
John | HR |
Alice | HR |
Jane | IT |
NULL | IT |
-
解释:右外连接返回了所有部门的信息。
IT
部门没有员工(虽然有Jane
),但由于LEFT JOIN
结果中没有未匹配的记录,所以返回了NULL
。
5. 总结和区别
-
内连接(INNER JOIN):只返回两个表中匹配的记录,没有匹配的记录会被丢弃。
-
外连接(OUTER JOIN):
-
左外连接(LEFT JOIN):返回左表所有记录和右表中匹配的记录,如果右表没有匹配,右表字段为
NULL
。 -
右外连接(RIGHT JOIN):返回右表所有记录和左表中匹配的记录,如果左表没有匹配,左表字段为
NULL
。
-
左外连接(LEFT JOIN):返回左表所有记录和右表中匹配的记录,如果右表没有匹配,右表字段为
-
内连接 只返回两个表中有交集的部分,而 外连接 返回一个表的所有记录,另一个表的匹配记录,未匹配的地方会用
NULL
填充。