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_id | name | grade |
|---|---|---|
| 1 | Amina | 7 |
| 2 | Ben | 7 |
| 3 | Chloe | 8 |
| 4 | Diego | 8 |
| 5 | Emma | 7 |
loans
| loan_id | student_id | book |
|---|---|---|
| 101 | 1 | Treasure Island |
| 102 | 1 | Matilda |
| 103 | 3 | The Hobbit |
| 104 | 4 | Holes |