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

LEFT JOIN и отсутствующие данные

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

Начало урока

LEFT JOIN и отсутствующие данные

Сохраняем каждую строку одной таблицы, даже если у неё нет пары

Главная мысль: INNER JOIN показывает только те строки, у которых есть совпадение в обеих таблицах. А LEFT JOIN сохраняет каждую строку первой (левой) таблицы, и там, где совпадения нет, просто заполняет остальные столбцы значением NULL. Это позволяет увидеть, кого или чего не хватает.
К концу урока вы сможете:
  • объяснить, чем LEFT JOIN отличается от INNER JOIN,
  • читать значения NULL, которые появляются, когда у строки нет пары,
  • использовать RIGHT JOIN и понимать, что это просто зеркало LEFT JOIN,
  • находить строки, у которых нет совпадения, с помощью приёма LEFT JOIN ... IS NULL.

1. Короткое напоминание: INNER JOIN

В прошлом уроке вы познакомились с INNER JOIN. Он склеивает две таблицы по совпадающему столбцу и оставляет строку только тогда, когда совпадение есть с обеих сторон. Если у ученика нет ни одной книги, ученик пропадает из результата. Это удобно, когда нужны только совпавшие пары, но иногда именно пропавшие строки нас и интересуют.

Представьте учителя, которому нужен список всех учеников с их взятыми книгами рядом. Некоторые ученики ещё ничего не брали, но учитель всё равно хочет видеть их имена в списке. INNER JOIN тихо выбросил бы этих учеников. А LEFT JOIN их сохранит.

2. Наш пример: маленькая школьная библиотека

Мы будем использовать две маленькие таблицы на протяжении всего урока. Таблица students (ученики) и таблица loans (по одной строке на каждую взятую книгу).

CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name       VARCHAR(50),
    grade      INT
);

CREATE TABLE loans (
    loan_id    INT PRIMARY KEY,
    student_id INT,
    book       VARCHAR(50)
);

INSERT INTO students VALUES
    (1, 'Amina', 7),
    (2, 'Ben',   7),
    (3, 'Chloe', 8),
    (4, 'Diego', 8),
    (5, 'Emma',  7);

INSERT INTO loans VALUES
    (101, 1, 'Treasure Island'),
    (102, 1, 'Matilda'),
    (103, 3, 'The Hobbit'),
    (104, 4, 'Holes');

Вот что хранит каждая таблица. Обратите внимание: Ben и Emma не брали ни одной книги, поэтому ни одна строка в loans не упоминает их student_id (2 или 5).

students

student_idnamegrade
1Amina7
2Ben7
3Chloe8
4Diego8
5Emma7

loans

loan_idstudent_idbook
1011Treasure Island
1021Matilda
1033The Hobbit
1044Holes

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

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

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

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