Зарегистрируйтесь, чтобы продолжить обучение

Подзапрос Продвинутые SQL-запросы

Подзапрос SQL - это запрос, который включается в другой запрос. Подзапросы позволяют использовать результат выполнения внутреннего запроса во внешнем запросе, что позволяет строить сложные запросы из более простых.

Подзапрос SQL

Применение подзапросов

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

Рассмотрим таблицу products:

Table 1. products
id product_name price

10928473

Стиральная машина Electrolux

28499.99

20483739

Беспроводные наушники JBL с микрофоном

4999.0

73648393

Игровая мышь Acer

1099.0

…​

…​

…​

Пример подзапроса, который выводит все продукты, цена которых выше средней по всем продуктам:

SELECT *
FROM products
WHERE price > (SELECT AVG(price) FROM products);

В результате мы получим такую таблицу:

Table 2. products
id product_name price

10928473

Стиральная машина Electrolux

28499.99

66379812

Ноутбук Dell

90299.0

33801167

Ноутбук Acer

53849.0

99842651

Электровелосипед HIPER

19999.0

View on DB Fiddle

Пример подзапроса, который выводит все продукты, которые есть в таблице с чеками:

SELECT *
FROM products
WHERE
    id IN
    (SELECT product_id FROM sales);

Результат будет следующим:

Table 3. products
id product_name price

10928473

Стиральная машина Electrolux

28499.99

20483739

Беспроводные наушники JBL с микрофоном

4999.0

73648393

Игровая мышь Acer

1099.0

17728904

Компьютерная мышь Logitech

650.0

View on DB Fiddle

ALL/ANY (MySQL)

ALL ANY

x > ALL (1, 2) эквивалентно x > 2

x > ANY (1, 2) эквивалентно x > 1

x < ALL (1, 2) эквивалентно x < 1

x < ANY (1, 2) эквивалентно x < 2

x = ALL (1, 2) эквивалентно (x = 1) AND (x = 2)

x = ANY (1, 2) эквивалентно x IN (1, 2)

x <> ALL (1, 2) эквивалентно x NOT IN (1, 2)

x <> ANY (1, 2) эквивалентно (x <> 1) OR (x <> 2)

Подзапрос как новая колонка

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

Новая колонка, созданная с помощью подзапроса, может содержать вычисленные значения, агрегатные функции или другие данные, основанные на значениях других столбцов в таблице

SELECT
    *,
    (
        SELECT product_name
        FROM products
        WHERE id = sales.product_id
    ) AS product
FROM sales;

Результат будет таким:

Table 4. products
product_id sale_date quantity total_price product

10928473

2023-03-08T00:00:00.000Z

1

28500

Стиральная машина Electrolux

…​

…​

…​

…​

…​

10928473

2023-06-13T00:00:00.000Z

5

142500

Стиральная машина Electrolux

View on DB Fiddle

Подзапросы в UPDATE

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

UPDATE sales
SET
    price = (
        SELECT products.price
        FROM products
        WHERE products.id = sales.product_id
    ) + 3000
WHERE id = 1;

View on DB Fiddle

Подзапросы в INSERT

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

INSERT INTO sales (product_id, sale_date, quantity, total_price)
VALUES
(
    (SELECT id FROM products WHERE product_name = 'Фен Vitek'),
    '2018-05-23',
    2,
    (SELECT price FROM products WHERE product_name = 'Фен Vitek')
);

View on DB Fiddle

Подзапросы в DELETE

Подзапросы в операции DELETE позволяют удалить данные из таблицы на основе результатов других запросов или данных из других таблиц.

DELETE FROM sales
WHERE product_id = (
    SELECT id
    FROM products
    WHERE product_name = 'Игровая мышь Acer'
);

View on DB Fiddle

Коррелированный подзапрос

Коррелированный подзапрос - это подзапрос, который зависит от внешнего запроса и использует значения из внешнего запроса в своем выражении или фильтре.

Основное применение коррелированных подзапросов - это выполнение операций, связанных с каждой строкой основного запроса. Коррелированные подзапросы выполняются для каждой строки внешнего запроса и используют значения из этой строки для фильтрации или вычисления данных в подзапросе.

SELECT *
FROM product_price AS pp
WHERE
    pp.price = (
        SELECT min(ppm.price)
        FROM product_price AS ppm
        WHERE ppm.product_id = pp.product_id
    )
ORDER BY pp.product_id, pp.price, pp.store_id
Table 5. products
product_id store_id price

10928473

1

28499.99

17728904

1

650.00

20483739

1

4999.00

73648393

1

1099.00

View on DB Fiddle


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
новый
Google таблицы, SQL, Python, Superset, Tableau, Pandas, визуализация данных, Anaconda, Jupyter Notebook, A/B-тесты, ROI
9 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»