后端-内连接(INNER JOIN),左外连接(LEFT JOIN)和右外连接(RIGHT JOIN)的区别

时间:2024-11-06 19:44:13

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

示例:

继续使用 employeesdepartments 表,查询所有员工及其所在的部门(包括没有部门的员工)。

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
  • 内连接 只返回两个表中有交集的部分,而 外连接 返回一个表的所有记录,另一个表的匹配记录,未匹配的地方会用 NULL 填充。