---
title: SQL
questionDates:
  q-transfer-0320: '2026-10-01'
seo:
  description: >-
    Тема «SQL» для собеседования Data Engineer. Как вы оптимизируете SQL-запросы
    для повышения производительности? Какие методы нормализации данных вы
    используете и почему?
  title: SQL — Data Engineer
---

[Все темы Data Engineer](/prep/data-engineer)

## <strong>Как вы оптимизируете SQL-запросы для повышения производительности?</strong> [#q-14bee738d69b81318d57ec8a2c878574]

Я оптимизирую SQL запросы следующими методами&#58;

{/* prettier-ignore */}
- <strong>Использование индексов</strong>&#58;

    - Создание индексов на столбцах, используемых в условиях WHERE, JOIN и ORDER BY.

    - Оптимизация запросов за счет уменьшения количества прочитанных строк.

- <strong>Избегание полного сканирования таблиц</strong>&#58;

    - Использование условий WHERE для фильтрации данных.

    - Оптимизация запросов путем уменьшения объема обрабатываемых данных.

- <strong>Оптимизация JOIN операций</strong>&#58;

    - Использование подходящих типов JOIN (INNER, LEFT, RIGHT, FULL).

    - Убедитесь, что столбцы, используемые для соединений, проиндексированы.

- <strong>Избегание подзапросов</strong>&#58;

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

- <strong>Нормализация данных</strong>&#58;

    - Разделение данных на связанные таблицы для уменьшения избыточности и повышения целостности данных.

- <strong>Профилирование и анализ запросов</strong>&#58;

    - Использование EXPLAIN для анализа планов выполнения запросов.

    - Определение узких мест и оптимизация проблемных запросов.

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

1. [EXPLAIN: стоимость, строки и выбор последовательного либо индексного сканирования](https://postgrespro.ru/docs/postgresql/18/using-explain)
1. [Индексы: ускорение поиска и цена изменения данных](https://postgrespro.ru/docs/postgresql/18/indexes-intro)
   :::

---

## <strong>Какие методы нормализации данных вы используете и почему?</strong> [#q-14bee738d69b81679de4d1b8a5e73dcd]

Я использовал следующиме методы нормализации данных&#58;

{/* prettier-ignore */}
- <strong>Первая нормальная форма (</strong><code>1NF</code><strong>)</strong>&#58;

    - Обеспечение атомарности данных (каждое значение — неделимый элемент).

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

- <strong>Вторая нормальная форма (</strong><code>2NF</code><strong>)</strong>&#58;

    - Устранение частичной зависимости (каждое неключевое поле зависит от всего первичного ключа).

    - Разделение таблиц для обеспечения полной функциональной зависимости.

- <strong>Третья нормальная форма (</strong><code>3NF</code><strong>)</strong>&#58;

    - Устранение транзитивной зависимости (каждое неключевое поле зависит только от первичного ключа).

    - Разделение таблиц для обеспечения независимости данных.

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

1. [Нормализация 1NF–3NF: зависимости, аномалии и декомпозиция без потерь](https://citforum.ru/database/advanced_intro/22.shtml)
   :::

---

## <strong>Объясните различия между</strong> <code>JOIN</code> <strong>операциями в SQL.</strong> [#q-14bee738d69b81c4a80aeb10fb577a23]

Основные различия между разными видами джоинов&#58;

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

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

    - Пример&#58;

        ```sql
        SELECT a.*, b.*
        FROM tableA a
        INNER JOIN tableB b ON a.id = b.a_id
        ```

- <code>LEFT JOIN</code> <strong>(</strong><code>LEFT OUTER JOIN</code><strong>)</strong>&#58;

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

    - Пример&#58;

        ```sql
        SELECT a.*, b.*
        FROM tableA a
        LEFT JOIN tableB b ON a.id = b.a_id
        ```

- <code>RIGHT JOIN</code> <strong>(</strong><code>RIGHT OUTER JOIN</code><strong>)</strong>&#58;

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

    - Пример&#58;

        ```sql
        SELECT a.*, b.*
        FROM tableA a
        RIGHT JOIN tableB b ON a.id = b.a_id
        ```

- <code>FULL JOIN</code> <strong>(</strong><code>FULL OUTER JOIN</code><strong>)</strong>&#58;

    - Возвращает все строки, когда есть совпадения в одной из таблиц. Если соответствующих строк нет, возвращает NULL.

    - Пример&#58;

        ```sql
        SELECT a.*, b.*
        FROM tableA a
        FULL JOIN tableB b ON a.id = b.a_id
        ```

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

1. [INNER, LEFT, RIGHT, FULL и CROSS JOIN: условия соединения и NULL](https://postgrespro.ru/docs/postgresql/18/queries-table-expressions)
2. [JOIN: начало разбора. karpov.courses, с 0:08](https://www.youtube.com/watch?v=Xy3RWYKRVb4&t=8s)

:::

---

## Эквивалентны ли CROSS JOIN с WHERE и INNER JOIN ON? [#q-transfer-0320]

Для inner join `FROM a CROSS JOIN b WHERE a.id = b.id` реляционно эквивалентен `FROM a INNER JOIN b ON a.id = b.id`, и зрелый оптимизатор обычно строит одинаковый план. Вторая запись яснее отделяет условие соединения от фильтра результата. Для outer joins перенос условия между `ON` и `WHERE` меняет семантику, потому что `WHERE` может удалить строки, дополненные `NULL`. Формулировку проверяют для конкретного SQL-диалекта, типа join и плана выбранной версии СУБД.

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

1. [CROSS JOIN, INNER JOIN и условия ON/WHERE в PostgreSQL: эквивалентность и отличие внешних соединений](https://postgrespro.ru/docs/postgresql/18/queries-table-expressions)
2. [JOIN: начало разбора. karpov.courses, с 0:08](https://www.youtube.com/watch?v=Xy3RWYKRVb4&t=8s)

:::
