Intereting Posts

ВСЕ оператор VS Любой из пустого запроса

Я читаю документацию оракула для операторов ЛЮБОГО и ВСЕГО. Я довольно понимаю их использование, кроме одного. Говорится:

ВСЕ :

Если подзапрос возвращает нулевые строки, условие принимает значение TRUE.

ЛЮБЫЕ :

Если подзапрос возвращает нулевые строки, условие принимает значение FALSE.

Для меня это не очень логично. Почему ALL на пустой подзапрос вернет TRUE, но ANY вернет FALSE?

Я относительно новичок в SQL, поэтому я предполагаю, что у него будет прецедент для такого поведения, которое действительно противоречит интуиции для меня.

ЛЮБЫЕ и ВСЕ на пустом множестве должны возвращать то же значение нет?

Поскольку ANY должен интерпретироваться как EXIST (если он есть, значит, он существует). Поэтому он возвращает false, если строки не найдены.

All не подтверждают, что существуют какие-либо значения, он просто подтверждает, что он представляет все возможные значения. Поэтому он возвращает true, даже если строки не найдены.

Рассмотрим пример таблицы EMP в этой ссылке.

В частности, этот запрос –

 SELECT e1.empno, e1.sal FROM emp e1 WHERE e1.sal > ANY (SELECT e2.sal FROM emp e2 WHERE e2.deptno = 20); 

В случае ЛЮБОГО вопроса, вы задаете вопрос: «Является ли моя зарплата больше, чем кто-либо в отделе 20 (не менее 1 человека)». Это означает, что вы надеетесь, что хотя бы у одного человека зарплата меньше вас. Когда нет строк, это возвращает FALSE потому что нет никого, чья зарплата меньше вас, вы надеялись хотя бы на одного.

В случае ВСЕГО, очевидный вопрос, который вы зададите, – «Является ли моя зарплата больше всех?». Перефразируя это как «Нет ли у кого зарплаты больше меня?» Когда нет возвращенных строк, ваш ответ TRUE , потому что «нет никого, чья зарплата выше меня.