Давай почнемо з визначення. RIGHT JOIN — це тип з'єднання, який повертає всі рядки з правої таблиці (саме тому він і називається "правий"), а з лівої — тільки ті, що співпадають. Якщо у лівій таблиці немає даних, які відповідають рядку правої таблиці — будуть повернуті NULL значення для стовпців лівої таблиці.
Ти вже знайомий з LEFT JOIN, це майже те саме, але "дзеркально". Основна різниця — яка таблиця вважається головною: ліва чи права.
Синтаксис RIGHT JOIN
Синтаксис RIGHT JOIN практично ідентичний LEFT JOIN. Ось його структура:
SELECT
стовпці
FROM
таблиця_ліва RIGHT JOIN таблиця_права
ON
умова_об'єднання;
Зверни увагу на порядок таблиць:
- ліва таблиця пишеться до
RIGHT JOIN; - права таблиця вказується після слова
RIGHT JOIN.
Уявімо, що у нас є дві таблиці:
students — список студентів:
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Maria |
| 3 | Alex |
enrollments — записи про зарахування студентів на курси:
| enrollment_id | course_name | student_id |
|---|---|---|
| 101 | Математика | 1 |
| 102 | Інформатика | 2 |
| 103 | Біологія | NULL |
Тепер ми хочемо отримати список усіх записів про зарахування, а також інформацію про студентів, якщо вони існують. Якщо студента не знайдено, ми побачимо NULL замість інформації про студента.
Запит з використанням RIGHT JOIN буде виглядати так:
SELECT
enrollments.enrollment_id,
enrollments.course_name,
students.name AS student_name
FROM
students RIGHT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Результат:
| enrollment_id | course_name | student_name |
|---|---|---|
| 101 | Математика | Otto |
| 102 | Інформатика | Maria |
| 103 | Біологія | NULL |
Тут ми бачимо, що всі записи з таблиці enrollments (права таблиця) потрапили у результат, навіть якщо для них немає співпадінь у таблиці students (ліва таблиця).
Порівняння RIGHT JOIN і LEFT JOIN
Якщо ти вже розумієш, як працює LEFT JOIN, можеш подумати: "А навіщо взагалі потрібен RIGHT JOIN? Чому не використовувати LEFT JOIN?" Гарне питання! Давай розберемо різницю і випадки, коли варто обрати саме RIGHT JOIN.
Напрямок даних
LEFT JOIN: повертає всі рядки з лівої таблиці, незалежно від того, чи є співпадіння у правій таблиці.RIGHT JOIN: повертає всі рядки з правої таблиці, навіть якщо співпадінь у лівій таблиці немає.
Вибір основної таблиці Зазвичай ти обираєш
LEFTабоRIGHTзалежно від того, яка таблиця (ліва чи права) для тебе важливіша і в якому порядку зручно писати запит.Еквівалентність Будь-який
RIGHT JOINможна переписати якLEFT JOINзі зміною порядку таблиць. Наприклад:-- RIGHT JOIN SELECT * FROM students RIGHT JOIN enrollments ON students.student_id = enrollments.student_id; -- Еквівалентний LEFT JOIN SELECT * FROM enrollments LEFT JOIN students ON students.student_id = enrollments.student_id;
Тож, якщо ти не фанат слова RIGHT JOIN, завжди можеш його уникати!
Коли використовувати RIGHT JOIN?
На практиці RIGHT JOIN використовується рідше, ніж LEFT JOIN. Але є сценарії, коли він може бути корисним:
- Якщо права таблиця важливіша (наприклад, вона твоя основна таблиця);
- Коли ти хочеш організувати запит у такому порядку, де права таблиця логічно йде після лівої;
- Якщо ти працюєш з уже написаним кодом, який стандартно використовує
RIGHT JOIN.
Візуальне представлення RIGHT JOIN
Щоб краще зрозуміти RIGHT JOIN, давай глянемо на схему:
Ліва таблиця Права таблиця
[ A ] --------> [ 1 ]
[ B ] --------> [ 2 ]
[ C ] --------> [ 3 ]
[ D ] [ 4 ]
При використанні RIGHT JOIN ми отримаємо всі значення з правої таблиці разом із відповідними даними з лівої таблиці. Те, чого немає у лівій таблиці, буде заповнено NULL.
Практичне завдання
Давай перевіримо твої знання на практиці. Ось завдання:
У тебе є таблиці departments з відділами і employees зі співробітниками: departments:
| department_id | department_name |
|---|---|
| 1 | IT |
| 2 | Продажі |
| 3 | Бухгалтерія |
employees:
| employee_id | name | department_id |
|---|---|---|
| 101 | Peter | 1 |
| 102 | Eva | 2 |
| 103 | Ron | NULL |
Напиши запит з використанням RIGHT JOIN, який поверне список усіх відділів, включаючи співробітників, якщо вони є у відділі, або NULL, якщо співробітників немає.
Спробуй спочатку вирішити задачу самостійно, перш ніж дивитися відповідь.
Відповідь на завдання
Ось як буде виглядати запит:
SELECT
departments.department_name,
employees.name AS employee_name
FROM employees RIGHT JOIN departments
ON employees.department_id = departments.department_id;
Результат буде таким:
| department_name | employee_name |
|---|---|
| IT | Peter |
| Продажі | Eva |
| Бухгалтерія | NULL |
Типові помилки при використанні RIGHT JOIN
Працюючи з RIGHT JOIN, новачки часто стикаються з такими проблемами:
- Забувають про умову об'єднання
ON. Без вказання умов ти отримаєш декартовий добуток таблиць, що може викликати хаос. - Плутають
RIGHT JOINіLEFT JOIN. Якщо ти використовуєш таблиці не в тому порядку, результат буде неправильним. - Не обробляють
NULLзначення. У результатах запитів зRIGHT JOINчасто з'являютьсяNULL, які треба правильно інтерпретувати або замінити за допомогоюCOALESCE().
На цьому все! Тепер ти знаєш, як використовувати RIGHT JOIN, розумієш різницю між RIGHT JOIN і LEFT JOIN, а також зможеш обрати правильний тип об'єднання для своїх задач. У наступній лекції ми детальніше поговоримо про FULL OUTER JOIN, де об'єднуємо все-все з обох таблиць. Удачі у твоїх запитах!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ