Підзапити

Завершено

Часто потрібно отримувати дані на основі умов, отриманих із даних у базі даних.

Підзапити дають змогу робити це, даючи змогу використовувати результат однієї SELECT інструкції як частину іншої. Це зручно для таких завдань, як пошук усіх клієнтів, які розмістили замовлення, що перевищують певне середнє значення, або визначення продуктів, наданих певним набором постачальників.

Підзапити можна використовувати в таких контекстах:

У реченнях SELECT інструкцій (FROM, WHERE, HAVING речення)

У інструкціях із обробки даних (INSERT, UPDATEінструкції DELETE )

Основні моменти, які потрібно підкреслити

Підзапит – це завжди інструкція 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, і використовується для фільтрування рядків для оновлення.