mysql 的内连接、左连接、右连接有什么区别?

假设有两个表:

employees(员工表): 包含员工ID (emp_id) 和姓名 (name)。

departments(部门表): 包含部门ID (dept_id) 和部门名称 (dept_name)。并且假设不是每个员工都有明确的部门分配。

内连接 (INNER JOIN)

内连接只返回两个表中匹配的行。如果在一边的表中没有匹配项,那么这些行就不会出现在结果集中。

SQL 示例:

SELECT employees.name, departments.dept_name

FROM employees

INNER JOIN departments ON employees.emp_id = departments.dept_id;

结果: 仅显示那些在employees表中有对应部门ID的员工及其部门名称。

左连接 (LEFT JOIN 或 LEFT OUTER JOIN)

左连接返回左表(LEFT JOIN后面的表)的所有行,即使在右表中没有匹配。如果右表中没有匹配项,则结果集中右表的部分将为NULL。

SQL 示例:

SELECT employees.name, departments.dept_name

FROM employees

LEFT JOIN departments ON employees.emp_id = departments.dept_id;

结果: 显示所有员工的姓名,即使某些员工没有分配到部门(这些员工的dept_name字段值为NULL)。

右连接 (RIGHT JOIN 或 RIGHT OUTER JOIN)

右连接与左连接相反,它返回右表(RIGHT JOIN后面的表)的所有行,即使在左表中没有匹配。如果左表中没有匹配项,则结果集中左表的部分将为NULL。

SQL 示例:

SELECT employees.name, departments.dept_name

FROM employees

RIGHT JOIN departments ON employees.emp_id = departments.dept_id;

结果: 显示所有部门名称,即使某些部门还没有任何员工分配(这些行的name字段值为NULL)。

总结

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

左连接:返回左表的所有记录,加上右表中匹配的记录,右表没有匹配的记录以NULL填充。

右连接:返回右表的所有记录,加上左表中匹配的记录,左表没有匹配的记录以NULL填充。