SQLite Join
                           
天天向上
发布: 2025-03-04 19:26:35

原创
760 人浏览过

在 SQLite 中,JOIN 用于在查询时合并多个表的数据,通常基于公共列(如外键)。SQLite 支持多种 JOIN 操作,包括:

  1. INNER JOIN(内连接)
  2. LEFT JOIN(左连接)
  3. RIGHT JOIN(右连接,SQLite 不直接支持)
  4. FULL OUTER JOIN(全外连接,SQLite 不直接支持)
  5. CROSS JOIN(交叉连接)
  6. 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.idorders.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 JOINSQLite 不支持,可用 LEFT JOIN 模拟
FULL JOINSQLite 不支持,可用 UNION 组合 LEFT JOINRIGHT JOIN
CROSS JOIN返回两表的笛卡尔积
SELF JOIN在同一表中做 JOIN,通常用于层级数据

如果你有更具体的 JOIN 使用场景,欢迎提问! 😊

更多详细内容请关注其他相关文章。

发表回复 0

Your email address will not be published. Required fields are marked *