在 Oracle 数据库中,表关联(Join)是查询操作中的重要部分,用于根据某些条件将两个或多个表中的数据组合在一起。表关联可以分为内连接(Inner Join)和外连接(Outer Join)两大类。下面分别详细说明这两种连接方式,并给出 SQL 示例和数据举例。
内连接(Inner Join)
内连接返回两个表中满足连接条件的所有行。只有当两个表中的连接字段匹配时,才会返回相应的记录。
SQL 语法
sql
SELECT 列名1, 列名2, ...
FROM 表1
INNER JOIN 表2
ON 表1.列名 = 表2.列名;
数据举例
假设有两个表 employees
和 departments
,结构如下:
-
employees
表:employee_id first_name last_name department_id 101 John Doe 10 102 Jane Smith 20 103 Mike Johnson 30 -
departments
表:department_id department_name 10 HR 20 Finance 40 IT
内连接示例
sql
SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
INNER JOIN departments
ON employees.department_id = departments.department_id;
查询结果
first_name | last_name | department_name |
---|---|---|
John | Doe | HR |
Jane | Smith | Finance |
外连接(Outer Join)
外连接分为左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join)。外连接返回两个表中满足连接条件的所有行,以及一个表中不满足条件但另一个表中满足条件的行。
左外连接(Left Outer Join)
左外连接返回左表中的所有行,以及右表中满足连接条件的行。如果右表中没有匹配的行,则结果集中右表的列值为 NULL。
SQL 语法
sql
SELECT 列名1, 列名2, ...
FROM 表1
LEFT OUTER JOIN 表2
ON 表1.列名 = 表2.列名;
左外连接示例
sql
SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
LEFT OUTER JOIN departments
ON employees.department_id = departments.department_id;
查询结果
first_name | last_name | department_name |
---|---|---|
John | Doe | HR |
Jane | Smith | Finance |
Mike | Johnson | NULL |
右外连接(Right Outer Join)
右外连接返回右表中的所有行,以及左表中满足连接条件的行。如果左表中没有匹配的行,则结果集中左表的列值为 NULL。
SQL 语法
sql
SELECT 列名1, 列名2, ...
FROM 表1
RIGHT OUTER JOIN 表2
ON 表1.列名 = 表2.列名;
右外连接示例
sql
SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
RIGHT OUTER JOIN departments
ON employees.department_id = departments.department_id;
查询结果
first_name | last_name | department_name |
---|---|---|
John | Doe | HR |
Jane | Smith | Finance |
NULL | NULL | IT |
全外连接(Full Outer Join)
全外连接返回两个表中的所有行,无论是否满足连接条件。如果某个表中没有匹配的行,则结果集中该表的列值为 NULL。
注意:Oracle 不直接支持 FULL OUTER JOIN
语法,但可以通过 UNION
操作符实现相同的效果。
SQL 语法
sql
SELECT 列名1, 列名2, ...
FROM 表1
LEFT OUTER JOIN 表2
ON 表1.列名 = 表2.列名
UNION
SELECT 列名1, 列名2, ...
FROM 表1
RIGHT OUTER JOIN 表2
ON 表1.列名 = 表2.列名;
全外连接示例
sql
SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
LEFT OUTER JOIN departments
ON employees.department_id = departments.department_id
UNION
SELECT employees.first_name, employees.last_name, departments.department_name
FROM employees
RIGHT OUTER JOIN departments
ON employees.department_id = departments.department_id;
查询结果
first_name | last_name | department_name |
---|---|---|
John | Doe | HR |
Jane | Smith | Finance |
Mike | Johnson | NULL |
NULL | NULL | IT |