Skip to main content

3. Join 用例

什么是 SQL JOIN?

SQL JOIN 用于将两个或多个表中的数据进行关联。常见的 JOIN 类型包括:

  • INNER JOIN:只返回两个表中匹配的记录。
  • LEFT JOIN(或 LEFT OUTER JOIN):返回左表的所有记录,即使右表没有匹配。
  • RIGHT JOIN(或 RIGHT OUTER JOIN):返回右表的所有记录,即使左表没有匹配。
  • FULL JOIN(或 FULL OUTER JOIN):返回左右表的所有匹配和不匹配的记录。
info

JOIN 在 SQL 数据库中至关重要,可用于数据整合、报表分析、数据清洗等场景。

示例数据表

假设有两个表 employeesdepartments,其初始数据如下:

employees

idnamedepartment_id
1Alice1
2Bob2
3CharlieNULL

departments

iddepartment_name
1HR
2Engineering
3Marketing

各种 JOIN 示例

-- INNER JOIN:仅返回匹配的行
SELECT employees.name, departments.department_name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
-- LEFT JOIN:返回所有员工,即使没有匹配的部门
SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;
-- RIGHT JOIN:返回所有部门,即使没有员工
SELECT employees.name, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.id;
-- FULL JOIN:返回所有员工和所有部门,包括没有匹配的记录
SELECT employees.name, departments.department_name
FROM employees
FULL JOIN departments ON employees.department_id = departments.id;

结果示例

INNER JOIN 结果
namedepartment_name
AliceHR
BobEngineering
LEFT JOIN 结果
namedepartment_name
AliceHR
BobEngineering
CharlieNULL
RIGHT JOIN 结果
namedepartment_name
AliceHR
BobEngineering
NULLMarketing

使用 Python 进行 SQL JOIN 查询

import sqlite3

conn = sqlite3.connect(':memory:')
cursor = conn.cursor()

# 创建表
cursor.executescript('''
CREATE TABLE employees (id INT, name TEXT, department_id INT);
INSERT INTO employees VALUES (1, 'Alice', 1), (2, 'Bob', 2), (3, 'Charlie', NULL);

CREATE TABLE departments (id INT, department_name TEXT);
INSERT INTO departments VALUES (1, 'HR'), (2, 'Engineering'), (3, 'Marketing');
''')

# 执行 JOIN 查询
cursor.execute('''
SELECT employees.name, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.id;
''')

for row in cursor.fetchall():
print(row)

conn.close()

结论

SQL JOIN 使得不同表之间的数据可以互相关联和查询。不同的 JOIN 类型适用于不同的业务场景,例如:

  • 使用 INNER JOIN 仅获取匹配的数据。
  • 使用 LEFT JOIN 保留左表的所有数据,即使没有匹配的右表数据。
  • 使用 RIGHT JOIN 保留右表的所有数据,即使没有匹配的左表数据。
  • 使用 FULL JOIN 获取所有数据,包括未匹配的数据。
更多 SQL JOIN 资源