ALL в Oracle SQL: как сравнивать значение сразу со всем набором значений

🟢 Введение

Оператор ALL используется в SQL для сравнения одного значения с множеством значений.
Он проверяет, соответствует ли условие всем элементам подзапроса или списка.

Например:

sql
salary > ALL (SELECT salary FROM employees WHERE department_id = 50)

Проверяет, больше ли зарплата заданного сотрудника, чем у всех в отделе 50.


🔤 Написание

Синтаксис:

sql
выражение оператор ALL (подзапрос)

Возможные операторы сравнения:

  • =

  • != / <>

  • <

  • >

  • <=

  • >=


🔄 Где часто используется

  • Сравнение с агрегированным подмножеством

  • Фильтрация исключений

  • Проверка наибольшего или наименьшего значения

  • В подзапросах и WHERE, HAVING условиях

  • Вместе с ANY, SOME и EXISTS для более гибкой логики


🧪 10 Примеров использования ALL с пояснениями

1️⃣ Больше всех ( > ALL )

sql
SELECT first_name, salary
FROM employees
WHERE salary > ALL (
SELECT salary FROM employees WHERE department_id = 50
);

Сотрудники с зарплатой выше, чем у всех в отделе 50.


2️⃣ Меньше всех ( < ALL )

sql
SELECT first_name, salary
FROM employees
WHERE salary < ALL (
SELECT salary FROM employees WHERE job_id = 'SA_MAN'
);

Сотрудники, у которых зарплата меньше, чем у всех продавцов.


3️⃣ Равно всем ( = ALL )

sql
SELECT department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*) = ALL (
SELECT COUNT(*) FROM employees GROUP BY department_id
);

Отделы с таким же числом сотрудников, как в любом другом (всех). Только если все значения равны.


4️⃣ ALL с выражением

sql
SELECT product_id
FROM products
WHERE price * 1.2 < ALL (
SELECT discounted_price FROM promotions
);

Сравнение выражения со всем набором акционных цен.


5️⃣ ALL в HAVING

sql
SELECT job_id, AVG(salary) AS avg_sal
FROM employees
GROUP BY job_id
HAVING AVG(salary) > ALL (
SELECT AVG(salary) FROM employees GROUP BY department_id
);

Должности с самой высокой средней зарплатой среди всех отделов.


6️⃣ ALL с NOT (NOT > ALL → есть меньше или равно)

sql
SELECT employee_id
FROM employees
WHERE NOT salary > ALL (
SELECT salary FROM employees WHERE department_id = 90
);

Сотрудники, у которых зарплата не больше всех в отделе 90.


7️⃣ ALL с датами

sql
SELECT first_name, hire_date
FROM employees
WHERE hire_date < ALL (
SELECT hire_date FROM employees WHERE department_id = 20
);

Сотрудники, нанятые раньше всех в отделе 20.


8️⃣ ALL с подзапросом, возвращающим 1 значение

sql
SELECT * FROM employees
WHERE salary = ALL (
SELECT MAX(salary) FROM employees
);

Сотрудники с максимальной зарплатой. Аналог salary = (SELECT MAX(...)).


9️⃣ ALL с NULL (не возвращает ничего)

sql
SELECT * FROM employees
WHERE salary > ALL (
SELECT NULL FROM dual
);

⚠️ Вернёт 0 строк, потому что NULL делает всё условие неопределённым.


🔟 ALL и производительность

✅ Подходит, когда вы точно знаете, что сравнение со всеми — логически необходимо.
⚠️ Не используйте ALL без нужды, если можно заменить на MAX() или MIN() — будет быстрее.


🧩 Заключение

Оператор ALL — это инструмент жёсткой проверки: условие должно выполняться для всех значений в подзапросе.
Он отлично подходит, когда нужно найти самых лучших, самых первых, самых дешёвых или самых дорогих.

💡 Но будьте внимательны:

  • Если подзапрос возвращает NULL, ALL даст UNKNOWN → никаких результатов

  • Замените ALL на MAX или MIN при возможности для улучшения производительности


🔜 Следующая статья:

Оператор ANY в Oracle SQL — как сравнивать значение хотя бы с одним элементом из набора

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии