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 数据库中至关重要,可用于数据整合、报表分析、数据清洗等场景。
示例数据表
假设有两个表 employees 和 departments,其初始数据如下:
employees 表
| id | name | department_id |
|---|---|---|
| 1 | Alice | 1 |
| 2 | Bob | 2 |
| 3 | Charlie | NULL |
departments 表
| id | department_name |
|---|---|
| 1 | HR |
| 2 | Engineering |
| 3 | Marketing |
各种 JOIN 示例
- SQL
-- 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 结果
| name | department_name |
|---|---|
| Alice | HR |
| Bob | Engineering |
LEFT JOIN 结果
| name | department_name |
|---|---|
| Alice | HR |
| Bob | Engineering |
| Charlie | NULL |
RIGHT JOIN 结果
| name | department_name |
|---|---|
| Alice | HR |
| Bob | Engineering |
| NULL | Marketing |
使用 Python 进行 SQL JOIN 查询
- Python
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获取所有数据,包括未匹配的数据。