Перейти к содержанию

Соединение таблиц: INNER JOIN

Программирование SQL Сложность 1/5

Начало урока

Соединение таблиц: INNER JOIN

Собираем строки из двух (или трёх) таблиц в один результат

Главная идея: В настоящих базах данных информацию разбивают на много таблиц, чтобы не повторять её. INNER JOIN снова сшивает эти таблицы вместе, сопоставляя строки по общему значению, чтобы вы прочитали их как один широкий результат.
К концу урока вы сможете:
  • объяснить, почему данные хранятся в нескольких таблицах,
  • написать INNER JOIN с условием ON,
  • использовать короткие псевдонимы таблиц, чтобы запросы были аккуратными,
  • соединить три таблицы в цепочку,
  • предсказать, какие строки INNER JOIN оставит, а какие отбросит.

1. Почему данные лежат во многих таблицах

Представьте, что школа хранит всё в одной огромной таблице: в каждой строке ученика ещё раз повторяется полное название класса и имя учителя. Если Математику ведёт Mr. Adams, вам придётся писать "Math" и "Mr. Adams" для каждого ученика этого класса. Это тратит место и, что хуже, ведёт к ошибкам: исправите имя учителя в одной строке и забудете в остальных — и данные начнут противоречить сами себе.

Аккуратное решение — хранить каждый вид сущности в своей таблице и связывать их ключами (первичные и внешние ключи вы встречали в прошлой теме):

  • таблица students (по одной строке на ученика),
  • таблица classes (по одной строке на класс),
  • таблица teachers (по одной строке на учителя).

Каждая строка ученика хранит маленький class_id вместо полного названия класса. Название написано один раз в classes. Чтобы увидеть название класса рядом с учеником, мы просим базу данных соединить две таблицы обратно.

2. Наша учебная база данных школы

Эту крошечную базу мы будем использовать весь урок. Создайте её один раз, а затем выполняйте запросы ниже.

CREATE TABLE teachers (
    teacher_id   INT PRIMARY KEY,
    teacher_name VARCHAR(50)
);

INSERT INTO teachers VALUES
    (1, 'Mr. Adams'),
    (2, 'Ms. Baker'),
    (3, 'Mr. Carter');
CREATE TABLE classes (
    class_id   INT PRIMARY KEY,
    class_name VARCHAR(50),
    teacher_id INT
);

INSERT INTO classes VALUES
    (101, 'Math',    1),
    (102, 'Science', 2),
    (103, 'Art',     3);
CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name       VARCHAR(50),
    class_id   INT
);

INSERT INTO students VALUES
    (1, 'Alice', 101),
    (2, 'Ben',   101),
    (3, 'Carla', 102),
    (4, 'Dan',   103),
    (5, 'Eve',   NULL);

Итак, три таблицы содержат:

teachers

teacher_idteacher_name
1Mr. Adams
2Ms. Baker
3Mr. Carter

classes

class_idclass_nameteacher_id
101Math1
102Science2
103Art3

students

student_idnameclass_id
1Alice101
2Ben101
3Carla102
4Dan103
5EveNULL

Обратите внимание: у Eve значение class_id = NULL — она ещё не записана в класс. Запомните её; она поможет понять, что INNER JOIN отбрасывает.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя