Правое внешнее соединение: RIGHT JOIN — все записи из правой таблицы
Что такое RIGHT JOIN и зачем он нужен?
RIGHT JOIN — это способ соединить две таблицы так, чтобы в результат попали все записи из правой таблицы, даже если им нет соответствия в левой. Если совпадений нет, вместо значений из левой таблицы будут NULL.
Представь ситуацию: у тебя есть таблица с клиентами (customers) и таблица с заказами (orders). Некоторые клиенты ещё не делали заказы, но ты хочешь их видеть в отчёте. Вот тут и пригодится RIGHT JOIN!
Синтаксис RIGHT JOIN
SELECT
левая_таблица.столбец,
правая_таблица.столбец
FROM
левая_таблица
RIGHT JOIN
правая_таблица ON левая_таблица.ключ = правая_таблица.ключ
📌 Ключевые моменты:
- RIGHT JOIN включает все строки из правой таблицы (правая_таблица).
- Если в левой таблице (левая_таблица) нет соответствия, то её поля в результате будут NULL.
Пример: Клиенты и их заказы
Допустим, у нас есть две таблицы:
Таблица customers (клиенты):
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(50)
);
INSERT INTO customers VALUES (1, 'Анна'), (2, 'Борис'), (3, 'Виктор');
Таблица orders (заказы):
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
amount DECIMAL(10, 2)
);
INSERT INTO orders VALUES (101, 1, 1500), (102, 1, 800), (103, 2, 500);
Задача: Вывести всех клиентов (даже тех, у кого нет заказов) и их заказы, если они есть.
Решение с RIGHT JOIN
SELECT
c.name,
o.order_id,
o.amount
FROM
orders o
RIGHT JOIN
customers c ON o.customer_id = c.customer_id;
Результат:
| name | order_id | amount |
|---|---|---|
| Анна | 101 | 1500.00 |
| Анна | 102 | 800.00 |
| Борис | 103 | 500.00 |
| Виктор | NULL | NULL |
🔹 Что произошло?
- Все клиенты (customers) попали в результат.
- У Виктора нет заказов, поэтому order_id и amount заполнились NULL.
Чем RIGHT JOIN отличается от LEFT JOIN?
RIGHT JOIN — это зеркальная версия LEFT JOIN.
- LEFT JOIN → Все записи из левой таблицы + совпадения из правой.
- RIGHT JOIN → Все записи из правой таблицы + совпадения из левой.
Пример с теми же таблицами (LEFT JOIN):
SELECT
c.name,
o.order_id,
o.amount
FROM
customers c
LEFT JOIN
orders o ON c.customer_id = o.customer_id;
Результат такой же, но логика другая: мы стартуем от клиентов (LEFT), а не от заказов (RIGHT).
💡 Вывод:
- Если хочешь все записи из первой таблицы → LEFT JOIN.
- Если хочешь все записи из второй таблицы → RIGHT JOIN.
Когда использовать RIGHT JOIN?
-
Анализ данных с приоритетом по правой таблице
Например: выгрузить всех сотрудников, даже если у них нет задач. -
Проверка "пропущенных" записей
sql SELECT * FROM orders o RIGHT JOIN customers c ON o.customer_id = c.customer_id WHERE o.order_id IS NULL;Так найдёшь клиентов без заказов. -
Соединение с дополняющими таблицами
Например, вывести все товары (products), даже если их никто не покупал.
Практическое задание
Даны таблицы:
employees (сотрудники):
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50)
);
INSERT INTO employees VALUES
(1, 'Иван', 'Отдел продаж'),
(2, 'Мария', 'Маркетинг'),
(3, 'Алексей', 'IT');
projects (проекты):
CREATE TABLE projects (
project_id INT PRIMARY KEY,
emp_id INT,
project_name VARCHAR(50)
);
INSERT INTO projects VALUES
(101, 1, 'Проект X'),
(102, 1, 'Проект Y'),
(103, 3, 'Проект Z');
Задача:
Вывести все проекты, даже если у них нет ответственного сотрудника (например, проект мог быть удалён, но запись осталась).
Решение
SELECT
p.project_name,
e.name AS employee_name
FROM
employees e
RIGHT JOIN
projects p ON e.emp_id = p.emp_id;
Ожидаемый результат:
| project_name | employee_name |
|---|---|
| Проект X | Иван |
| Проект Y | Иван |
| Проект Z | Алексей |
Итоги
- RIGHT JOIN возвращает все записи из правой таблицы, даже если нет совпадений в левой.
- Поля без совпадений заполняются
NULL. - Альтернатива
LEFT JOIN, просто "зеркальная" логика. - Полезен для анализа полного охвата данных из одной таблицы.
Теперь ты знаешь, как вытащить "всё из правой таблицы" без потерь! 🎯