Соединения 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
.
- Использование этих видов соединений позволяет сохранять важные данные, даже если соответствующие строки в связанных таблицах отсутствуют.