---
title: Объединение данных
seo:
  title: Объединение данных — Java Developer
  description: Тема «Объединение данных» для собеседования Java Developer. Что такое JOIN? Какие существуют типы JOIN?
---

[Все темы Java Developer](/java-developer)

## <strong>Что такое</strong> <code>JOIN</code><strong>?</strong> [#q-14bee738d69b81069c04e472293667ba]

<code>JOIN</code> используется для объединения строк из двух или более таблиц на
основе связанного столбца между ними.

:::note[Ссылки для изучения]

1. [Основы по SQL. Самоучитель](https://www.opennet.ru/docs/RUS/rusql/)
   :::

---

## <strong>Какие существуют типы</strong> <code>JOIN</code><strong>?</strong> [#q-14bee738d69b814b9079d87becc37646]

<strong>Виды</strong> <code>JOIN</code>&#58;

{/* prettier-ignore */}
1. <code>INNER JOIN</code><strong>&#58;</strong>

    - Возвращает только те строки, у которых есть соответствующие строки в обеих таблицах.

    ```sql
    SELECT * FROM table1
    INNER JOIN table2 ON table1.id = table2.id;
    ```

1. <code>LEFT JOIN</code> <strong>(или</strong> <code>LEFT OUTER JOIN</code><strong>)&#58;</strong>

    - Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если нет соответствия, заполняет правые столбцы <code>NULL</code>.

    ```sql
    SELECT * FROM table1
    LEFT JOIN table2 ON table1.id = table2.id;
    ```

1. <code>RIGHT JOIN</code> <strong>(или</strong> <code>RIGHT OUTER JOIN</code><strong>)&#58;</strong>

    - Возвращает все строки из правой таблицы и соответствующие строки из левой таблицы. Если нет соответствия, заполняет левые столбцы <code>NULL</code>.

    ```sql
    SELECT * FROM table1
    RIGHT JOIN table2 ON table1.id = table2.id;
    ```

1. <code>FULL JOIN</code> <strong>(или</strong> <code>FULL OUTER JOIN</code><strong>)&#58;</strong>

    - FULL JOIN возвращает все совпавшие пары, а также строки без пары с обеих сторон. Для отсутствующей стороны соответствующие столбцы заполняются NULL.

    ```sql
    SELECT * FROM table1
    FULL JOIN table2 ON table1.id = table2.id;
    ```

#### Пример&#58;

```sql
SELECT employees.name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;
```

Этот запрос соединяет таблицы <code>employees</code> и <code>departments</code>, возвращая только те строки, у которых есть соответствие по <code>department_id</code>.

:::note[Ссылки для изучения]

1. [Основы по SQL. Самоучитель](https://www.opennet.ru/docs/RUS/rusql/)
   :::

---

## <strong>Что лучше использовать</strong> <code>JOIN</code> <strong>или подзапросы?</strong> [#q-14bee738d69b8168bd6ce555a652f962]

<code>JOIN</code> <strong>vs Подзапросы&#58;</strong>

#### JOIN

- Производительность зависит от плана, данных и индексов. Оптимизатор может превратить JOIN и подзапрос в одинаковый план; сравнивайте EXPLAIN ANALYZE, сохраняя семантику и число строк результата.

- <strong>Читаемость&#58;</strong> Легче читать и понимать при объединении
  данных из нескольких таблиц.

- <strong>Использование&#58;</strong> Предпочтителен для выборки данных из
  связанных таблиц.

#### Подзапросы

- Коррелированный подзапрос иногда требует повторных вычислений, но СУБД может его преобразовать. Для проверки существования EXISTS часто точнее выражает задачу, чем JOIN, который может размножить строки.

- <strong>Читаемость&#58;</strong> Может быть более понятным для выполнения
  простых фильтраций.

- <strong>Использование&#58;</strong> Удобен для вложенных условий и вычислений,
  которые сложно выразить с помощью JOIN.

#### Рекомендации

- Используйте <code>JOIN</code> для объединения таблиц.

- Используйте подзапросы для фильтрации данных или когда логика сложнее выражается с помощью подзапросов.

#### Примеры&#58;

<code>JOIN</code>
<strong>&#58;</strong>

```sql
SELECT e.name, d.name
FROM employees e
JOIN departments d ON e.department_id = d.id;
```

<code>Подзапрос</code>
<strong>&#58;</strong>

```sql
SELECT name
FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'New York');
```

:::note[Ссылки для изучения]

1. [Основы по SQL. Самоучитель](https://www.opennet.ru/docs/RUS/rusql/)
   :::
