SQLite Join
在 SQLite 中,JOIN 用于在查询时合并多个表的数据,通常基于公共列(如外键)。SQLite 支持多种 JOIN 操作,包括:
- INNER JOIN(内连接)
- LEFT JOIN(左连接)
- RIGHT JOIN(右连接,SQLite 不直接支持)
- FULL OUTER JOIN(全外连接,SQLite 不直接支持)
- CROSS JOIN(交叉连接)
- SELF JOIN(自连接)
1. INNER JOIN(内连接)
作用:仅返回两个表中匹配的行。
示例:查询订单的用户信息
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT
);
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY,
user_id INTEGER,
product TEXT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
INSERT INTO users (id, name) VALUES (1, 'Alice'), (2, 'Bob');
INSERT INTO orders (order_id, user_id, product) VALUES (101, 1, 'Laptop'), (102, 2, 'Phone');
SELECT users.name, orders.product
FROM users
INNER JOIN orders ON users.id = orders.user_id;
结果
name | product
-------------------
Alice | Laptop
Bob | Phone
解释:
INNER JOIN
只返回users.id
和orders.user_id
匹配 的行。
2. LEFT JOIN(左连接)
作用:返回 左表 的所有行,即使右表没有匹配项,右表数据会以 NULL
填充。
示例:查询所有用户的订单信息(包括未下单的用户)
SELECT users.name, orders.product
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
结果
name | product
-------------------
Alice | Laptop
Bob | Phone
Charlie | NULL
解释:
LEFT JOIN
返回users
所有行,即使orders
没有匹配的数据(Charlie
没有订单,product
显示NULL
)。
3. RIGHT JOIN(右连接,SQLite 不支持)
SQLite 不支持 RIGHT JOIN
,但可以通过交换表的 LEFT JOIN
来实现:
SELECT users.name, orders.product
FROM orders
LEFT JOIN users ON orders.user_id = users.id;
这样就模拟了 RIGHT JOIN
。
4. FULL OUTER JOIN(全外连接,SQLite 不支持)
SQLite 不支持 FULL OUTER JOIN
,但可以用 LEFT JOIN
+ UNION
+ RIGHT JOIN
组合:
SELECT users.name, orders.product
FROM users
LEFT JOIN orders ON users.id = orders.user_id
UNION
SELECT users.name, orders.product
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
这样能返回所有匹配和不匹配的行。
5. CROSS JOIN(交叉连接)
作用:返回两张表的笛卡尔积(即每一行与另一表的所有行组合)。
示例
SELECT users.name, orders.product
FROM users
CROSS JOIN orders;
如果 users
有 2 行,orders
有 3 行,结果将是 2 × 3 = 6
行。
6. SELF JOIN(自连接)
作用:在同一张表上做连接,通常用于层级结构查询(如员工-经理关系)。
示例:查询员工的上级
CREATE TABLE employees (
id INTEGER PRIMARY KEY,
name TEXT,
manager_id INTEGER -- 该员工的上级 ID
);
INSERT INTO employees (id, name, manager_id) VALUES
(1, 'CEO', NULL),
(2, 'Manager A', 1),
(3, 'Manager B', 1),
(4, 'Employee X', 2),
(5, 'Employee Y', 2);
SELECT e1.name AS employee, e2.name AS manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.id;
结果
employee | manager
---------------------
CEO | NULL
Manager A | CEO
Manager B | CEO
Employee X | Manager A
Employee Y | Manager A
总结
JOIN 类型 | 作用 |
---|---|
INNER JOIN | 返回两个表中匹配的行 |
LEFT JOIN | 返回左表所有行,右表无匹配则 NULL |
RIGHT JOIN | SQLite 不支持,可用 LEFT JOIN 模拟 |
FULL JOIN | SQLite 不支持,可用 UNION 组合 LEFT JOIN 和 RIGHT JOIN |
CROSS JOIN | 返回两表的笛卡尔积 |
SELF JOIN | 在同一表中做 JOIN ,通常用于层级数据 |
如果你有更具体的 JOIN
使用场景,欢迎提问! 😊
更多详细内容请关注其他相关文章。