Применение подзапросов в WHERE и HAVING, типы результатов подзапросов

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

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

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

Примеры:

  1. Одиночное значение (скалярный подзапрос):

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

    В этом примере подзапрос (SELECT AVG(price) FROM products) возвращает среднюю цену всех продуктов, и основной запрос выбирает продукты, цена которых выше этого среднего значения.

  2. Список значений (многозначный подзапрос):

    SELECT customer_name
    FROM customers
    WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date = '2023-01-01');

    Здесь подзапрос (SELECT customer_id FROM orders WHERE order_date = '2023-01-01') возвращает список ID клиентов, которые сделали заказы в указанную дату, и основной запрос выбирает имена этих клиентов.

  3. Таблица (коррелированный подзапрос):

    SELECT product_name
    FROM products p
    WHERE EXISTS (SELECT 1 FROM orders o WHERE o.product_id = p.product_id);

    В этом примере коррелированный подзапрос (SELECT 1 FROM orders o WHERE o.product_id = p.product_id) проверяет, существуют ли заказы для каждого продукта, и основной запрос выбирает имена продуктов, для которых есть заказы.

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

Подзапросы в HAVING используются для фильтрации групп строк, полученных в результате группировки (GROUP BY). Подзапросы в HAVING обычно возвращают одно значение или список значений.

Пример:

SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);

В этом примере подзапрос (SELECT AVG(salary) FROM employees) возвращает среднюю зарплату всех сотрудников, и основной запрос выбирает ID отделов, средняя зарплата в которых выше этого среднего значения.

Типы результатов подзапросов

  1. Скалярный подзапрос: Возвращает одно значение. Может использоваться в любом месте, где допустимо одно значение (например, в условиях WHERE, HAVING, или в качестве значения в SELECT).

  2. Многозначный подзапрос: Возвращает список значений. Часто используется с операторами IN, ANY, ALL, SOME.

  3. Коррелированный подзапрос: Зависит от внешнего запроса. Выполняется для каждой строки внешнего запроса. Может возвращать одно или несколько значений.

  4. Табличный подзапрос: Возвращает таблицу, которая может быть использована в FROM или JOIN.

Подзапросы являются мощным инструментом в SQL, позволяющим выполнять сложные запросы и получать точные результаты. Важно понимать, какой тип подзапроса использовать в каждой конкретной ситуации, чтобы эффективно и корректно формулировать запросы.

Last updated