---
title: Основы SQL
seo:
  title: Основы SQL — Product Analyst
  description: "Тема «Основы SQL» для собеседования Product Analyst. Какие типы JOIN вы можете использовать в SQL, и в каких случаях каждый из них будет уместен? Напишите запрос SQL для выбора всех клиентов, у которых есть более одного заказа."
---

[Все темы Product Analyst](/product-analyst)

## <strong>Какие типы</strong> <code>JOIN</code> <strong>вы можете использовать в</strong> <code>SQL</code><strong>, и в каких случаях каждый из них будет уместен?</strong> [#q-14bee738d69b812d8910e586d47bc4af]

В SQL существует несколько основных типов JOIN, каждый из которых используется в зависимости от требуемого результата&#58;

- <code>INNER JOIN</code>&#58; Возвращает строки, когда условие совпадения
  выполнено для обеих таблиц. Используется, когда необходимы данные,
  присутствующие в обеих таблицах.

- <code>LEFT JOIN</code> (или <code>LEFT OUTER JOIN</code>)&#58; Возвращает все
  строки из левой таблицы и сопоставленные строки из правой таблицы; если
  совпадение отсутствует, результат будет содержать <code>NULL</code> с правой
  стороны. Подходит для извлечения всех записей из одной таблицы независимо от
  наличия соответствий в другой.

- <code>RIGHT JOIN</code> (или <code>RIGHT OUTER JOIN</code>)&#58; Аналогичен
  LEFT JOIN, но возвращает все строки из правой таблицы. Используется реже и
  может быть заменён LEFT JOIN с изменением порядка таблиц.

- <code>FULL JOIN</code> (или <code>FULL OUTER JOIN</code>)&#58; Возвращает
  строки, когда есть совпадение в одной из таблиц. Если нет совпадения, то будет
  использовано <code>NULL</code> из таблицы, где совпадения нет. Используется
  для объединения результатов LEFT и RIGHT JOIN.

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

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

1. [Полное руководство по SQL](https://habr.com/ru/articles/564390/)
   :::

---

## <strong>Напишите запрос</strong> <code>SQL</code> <strong>для выбора всех клиентов, у которых есть более одного заказа.</strong> [#q-14bee738d69b817a8f6eebb2729d536c]

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

```sql
SELECT customer_id, COUNT(order_id) AS num_orders
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) > 1;
```

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

1. [Полное руководство по SQL](https://habr.com/ru/articles/564390/)
   :::

---

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

<strong>Использование индексов</strong>&#58; Создание индексов по столбцам,
которые часто используются в условиях <code>WHERE</code>, <code>JOIN</code> и
<code>ORDER BY</code>.

<strong>Ограничение объема возвращаемых данных</strong>&#58; Использование
<code>LIMIT</code> и тщательный выбор только необходимых столбцов в
<code>SELECT</code>.

<strong>Избегание подзапросов, где это возможно</strong>&#58; Замена подзапросов
соединениями, если это улучшает производительность.

<strong>Использование временных таблиц</strong>&#58; Разделение сложных запросов
на несколько простых с использованием временных таблиц может помочь улучшить
читаемость и производительность.

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

1. [Полное руководство по SQL](https://habr.com/ru/articles/564390/)
   :::

---

## <strong>Расскажите о различиях между</strong> <code>WHERE</code> <strong>и</strong> <code>HAVING</code> <strong>в</strong> <code>SQL</code><strong>.</strong> [#q-14bee738d69b8183bdadfa4d46dd4d35]

<code>WHERE</code>&#58; Применяется до агрегации данных, фильтрует строки,
выбираемые из базовой таблицы. Не может использоваться с агрегатными функциями.

<code>HAVING</code>&#58; Применяется после агрегации данных, используется для
фильтрации результатов агрегатных функций. Используется вместе с
<code>GROUP BY</code>.

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

1. [Полное руководство по SQL](https://habr.com/ru/articles/564390/)
   :::

---

## <strong>Как вы можете использовать оконные функции в</strong> <code>SQL</code><strong>? Приведите пример.</strong> [#q-14bee738d69b81ddbd13f5adeafbe4ae]

Оконные функции позволяют выполнять вычисления на наборе строк, связанных с текущей строкой. Пример использования оконной функции для расчёта кумулятивной суммы продаж&#58;

```sql
SELECT order_date, sales_amount,
       SUM(sales_amount) OVER (ORDER BY order_date) AS cumulative_sales
FROM sales;
```

Этот запрос покажет кумулятивную сумму продаж, начиная с первой даты в данных.

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

1. [Полное руководство по SQL](https://habr.com/ru/articles/564390/)
   :::

---

## <strong>Объясните, что такое индекс в</strong> <code>SQL</code> <strong>и как он влияет на производительность запросов.</strong> [#q-14bee738d69b81198249c95f89599d4f]

Индекс в <code>SQL</code> — это структура данных, которая улучшает скорость операций выборки данных, внося при этом затраты на дополнительное дисковое пространство и замедление операций вставки, удаления и обновления. Индексы особенно полезны для ускорения запросов, включающих большие объемы данных и сложные операции сортировки и группировки.

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

1. [Полное руководство по SQL](https://habr.com/ru/articles/564390/)
   :::

---

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

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

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

Этот запрос выбирает сотрудников, работающих в отделах, расположенных в Нью-Йорке.

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

1. [Полное руководство по SQL](https://habr.com/ru/articles/564390/)
   :::
