Соединения LEFT JOIN и RIGHT JOIN позволяют объединять данные из двух таблиц, включая строки, которые не имеют совпадений. Однако в SQLite официально поддерживается только LEFT JOIN.
RIGHT JOIN в SQLite можно симулировать с помощью перестановки таблиц местами при использовании LEFT JOIN.
1. LEFT JOIN (или LEFT OUTER JOIN)
LEFT JOIN объединяет строки из левой таблицы (указанной первой) со строками из правой таблицы (указанной второй).
Основное правило:
- Все строки из левой таблицы включаются в результат.
- Если в правой таблице нет совпадения, значения из правой таблицы заменяются на
NULL.
Синтаксис LEFT JOIN
SELECT column_list
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
table1 — левая таблица.
table2 — правая таблица.
ON — условие соединения.
Пример использования LEFT JOIN
Таблица employees (Сотрудники):
employee_id | name | department_id
-----------------------------------------
1 | Alice | 1
2 | Bob | 2
3 | Charlie | 3
4 | David | NULL
Таблица departments (Отделы):
department_id | department_name
--------------------------------
1 | IT
2 | Sales
3 | HR
4 | Marketing
Запрос:
SELECT employees.name AS employee_name, departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.department_id;
Результат:
employee_name | department_name
--------------------------------
Alice | IT
Bob | Sales
Charlie | HR
David | NULL
- Включены все строки из таблицы
employees.
- Для
David нет совпадений в departments, поэтому значение department_name — NULL.
2. RIGHT JOIN в SQLite
SQLite не поддерживает RIGHT JOIN напрямую. Однако его можно симулировать, поменяв местами таблицы в запросе LEFT JOIN.
Пример использования RIGHT JOIN (эмуляция)
Для тех же таблиц employees и departments:
Запрос:
SELECT departments.department_name, employees.name AS employee_name
FROM departments
LEFT JOIN employees
ON employees.department_id = departments.department_id;
Результат:
department_name | employee_name
--------------------------------
IT | Alice
Sales | Bob
HR | Charlie
Marketing | NULL
- Здесь роли таблиц поменялись: теперь все строки из
departments (правая таблица в оригинальном запросе RIGHT JOIN) включены в результат.
- Отдел "Marketing" не имеет совпадений в
employees, поэтому employee_name — NULL.
Сравнение LEFT JOIN и RIGHT JOIN
| Особенность |
LEFT JOIN |
RIGHT JOIN |
| Основной фокус |
Включает все строки из левой таблицы |
Включает все строки из правой таблицы |
| Поддержка в SQLite |
Официально поддерживается |
Эмулируется через перестановку таблиц в LEFT JOIN |
Когда использовать LEFT JOIN и RIGHT JOIN?
-
LEFT JOIN:
Используйте, когда важно сохранить все строки из первой (левой) таблицы, даже если у них нет совпадений.
-
RIGHT JOIN:
Используйте, когда важно сохранить все строки из второй (правой) таблицы. В SQLite вместо RIGHT JOIN просто поменяйте таблицы местами в LEFT JOIN.
Заключение
- SQLite поддерживает только
LEFT JOIN, который покрывает большинство потребностей при работе с объединением данных.
- Для эмуляции
RIGHT JOIN можно просто поменять таблицы местами при использовании LEFT JOIN.
- Использование этих видов соединений позволяет сохранять важные данные, даже если соответствующие строки в связанных таблицах отсутствуют.