用 INNER JOIN、易读的别名和精确的连接条件,交叉引用来自两张表的数据。
在 Kodokon 中打开本课真实的数据库从不会把所有东西都存进一张表里:客户在一边,他们的订单在另一边。为了练习本单元,请在浏览器中打开 sqliteonline.com(无需安装),或在终端里启动 sqlite3 工具。先粘贴下面的脚本:它会创建本课要用到的两张表。
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
city TEXT
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL,
amount REAL NOT NULL,
ordered_at TEXT NOT NULL
);
INSERT INTO customers (id, name, city) VALUES
(1, 'Alice', 'Lyon'),
(2, 'Karim', 'Paris'),
(3, 'Mina', 'Nantes');
INSERT INTO orders
(id, customer_id, amount, ordered_at)
VALUES
(1, 1, 49.90, '2026-06-01'),
(2, 1, 15.00, '2026-06-12'),
(3, 2, 120.50, '2026-06-15');INNER JOIN 会根据写在 ON 之后的匹配条件,逐行把两张表拼接起来。这里,每个订单都与 id 等于其 customer_id 的客户相关联。没有匹配的行会被从结果中剔除:什么都没订的 Mina 不会出现。
SELECT customers.name, orders.amount
FROM orders
INNER JOIN customers
ON customers.id = orders.customer_id;反复写完整的表名很快就会变得难以阅读。用 AS 声明的别名会在查询期间为表重新命名。始终给有歧义的列加上前缀:id 在两张表中都存在,所以要写 c.id 或 o.id,绝不要单独写 id。
SELECT c.name, o.amount, o.ordered_at
FROM orders AS o
INNER JOIN customers AS c
ON c.id = o.customer_id
WHERE o.amount > 20
ORDER BY o.amount DESC;