📅  最后修改于: 2023-12-03 14:47:39.426000             🧑  作者: Mango
在 SQLite 中,外部联接是一种查询数据表中不同记录之间的方式。它允许您从不同的数据表中获取数据,并将它们匹配在一起,以便对数据进行更全面的分析。
外部联接是一种在两个或多个数据表之间查询数据的方法。当您需要从不同的数据表中获取数据时,外部联接非常有用,因为它可以将这些数据匹配在一起。它允许您获取不仅存在于两个数据表中的数据,还可以获取在一个表中存在的数据,但在另一个表中不存在的数据。
外部联接可以分为左联接、右联接和全联接。在 SQLite 中,您可以使用 LEFT OUTER JOIN、RIGHT OUTER JOIN 和 FULL OUTER JOIN 来执行这些联接操作。
左外联接(LEFT OUTER JOIN)允许您从左侧的数据表中获取所有记录并且匹配右侧数据表的匹配记录。
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name=table2.column_name;
右外联接(RIGHT OUTER JOIN)允许您从右侧的数据表中获取所有记录并且匹配左侧数据表的匹配记录。
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name=table2.column_name;
全外联接(FULL OUTER JOIN)允许您从所有数据表中检索所有有匹配和无匹配记录的数据。
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name=table2.column_name;
让我们通过一个示例来说明 SQLite 外部联接的用法。假设你有两个数据表:employees 和 departments。employees 数据表包含员工的详细信息,departments 数据表包含部门的详细信息。我们可以使用外部联接来获取这些表之间的相关信息。
首先我们需要创建两张数据表:employees 和 departments。
CREATE TABLE employees (
employee_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
department_id INTEGER NOT NULL
);
CREATE TABLE departments (
department_id INTEGER PRIMARY KEY,
department_name TEXT NOT NULL,
manager_id INTEGER NOT NULL,
location_id INTEGER NOT NULL
);
接下来,我们需要向数据表中插入一些数据,以便在外部联接中使用它们。
INSERT INTO employees (employee_id, first_name, last_name, email, department_id)
VALUES (1, 'John', 'Doe', 'johndoe@company.com', 1),
(2, 'Jane', 'Doe', 'janedoe@company.com', 2),
(3, 'Bob', 'Smith', 'bobsmith@company.com', 1),
(4, 'Alice', 'Johnson', 'alicejohnson@company.com', 3);
INSERT INTO departments (department_id, department_name, manager_id, location_id)
VALUES (1, 'Marketing', 3, 2),
(2, 'Sales', 1, 1),
(3, 'Finance', 2, 3),
(4, 'Human Resources', 4, 1);
接下来,我们将使用外部联接来查询数据表中的数据。
左外联接(LEFT OUTER JOIN)允许我们从左侧的数据表中获取所有记录并且匹配右侧数据表的匹配记录。
假设我们要获取所有员工的详细信息和所在部门的详细信息,使用以下查询:
SELECT employees.employee_id, employees.first_name, employees.last_name, departments.department_name
FROM employees
LEFT OUTER JOIN departments
ON employees.department_id = departments.department_id;
输出结果如下:
1|John|Doe|Marketing
2|Jane|Doe|Sales
3|Bob|Smith|Marketing
4|Alice|Johnson|
以上结果表明 Alice 没有被分配到任何部门。
右外联接(RIGHT OUTER JOIN)允许我们从右侧的数据表中获取所有记录并且匹配左侧数据表的匹配记录。
假设我们要获取所有部门的详细信息和当前负责该部门的员工的详细信息,使用以下查询:
SELECT departments.department_name, employees.first_name, employees.last_name
FROM departments
RIGHT OUTER JOIN employees
ON departments.department_id = employees.department_id;
输出结果如下:
Marketing|Bob|Smith
Marketing|John|Doe
Sales|Jane|Doe
Finance|||
Human Resources|Alice|Johnson
以上结果表明 Finance 没有员工被分配到该部门。
全外联接(FULL OUTER JOIN)允许我们从所有数据表中检索所有有匹配和无匹配记录的数据。
在 SQLite 中,不支持完整的外部联接,但可以通过联合操作和子查询来模拟。
假设我们要获取所有员工的详细信息和所在部门的详细信息,包括未分配到任何部门的员工和没有负责任何员工的部门,可以使用以下查询:
SELECT employees.employee_id, 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.employee_id, employees.first_name, employees.last_name, departments.department_name
FROM departments
LEFT OUTER JOIN employees
ON departments.department_id = employees.department_id
WHERE employees.employee_id IS NULL;