Подзапросы с операторами сравнения: =, >, < и др.

🔍 Что такое подзапросы с операторами сравнения?

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

Сравнительные операторы (=, >, <, >=, <=, !=) помогают нам фильтровать данные на основе результата подзапроса.

Пример задачи:
«Найти всех сотрудников, чья зарплата выше средней по компании»

Здесь подзапрос (SELECT AVG(salary) FROM employees) вычисляет среднюю зарплату, а основной запрос использует оператор >, чтобы отобрать нужных сотрудников.


🎯 Базовый синтаксис

Подзапросы с операторами сравнения всегда возвращают одно значение (скалярный подзапрос).

SELECT column1, column2, ...
FROM table
WHERE column_name оператор (подзапрос);

Пример:
Найти товары дороже среднего чека в магазине.

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

📌 Важно:
- Подзапрос должен возвращать ровно одно значение, иначе SQL выдаст ошибку.
- Можно использовать =, >, <, >=, <=, <> (не равно).


🔥 Практические примеры

1. Сравнение с конкретным значением (=)

Найти сотрудника с такой же зарплатой, как у Ивана.

SELECT employee_name, salary
FROM employees
WHERE salary = (
    SELECT salary 
    FROM employees 
    WHERE employee_name = 'Иван'
);

2. Подзапросы с > и <

Найти клиентов, потративших больше среднего.

SELECT customer_id, total_spent
FROM orders
WHERE total_spent > (
    SELECT AVG(total_spent) 
    FROM orders
);

3. Подзапросы с <= и >=

Найти товары, цена которых не ниже минимальной цены в категории «Электроника».

SELECT product_name, price
FROM products
WHERE price >= (
    SELECT MIN(price) 
    FROM products 
    WHERE category = 'Электроника'
);

⚠️ Ошибки и подводные камни

❌ Подзапрос вернул несколько строк

Если подзапрос может вернуть несколько значений, используйте IN, ANY, ALL или перепишите запрос.

Ошибка:

-- Так нельзя, если у нескольких сотрудников имя "Иван"!
SELECT employee_name
FROM employees
WHERE salary = (SELECT salary FROM employees WHERE employee_name = 'Иван');

Исправленный вариант:

-- Используем ANY, если хотим сравнить с любым из возможных значений
SELECT employee_name
FROM employees
WHERE salary = ANY (SELECT salary FROM employees WHERE employee_name = 'Иван');

❌ Подзапрос вернул NULL

Если подзапрос не находит данных, сравнение с NULL даст UNKNOWN (ложь в WHERE).

Решение:
Используйте COALESCE или проверяйте на NULL отдельно.

SELECT employee_name
FROM employees
WHERE salary > (SELECT COALESCE(AVG(salary), 0) FROM employees);

🚀 Продвинутые сценарии

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

Можно использовать подзапросы не только в WHERE, но и в списке выборки.

SELECT 
    product_name,
    price,
    price - (SELECT AVG(price) FROM products) AS difference_from_avg
FROM products;

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

Если нужно фильтровать агрегированные данные.

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);

🏆 Итог

Подзапросы с операторами сравнения — мощный инструмент для фильтрации данных.
✅ Используйте =, >, < и другие операторы для сравнения с результатом подзапроса.
✅ Следите, чтобы подзапрос возвращал одно значение (или используйте ANY/ALL).
✅ Подзапросы можно применять в WHERE, SELECT, HAVING.

Теперь попробуйте написать запрос:
«Найти всех клиентов, которые купили товар дороже 1000 рублей».

-- Ваше решение здесь!

🔥 P.S. Если хотите глубже разобраться в SQL, загляните на YouTube-канал Данилы Бежина — там много практики! 🚀

Скрыть рекламу навсегда

🎥 YouTube: программирование простым языком

Канал, где я спокойно и по шагам объясняю сложные темы — без заумных терминов и лишней теории.

Подходит, если раньше «не заходило», но хочется наконец понять.

▶️ Смотреть курсы на YouTube