Уяви, що в тебе є дві таблиці: список студентів і список їх записів на курси. Не всі студенти записані на курси, і ти хочеш побачити повний список всіх студентів, включаючи тих, хто з якихось причин курс ще не вибрав. За допомогою INNER JOIN ти побачиш тільки тих, хто записаний на курси, але що робити з іншими студентами? Для цього і існує LEFT JOIN.
LEFT JOIN повертає всі рядки з лівої таблиці (яка вказана першою в запиті) і відповідні рядки з правої таблиці. Якщо відповідників немає, для колонок правої таблиці повертаються NULL значення.
Синтаксис LEFT JOIN
SELECT
таблиця1.колонка1,
таблиця1.колонка2,
таблиця2.колонка1,
таблиця2.колонка2
FROM
таблиця1 LEFT JOIN таблиця2
ON
таблиця1.спільна_колонка = таблиця2.спільна_колонка;
таблиця1— це "ліва" таблиця.таблиця2— це "права" таблиця.спільна_колонка— спільний стовпець, по якому відбувається об'єднання.
Приклад на пальцях
Якщо таблиця students виглядає так:
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Anna |
| 3 | Peter |
А таблиця enrollments виглядає так:
| enrollment_id | student_id | course |
|---|---|---|
| 1 | 1 | Математика |
| 2 | 1 | Фізика |
| 3 | 2 | Біологія |
Тоді запит:
SELECT
students.name,
enrollments.course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
видасть:
| name | course |
|---|---|
| Otto | Математика |
| Otto | Фізика |
| Anna | Біологія |
| Peter | NULL |
Як бачиш, у результаті залишилися всі студенти, навіть Peter, який ще не записався ні на один курс. Для Peter у стовпці course стоїть NULL.
Приклади використання LEFT JOIN
Приклад 1: Отримання списку всіх студентів і їх курсів
Розглянемо задачу: нам треба отримати повний список студентів разом з курсами, на які вони записані, якщо такі є. Якщо студент ще не вибрав курс, це теж має бути показано.
Той самий запит:
SELECT
students.name,
enrollments.course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Результат:
| name | course |
|---|---|
| Otto | Математика |
| Otto | Фізика |
| Anna | Біологія |
| Peter | NULL |
Це класичний приклад використання LEFT JOIN.
Приклад 2: Вивід продуктів і їх продажів
Припустимо, у тебе є дві таблиці:
Таблиця products, що містить всі продукти:
| product_id | product_name |
|---|---|
| 1 | Смартфон |
| 2 | Планшет |
| 3 | Ноутбук |
Таблиця sales, що містить дані про продажі:
| sale_id | product_id | quantity |
|---|---|---|
| 1 | 1 | 5 |
| 2 | 1 | 3 |
| 3 | 2 | 2 |
Тепер ти хочеш побачити всі продукти і кількість їх продажів, включаючи ті продукти, які ще не були продані.
SELECT
products.product_name,
SUM(sales.quantity) AS total_sold
FROM
products LEFT JOIN sales
ON
products.product_id = sales.product_id
GROUP BY
products.product_name;
Результат:
| product_name | total_sold |
|---|---|
| Смартфон | 8 |
| Планшет | 2 |
| Ноутбук | NULL |
Особливості та проблеми при використанні LEFT JOIN
Завжди потрібен NULL?
Іноді LEFT JOIN додає NULL там, де ти його не очікуєш. У таких випадках можна замінити NULL на зрозуміле значення за допомогою функції COALESCE().
SELECT
students.name,
COALESCE(enrollments.course, 'Курс не обрано') AS course
FROM
students LEFT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Результат:
| name | course |
|---|---|
| Otto | Математика |
| Otto | Фізика |
| Anna | Біологія |
| Peter | Курс не обрано |
Зайві дублікати
Якщо дані у правій таблиці містять дублікати, результат запиту буде містити більше рядків, ніж ти очікуєш. Уважно дивись на дані, з якими працюєш, і використовуй DISTINCT, якщо дублікати не потрібні.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ