---
title: 'SQL: запросы и базы данных'
seo:
  description: >-
    Тема «SQL: запросы и базы данных» для собеседования Python Developer. Для
    чего используется LIKE? Что такое обобщенное табличное выражение (CTE) и как
    оно используется?
  title: 'SQL: запросы и базы данных — Python Developer'
---

[Все темы Python Developer](/prep/python-developer)

Подтемы:

- [Основные концепции SQL](#q-14bee738d69b81a78c15fbc766c0980e)
- [Фильтрация строк](#q-14bee738d69b81248f9ac9163a726b03)
- [JOIN Операторы и операции с таблицами](#q-14bee738d69b81cb901de258c5c4f325)
- [PIVOT Таблицы](#q-14bee738d69b8131beecef8d3a259568)
- [PostgreSQL](#q-14bee738d69b81ab8992ed09c86cc7d1)
- [План выполнения запроса](#q-14bee738d69b819abd83efce3c62476d)
- [Реляционные и нереляционные БД](#q-14bee738d69b81359ac5d5eab0985ef2)

## <strong>Для чего используется</strong> <code>LIKE</code><strong>?</strong> [#q-14bee738d69b81a78c15fbc766c0980e]

Оператор <code>LIKE</code> в SQL используется для выполнения поиска в текстовых данных с использованием шаблонов. Он позволяет выбирать строки, которые соответствуют определенному шаблону, который может содержать специальные символы, такие как <code>&#37;</code> (заменяющий любое количество символов) и <code>\_</code> (заменяющий один символ). Это полезно для поиска строк с определенными паттернами, например, имена, которые начинаются или заканчиваются определенной последовательностью символов, или содержат определенные символы в середине строки.

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

1. [Оператор LIKE в SQL](https://tproger.ru/articles/like-sql)
   :::

---

## <strong>Что такое обобщенное табличное выражение</strong> <code>&#40;CTE&#41;</code> <strong>и как оно используется?</strong> [#q-14bee738d69b81b4a7f3fceeda35bbda]

CTE представляет именованный результат запроса, заданный через WITH и доступный внутри одной SQL-команды. Он помогает разбить сложный запрос на части и поддерживает рекурсивные вычисления. CTE не гарантирует ускорение или однократное вычисление&#58; материализация и встраивание в основной запрос зависят от СУБД и плана.

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

1. [Обобщенное табличное выражение в SQL](https://sql-academy.org/ru/guide/operator-with)
2. [Общие табличные выражения. Курсы для инженеров и аналитиков данных, с 0:18](https://www.youtube.com/watch?v=At3z4JQYc8E&t=18s)

:::

---

## <strong>Что представляют собой значения</strong> <code>null</code> <strong>и</strong> <code>NaN</code><strong>, и в чем заключается их различие? Каким образом следует обрабатывать данные с такими типами?</strong> [#q-14bee738d69b81bea722d934dcfc5ad5]

Значения <code>NULL</code> и <code>NaN</code> используются для представления отсутствующих или неопределенных данных.

#### <strong>NULL</strong>&#58;

- В SQL, <code>NULL</code> используется для обозначения отсутствия значения.

- Он не является нулевым значением, а скорее указывает на отсутствие какого-либо значения.

- <code>NULL</code> не равен ни одному другому значению, даже самому себе.

#### <strong>NaN</strong> (Not a Number)&#58;

- <code>NaN</code> используется в числовых вычислениях, чтобы указать на
  неопределенный результат или ошибку.

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

Различие между <code>NULL</code> и <code>NaN</code> заключается в их контексте использования&#58; <code>NULL</code> применяется в SQL для обозначения отсутствия значения, в то время как <code>NaN</code> используется в числовых вычислениях для обозначения неопределенного результата.

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

1. [SQL NULL: трёхзначная логика, IS NULL и IS DISTINCT FROM — PostgreSQL](https://postgrespro.ru/docs/postgresql/18/functions-comparison)
1. [NaN в Python: проверка через math.isnan и отличие от обычного сравнения — документация Python](https://pythondoc.ru/docs/python/3.10/library/math/#math.isnan)
   :::

---

## В чем разница <code>query</code> и <code>key</code>? [#q-14bee738d69b8163913fe7ad1e213898]

В контексте <code>SQL</code>, термины <code>&#34;query&#34;</code> и <code>&#34;key&#34;</code> относятся к разным понятиям&#58;

{/* prettier-ignore */}
1. <code>Query &#40;Запрос&#41;</code>&#58; Это инструкция или набор инструкций, написанных на языке SQL, которые позволяют выполнить операции с данными в базе данных. Запросы могут включать выборку данных, их вставку, обновление, удаление и множество других операций. Например, <code>SELECT &#42; FROM users&#59;</code> — это запрос на выборку всех данных из таблицы пользователей.

1. <code>Key &#40;Ключ&#41;</code>&#58; Это атрибут или набор атрибутов в таблице, который помогает SQL-системе быстро и эффективно организовать, доступить и поддерживать целостность данных. Существуют различные типы ключей&#58;

    - <strong>Primary Key (Первичный ключ)</strong>&#58; Уникально идентифицирует каждую запись в таблице.

    - <strong>Foreign Key (Внешний ключ)</strong>&#58; Обеспечивает ссылочную целостность между двумя таблицами.

    - <strong>Unique Key (Уникальный ключ)</strong>&#58; Гарантирует, что все значения в столбце уникальны.

Таким образом, <code>&#34;query&#34;</code> это команды для работы с данными, а <code>&#34;key&#34;</code> — это элементы структуры базы данных, обеспечивающие управление и целостность данных.

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

1. [Query: выполнение запроса SELECT — руководство PostgreSQL](https://postgrespro.ru/docs/postgresql/18/tutorial-select)
1. [Key: первичные, внешние и уникальные ключи — руководство PostgreSQL](https://postgrespro.ru/docs/postgresql/18/ddl-constraints)
   :::

---

## <strong>Чем отличаются</strong> <code>WHERE</code> <strong>и</strong> <code>HAVING</code><strong>?</strong> [#q-14bee738d69b81248f9ac9163a726b03]

<code>WHERE</code> и <code>HAVING</code> - это два разных оператора в SQL для
фильтрации данных, применяемых в разных контекстах&#58;

#### <code>WHERE</code>&#58;

- <code>WHERE</code> используется для фильтрации строк до группировки или
  агрегации данных.

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

- <code>WHERE</code> применяется к строкам до выполнения агрегации.

#### <code>HAVING</code>&#58;

- <code>HAVING</code> используется для фильтрации результатов агрегации данных
  после выполнения группировки.

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

- <code>HAVING</code> применяется к результатам агрегации после выполнения
  группировки.

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

1. [Оператор HAVING в SQL](https://sql-academy.org/ru/guide/operator-having)

1. [Оператор WHERE в SQL](https://sql-academy.org/ru/guide/conditional-where-operator)
   :::

---

## <strong>Перечислите типы</strong> <code>JOINов</code><strong>, дайте характеристику каждому.</strong> [#q-14bee738d69b81cb901de258c5c4f325]

В SQL существует несколько типов операторов JOIN&#58;

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

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

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

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

    - Возвращает все строки из левой таблицы (первой в запросе), а также строки из правой таблицы, которые имеют совпадения с условием JOIN.

    - Если в правой таблице нет совпадений, возвращается NULL для столбцов правой таблицы.

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

    - Возвращает все строки из правой таблицы (второй в запросе), а также строки из левой таблицы, которые имеют совпадения с условием JOIN.

    - Если в левой таблице нет совпадений, возвращается NULL для столбцов левой таблицы.

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

    - Возвращает все строки из обеих таблиц, совпадающие и несовпадающие по условию JOIN.

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

1. <code>CROSS JOIN</code>&#58;

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

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

1. [INNER, LEFT, RIGHT, FULL и CROSS JOIN: соединение строк — руководство PostgreSQL](https://postgrespro.ru/docs/postgresql/18/queries-table-expressions#QUERIES-JOIN)
   :::

---

## <strong>В одной таблице 2 строчки, в другой 3, сколько минимум строк будет при иннер и лефт джойне? А сколько максимум вне зависимости от джойна?</strong> [#q-14bee738d69b81fb9370ffb9eb4d9d93]

При выполнении <code>INNER JOIN</code> минимальное количество строк равно 0, если нет совпадений между строками обеих таблиц.

При выполнении <code>LEFT JOIN</code> минимальное количество строк равно количеству строк в левой таблице, т.е. 2 строки, так как левые таблицы строки всегда включаются, даже если нет совпадений.

<strong>Максимум строк</strong> (вне зависимости от типа <code>JOIN</code>)&#58;
2\*3=6.

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

1. [Количество строк JOIN: соответствующие пары и декартово произведение N × M — PostgreSQL](https://postgrespro.ru/docs/postgresql/18/queries-table-expressions#QUERIES-JOIN)
   :::

---

## <strong>Расскажите про</strong> <code>PIVOT</code> <strong>таблицы.</strong> [#q-14bee738d69b8131beecef8d3a259568]

<code>PIVOT</code> в SQL - это операция, которая позволяет преобразовывать
строки данных в столбцы. Обычно это используется для трансформации результатов
запроса, где значения из одного столбца (обычно строковые значения) становятся
заголовками столбцов. Это позволяет легче анализировать данные, особенно в
случае агрегированных результатов. <code>PIVOT</code> в SQL использует
агрегирующую функцию, такую как <code>SUM</code> или <code>MAX</code>, чтобы
сгруппировать данные по определенным критериям. Пример использования
<code>PIVOT</code> может выглядеть так&#58;

```sql
SELECT *
FROM (
    SELECT category, year, sales
    FROM sales_table
) AS src
PIVOT (
    SUM(sales)
    FOR year IN ([2019], [2020], [2021])
) AS piv;
```

Этот запрос преобразует строки с данными по категориям и годам в столбцы, где каждый столбец представляет сумму продаж для определенного года, сгруппированного по категории.

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

1. [PIVOT в SQL](http://www.sql-tutorial.ru/ru/book_operator_pivot_unpivot.html)
   :::

---

## <strong>Указана база PosgreSQL. Вы ее самостоятельно разворачивали, в контейнере?</strong> [#q-14bee738d69b81ab8992ed09c86cc7d1]

Опишите свой реальный опыт развёртывания PostgreSQL. Если использовали Docker, расскажите об образе, настройках подключения, постоянном томе для данных и запуске через Docker CLI или Compose. Если самостоятельно базу не разворачивали, укажите это прямо.

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

1. [Запускаем PostgreSQL в Docker](https://habr.com/ru/articles/578744/)
   :::

---

## Как получить план выполнения запроса <code>&#40;EXPLAIN&#47;EXPLAIN ANALYZE&#41;</code>? [#q-14bee738d69b819abd83efce3c62476d]

Чтобы получить план выполнения запроса в PostgreSQL, вы можете использовать команду <code>EXPLAIN</code> перед вашим SQL-запросом. Если вы хотите выполнить запрос и получить его план выполнения, используйте команду <code>EXPLAIN ANALYZE</code>.

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

1. [EXPLAIN и EXPLAIN ANALYZE: получение и чтение плана PostgreSQL](https://postgrespro.ru/docs/postgresql/18/using-explain)
   :::

---

## <strong>В чем отличия между нереляционными</strong> <code>&#40;NoSQL&#41;</code> <strong>и реляционными</strong> <code>&#40;SQL&#41;</code> <strong>базами данных, и для каких целей они обычно применяются?</strong> [#q-14bee738d69b81359ac5d5eab0985ef2]

Нереляционные <code>&#40;NoSQL&#41;</code> и реляционные <code>&#40;SQL&#41;</code> базы данных отличаются по структуре данных, модели запросов и способу обработки информации&#58;

#### <strong>Реляционные базы данных</strong> <code>&#40;SQL&#41;</code>&#58;

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

- Для доступа и обработки данных используется язык структурированных запросов (SQL).

- Подходят для приложений с жесткими требованиями к структуре данных и целостности, таких как финансовые системы, системы управления заказами и CRM.

#### <strong>Нереляционные базы данных</strong> <code>&#40;NoSQL&#41;</code>&#58;

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

- Обычно не имеют жестких схем и позволяют гибко хранить разнородные данные.

- Предоставляют горизонтальное масштабирование и высокую производительность при работе с большими объемами данных.

- Часто используются для хранения и обработки полуструктурированных или неструктурированных данных, таких как веб-логи, социальные сети, аналитика больших данных и системы интернета вещей (IoT).

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

1. [Реляционные и нереляционные БД: модели данных, задачи и варианты масштабирования — AWS](https://aws.amazon.com/ru/compare/the-difference-between-relational-and-non-relational-databases/)
   :::
