SQL语句:等值链接,外连接问题

在SQL中,连接(JOIN)操作用于从两个或多个表中基于相关的列组合记录。连接分为几种类型,包括等值连接(Equi Join)和外连接(Outer Join)。下面详细解释这两种连接及其用法。

1. 等值连接(Equi Join)

等值连接是最常见的连接类型,使用相等运算符(=)将两个表中的相关列连接起来。结果集包含两个表中满足连接条件的所有记录。

示例

假设有两个表:employeesdepartments

sql
-- employees 表 +----+----------+-------------+ | id | name | department_id| +----+----------+-------------+ | 1 | Alice | 1 | | 2 | Bob | 2 | | 3 | Charlie | 1 | +----+----------+-------------+ -- departments 表 +----+------------+ | id | name | +----+------------+ | 1 | HR | | 2 | Engineering| +----+------------+

使用等值连接查询员工及其所属部门:

sql
SELECT employees.name, departments.name FROM employees JOIN departments ON employees.department_id = departments.id;

结果

sql
+---------+------------+ | name | name | +---------+------------+ | Alice | HR | | Bob | Engineering| | Charlie | HR | +---------+------------+

2. 外连接(Outer Join)

外连接包括左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。外连接用于返回即使不满足连接条件的记录。

2.1 左外连接(Left Outer Join)

左外连接返回左表中的所有记录,以及右表中满足连接条件的记录。对于右表中没有匹配的记录,结果集中相应的右表列将包含NULL。

sql
SELECT employees.name, departments.name FROM employees LEFT JOIN departments ON employees.department_id = departments.id;

结果

sql
+---------+------------+ | name | name | +---------+------------+ | Alice | HR | | Bob | Engineering| | Charlie | HR | +---------+------------+

如果employees表中有一个员工没有部门,结果会是:

sql
+---------+------------+ | name | name | +---------+------------+ | Alice | HR | | Bob | Engineering| | Charlie | HR | | Dave | NULL | +---------+------------+

2.2 右外连接(Right Outer Join)

右外连接返回右表中的所有记录,以及左表中满足连接条件的记录。对于左表中没有匹配的记录,结果集中相应的左表列将包含NULL。

sql
SELECT employees.name, departments.name FROM employees RIGHT JOIN departments ON employees.department_id = departments.id;

结果

sql
+---------+------------+ | name | name | +---------+------------+ | Alice | HR | | Bob | Engineering| | Charlie | HR | | NULL | Finance | +---------+------------+

2.3 全外连接(Full Outer Join)

全外连接返回两个表中的所有记录。如果左表或右表中没有匹配的记录,相应的列将包含NULL。

sql
SELECT employees.name, departments.name FROM employees FULL OUTER JOIN departments ON employees.department_id = departments.id;

结果

sql
+---------+------------+ | name | name | +---------+------------+ | Alice | HR | | Bob | Engineering| | Charlie | HR | | Dave | NULL | | NULL | Finance | +---------+------------+

总结

  • 等值连接:使用等号(=)将两个表连接,返回满足连接条件的记录。
  • 左外连接:返回左表的所有记录,即使右表中没有匹配的记录。
  • 右外连接:返回右表的所有记录,即使左表中没有匹配的记录。
  • 全外连接:返回两个表的所有记录,包括那些没有匹配的记录。

关键字

SQL,等值连接,Equi Join,外连接,Outer Join,左外连接,Left Outer Join,右外连接,Right Outer Join,全外连接,Full Outer Join,连接条件,NULL,数据库查询