Подзапросы с операторами сравнения: =, >, < и др.
🔍 Что такое подзапросы с операторами сравнения?
Подзапросы (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-канал Данилы Бежина — там много практики! 🚀