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. Строки без совпадения выпадают из результата: Мина, которая ничего не заказала, не появится.

SQL
SELECT customers.name, orders.amount
FROM orders
INNER JOIN customers
  ON customers.id = orders.customer_id;
Каждый заказ вместе с именем своего клиента.

Повторять полные имена таблиц быстро становится нечитаемо. Псевдоним, объявленный через AS, переименовывает таблицу на время запроса. Всегда добавляй префикс к неоднозначным столбцам: id есть в обеих таблицах, поэтому пиши c.id или o.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. При INNER JOIN между customers и orders что происходит с клиентом, у которого нет заказов?
    • Он появляется со столбцами NULL
    • Он отсутствует в результате
    • Запрос завершается ошибкой
  3. Почему в запросе, который соединяет customers и orders, писать c.id, а не id?
    • Чтобы ускорить выполнение запроса
    • Потому что id есть в обеих таблицах и был бы неоднозначным
    • Потому что SQLite требует это для каждого столбца