Kodokon kodokon.com

INNER JOIN:连接两张表

用 INNER JOIN、易读的别名和精确的连接条件,交叉引用来自两张表的数据。

7 分钟 · 3 题

在 Kodokon 中打开本课

真实的数据库从不会把所有东西都存进一张表里:客户在一边,他们的订单在另一边。为了练习本单元,请在浏览器中打开 sqliteonline.com(无需安装),或在终端里启动 sqlite3 工具。先粘贴下面的脚本:它会创建本课要用到的两张表。

SQL
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 不会出现。

SQL
SELECT customers.name, orders.amount
FROM orders
INNER JOIN customers
  ON customers.id = orders.customer_id;
每个订单连同其客户的名字。

反复写完整的表名很快就会变得难以阅读。用 AS 声明的别名会在查询期间为表重新命名。始终给有歧义的列加上前缀:id 在两张表中都存在,所以要写 c.ido.id,绝不要单独写 id

SQL
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;
简短的别名、一个过滤条件和一次排序:一条典型的专业查询。

知识检测

确认你已牢记本课的重点内容。

  1. 在一次连接中,哪个关键字用来引出两张表之间的匹配条件?
    • WHERE
    • ON
    • HAVING
    • MATCH
  2. 在 customers 和 orders 之间做 INNER JOIN 时,一个没有任何订单的客户会怎样?
    • 它会带着为 NULL 的列出现
    • 它不会出现在结果中
    • 查询会失败
  3. 在一条连接 customers 和 orders 的查询里,为什么要写 c.id 而不是 id?
    • 为了加快查询的执行速度
    • 因为 id 在两张表中都存在,会产生歧义
    • 因为 SQLite 对每一列都要求这样写