Подзапросы
Часто необходимо получить данные на основе условий, производных от данных в базе данных.
Вложенные запросы позволяют сделать это, позволяя использовать результат одной SELECT инструкции как часть другого. Это полезно для задач, таких как поиск всех клиентов, размещающих заказы, превышающие определенный средний или определяющий продукты, предоставляемые определенным набором поставщиков.
Вложенные запросы можно использовать в следующих контекстах:
В предложениях операторов SELECT (FROM, WHERE, HAVING предложение)
В инструкциях манипуляции данными (INSERT, UPDATEDELETE оператор)
Ключевые моменты, которые необходимо подчеркнуть
Вложенный запрос всегда является инструкцией SELECT.
Вложенный запрос заключен в скобки ().
Результат вложенного запроса используется внешним запросом.
Примеры вложенных запросов
SELECT product_name, price
FROM sales.products
WHERE price > (
SELECT AVG(price)
FROM sales.products
);
Этот запрос извлекает имена и цены на продукты из sales.products таблицы, где price продукт больше среднего price числа всех продуктов в одной таблице. Он использует подзапрос в предложении WHERE для вычисления среднего значения price, выбирая AVG(price) из таблицы sales.products. Результат этого вложенных запросов затем сравнивается с столбцом price во внешнем запросе для фильтрации и отображения только тех продуктов, цены которых превышают этот вычисляемый средний.
SELECT customer_id, customer_name
FROM sales.customers
WHERE customer_id IN (
SELECT DISTINCT customer_id
FROM sales.orders
);
Этот запрос извлекает идентификаторы и имена клиентов из sales.customers таблицы, которые поместили по крайней мере один заказ. Это достигается с помощью вложенного запроса в предложении WHERE . Вложенный запрос выбирает различные customer_id значения из sales.orders таблицы, представляющую клиентов, которые сделали все заказы. Затем внешний запрос использует эти идентификаторы для фильтрации и отображения сведений о клиентах, обеспечивая включение в результат только тех клиентов, которые связаны с заказами.
SELECT supplier_id, AVG (price) AS avg_price
FROM (
SELECT supplier_id, price
FROM sales.products
) AS product_prices
GROUP BY supplier_id;
Этот запрос вычисляет среднюю цену продукта для каждого поставщика. В условии FROM используется подзапрос для выбора supplier_id и цены из sales.products table предложения. Затем внешний запрос группирует результат supplier_id по и вычисляет среднее price значение для каждой группы. Этот подход может быть полезным, если вы хотите выполнить агрегирование для отфильтрованного или предварительно обработанного набора данных.
UPDATE sales.products
SET price = price * 1.1
WHERE category_id = (
SELECT category_id
FROM sales.products
GROUP BY category_id
ORDER BY AVG(price) DESC LIMIT 1
);
Этот запрос увеличивает цены на продукты в категории с самой высокой средней ценой на 10%. Оператор UPDATE изменяет price столбец в sales.products таблице, умножая его на 1.1 для строк, соответствующих условию в предложении WHERE .
Вложенный запрос внутри WHERE предложения определяет category_id категории с самым высоким средним значением price. Он группирует продукты по их category_id, вычисляет среднее price для каждой группы и упорядочивает их в порядке убывания среднего price. Элемент LIMIT 1 гарантирует, что выбран только лучший результат, то есть категория с самым высоким средним значением price, и применяется для фильтрации строк при обновлении.