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

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

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

Подзапрос SQL

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

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

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

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);

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

products

id product_name price
10928473 Стиральная машина Electrolux 28499.99
66379812 Ноутбук Dell 90299.0
33801167 Ноутбук Acer 53849.0
99842651 Электровелосипед HIPER 19999.0

Таблица на DB Fiddle

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

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

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

products

id product_name price
10928473 Стиральная машина Electrolux 28499.99
20483739 Беспроводные наушники JBL с микрофоном 4999.0
73648393 Игровая мышь Acer 1099.0
17728904 Компьютерная мышь Logitech 650.0

Таблица на 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;

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

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

Таблица на DB Fiddle

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

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

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

Таблица на 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')
);

Таблица на DB Fiddle

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

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

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

Таблица на 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

products

product_id store_id price
10928473 1 28499.99
17728904 1 650.00
20483739 1 4999.00
73648393 1 1099.00

Таблица на DB Fiddle


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

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

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

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

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

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

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff