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

[Все темы Data Engineer](/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. [Шпаргалка по SQL](https://habr.com/ru/articles/564390/)
   :::

---

## <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. [Шпаргалка по SQL](https://habr.com/ru/articles/564390/)
   :::

---

## <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. [Шпаргалка по SQL](https://habr.com/ru/articles/564390/)
   :::
