---
title: Запросы и операции
seo:
  title: Запросы и операции — Systems Analyst
  description: Тема «Запросы и операции» для собеседования Systems Analyst. Какие виды JOIN запросов вы знаете? Напишите JOIN для получения сотрудников и названий их отделов.
---

[Все темы Systems Analyst](/systems-analyst)

## <strong>Какие виды</strong> <code>JOIN</code> <strong>запросов вы знаете?</strong> [#q-14bee738d69b812e811fc40196c3636b]

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

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

1. <code>LEFT JOIN</code> <strong>(или</strong> <code>LEFT OUTER JOIN</code>
   <strong>)</strong>&#58; Возвращает все строки из левой таблицы и
   соответствующие строки из правой таблицы. Если нет соответствия, то значения
   в правой таблице будут NULL.

1. <code>RIGHT JOIN</code> <strong>(или</strong> <code>RIGHT OUTER JOIN</code>
   <strong>)</strong>&#58; Возвращает все строки из правой таблицы и
   соответствующие строки из левой таблицы. Если нет соответствия, то значения в
   левой таблице будут NULL.

1. <code>FULL JOIN</code> <strong>(или</strong> <code>FULL OUTER JOIN</code>
   <strong>)</strong>&#58; Возвращает все строки из обеих таблиц. Если нет
   соответствия, то значения будут NULL в соответствующей таблице.

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

Эти типы JOIN позволяют объединять данные из разных таблиц по определенным условиям, что является мощным инструментом для работы с реляционными базами данных.

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

1. [Шпаргалка по SQL](https://habr.com/ru/articles/564390/)
   :::

---

## Напишите JOIN для получения сотрудников и названий их отделов. [#q-14bee738d69b8145a880d88cfbace09d]

Даны две таблицы&#58;

Таблица "<code>Employees</code>"&#58;

- employee_id

- employee_name

- department_id

Таблица "<code>Departments</code>"&#58;

- department_id

- department_name

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

SQL запрос&#58;

```sql
SELECT e.employee_name, d.department_name
FROM Employees e
JOIN Departments d ON e.department_id = d.department_id;
```

Этот запрос соединяет таблицы Employees и Departments по department_id и выбирает имена сотрудников и названия их отделов.

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

1. [Шпаргалка по SQL](https://habr.com/ru/articles/564390/)
   :::

---

## <strong>Задача SQL. Дают таблицы. Напишите</strong> <code>SELECT</code> <strong>с такими-то условиями запроса (задача на</strong> <code>GROUP BY</code><strong>).</strong> [#q-14bee738d69b81848069cc08e8ebbb98]

Дана таблица "<code>Orders</code>"&#58;

- order_id

- customer_id

- order_date

- order_amount

Напишите SQL-запрос для вычисления суммарного заказанного объема (<code>order_amount</code>) для каждого клиента (<code>customer_id</code>) за каждый год (используя год из столбца <code>order_date</code>).

SQL запрос&#58;

```sql
SELECT customer_id, YEAR(order_date) AS order_year, SUM(order_amount) AS total_amount
FROM Orders
GROUP BY customer_id, YEAR(order_date);
```

Этот запрос группирует данные по <code>customer_id</code> и году заказа (извлеченному из столбца <code>order_date</code>), вычисляя общий заказанный объем (<code>total_amount</code>) для каждого клиента за каждый год.

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

1. [Шпаргалка по SQL](https://habr.com/ru/articles/564390/)
   :::

---

## <strong>Назовите все способы в SQL выбрать данные из первой таблицы, которых нет во второй таблице (</strong><code>NOT IN</code><strong>,</strong> <code>NOT EXISTS</code> <strong>и др).</strong> [#q-14bee738d69b81cfb0f7d5a3446a3402]

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

1. <code>NOT IN</code>
   <strong>&#58;</strong>

   ```sql
   SELECT column_list
   FROM table1
   WHERE column_name NOT IN (SELECT column_name FROM table2);
   ```

   NOT IN требует внимания к NULL&#58; если подзапрос вернул NULL, несовпавшее сравнение может дать UNKNOWN, и строка не попадёт в WHERE. Для поиска отсутствующих совпадений часто проще использовать NOT EXISTS.

1. <code>NOT EXISTS</code>
   <strong>&#58;</strong>

   ```sql
   SELECT column_list
   FROM table1 t1
   WHERE NOT EXISTS (SELECT 1 FROM table2 t2 WHERE t2.column_name = t1.column_name);
   ```

   Этот способ использует предикат <code>NOT EXISTS</code>, который проверяет, существует ли подзапрос (в данном случае, совпадение по <code>column_name</code> в <code>table2</code>) и возвращает строки из <code>table1</code>, для которых подзапрос не вернул результат.

1. <code>LEFT JOIN</code> <strong>с</strong> <code>IS NULL</code>
   <strong>&#58;</strong>

   ```sql
   SELECT t1.column_list
   FROM table1 t1
   LEFT JOIN table2 t2 ON t1.column_name = t2.column_name
   WHERE t2.column_name IS NULL;
   ```

   Здесь используется LEFT JOIN для соединения <code>table1</code> и <code>table2</code> по <code>column_name</code>, и затем в WHERE условие проверяется, что вторая таблица не содержит совпадений (т.е., <code>t2&#46;column_name IS NULL</code>).

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

1. [Шпаргалка по SQL](https://habr.com/ru/articles/564390/)
   :::

---

## <strong>Чем</strong> <code>LEFT JOIN</code> <strong>отличается от</strong> <code>FULL JOIN</code><strong>?</strong> [#q-14bee738d69b81819ac6c2f405a03c57]

В SQL операторы <code>LEFT JOIN</code> и <code>FULL JOIN</code> являются разновидностями операции объединения таблиц (<code>JOIN</code>). Основное различие между ними заключается в том, как они обрабатывают строки, которые не имеют совпадений между соединяемыми таблицами&#58;

{/* prettier-ignore */}
1. <code>LEFT JOIN</code> <strong>(или</strong> <code>LEFT OUTER JOIN</code><strong>)&#58;</strong>

    - Возвращает все строки из левой таблицы (<code>table1</code>), включая строки, которые не имеют соответствия в правой таблице (<code>table2</code>).

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

    - По сути, <code>LEFT JOIN</code> сохраняет все строки из левой таблицы и соответствующие им строки из правой таблицы (если они есть).

    Пример&#58;

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

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

    - Возвращает все строки из обеих таблиц (<code>table1</code> и <code>table2</code>), даже если для них нет соответствующих строк в другой таблице.

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

    Пример&#58;

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

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

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

1. [Шпаргалка по SQL](https://habr.com/ru/articles/564390/)
   :::
