Какой из операторов вернет false sql
Набор операторов сравнения включает обычные операторы, перечисленные в Таблице 9.1.
Таблица 9.1. Операторы сравнения
| Оператор | Описание |
|---|---|
| тип_данных < тип_данных → boolean | Меньше |
| тип_данных > тип_данных → boolean | Больше |
| тип_данных тип_данных → boolean | Меньше или равно |
| тип_данных >= тип_данных → boolean | Больше или равно |
| тип_данных = тип_данных → boolean | Равно |
| тип_данных <> тип_данных → boolean | Не равно |
| тип_данных != тип_данных → boolean | Не равно |
Примечание
В стандарте SQL для условия « не равно » принята запись <> . Синонимичная ей запись != преобразуется в <> на самой ранней стадии разбора запроса. Как следствие, реализовать операторы != и <> так, чтобы они работали по-разному, невозможно.
Эти операторы сравнения имеются для всех встроенных типов данных, значения которых сортируются естественным образом, включая числовые, строковые типы, а также типы даты/времени. Кроме того, сравниваться могут массивы, составные типы и диапазоны, если типы данных их компонентов являются сравниваемыми.
Обычно можно сравнивать также значения связанных типов данных; например, возможно сравнение integer > bigint . Некоторые подобные операции реализуются непосредственно « межтиповыми » операторами сравнения, но если такого оператора нет, анализатор запроса попытается привести частные типы к более общим и применить подходящий для них оператор сравнения.
Существует также несколько предикатов сравнения; они приведены в Таблице 9.2. Они работают подобно операторам, но имеют особый синтаксис, установленный стандартом SQL.
Таблица 9.2. Предикаты сравнения
тип_данных BETWEEN тип_данных AND тип_данных → boolean
Между (включая границы интервала).
2 BETWEEN 1 AND 3 → t
тип_данных NOT BETWEEN тип_данных AND тип_данных → boolean
Не между (обратное к BETWEEN ).
тип_данных BETWEEN SYMMETRIC тип_данных AND тип_данных → boolean
Между, после сортировки граничных значений.
тип_данных NOT BETWEEN SYMMETRIC тип_данных AND тип_данных → boolean
Не между, после сортировки граничных значений.
тип_данных IS DISTINCT FROM тип_данных → boolean
Не равно, при этом NULL воспринимается как обычное значение.
1 IS DISTINCT FROM NULL → t (а не NULL )
тип_данных IS NOT DISTINCT FROM тип_данных → boolean
Равно, при этом NULL воспринимается как обычное значение.
1 IS NOT DISTINCT FROM NULL → f (а не NULL )
тип_данных IS NULL → boolean
Проверяет, является ли значение эквивалентным NULL.
тип_данных IS NOT NULL → boolean
Проверяет, отличается ли значение от NULL.
тип_данных ISNULL → boolean
тип_данных NOTNULL → boolean
boolean IS TRUE → boolean
Проверяет, является ли результат логического выражения значением true.
true IS TRUE → t
boolean IS NOT TRUE → boolean
Проверяет, является ли результат логического выражения значением false или неизвестным.
true IS NOT TRUE → f
boolean IS FALSE → boolean
Проверяет, является ли результат логического выражения значением false.
true IS FALSE → f
boolean IS NOT FALSE → boolean
Проверяет, является ли результат логического выражения значением true или неизвестным.
true IS NOT FALSE → t
boolean IS UNKNOWN → boolean
Проверяет, является ли результат логического выражения неизвестным значением.
true IS UNKNOWN → f
boolean IS NOT UNKNOWN → boolean
Проверяет, является ли результат логического выражения значением true или false.
true IS NOT UNKNOWN → t
Предикат BETWEEN упрощает проверки интервала:
aBETWEENxANDy
a>=xANDay
Заметьте, что BETWEEN считает, что границы интервала включаются в интервал. Предикат BETWEEN SYMMETRIC аналогичен BETWEEN , за исключением того, что аргумент слева от AND не обязательно должен быть меньше или равен аргументу справа. Если это не так, аргументы автоматически меняются местами, так что всегда подразумевается непустой интервал.
Различные варианты BETWEEN реализуются посредством обычных операторов сравнения, и поэтому они будут работать с любыми типами данных, которые можно сравнивать.
Примечание
Использование AND в конструкции BETWEEN создаёт неоднозначность с использованием AND в качестве логического оператора. Для её устранения в качестве второго аргумента предложения BETWEEN принимается только ограниченный набор типов выражений. Если вам нужно записать более сложное подвыражение в BETWEEN , заключите это подвыражение в скобки.
Обычные операторы сравнения выдают NULL (что означает « неопределённость » ), а не true или false, когда любое из сравниваемых значений NULL. Например, 7 = NULL выдаёт NULL, так же, как и 7 <> NULL . Когда это поведение нежелательно, можно использовать предикаты IS [ NOT ] DISTINCT FROM :
aIS DISTINCT FROMbaIS NOT DISTINCT FROMb
Для значений не NULL условие IS DISTINCT FROM работает так же, как оператор <> . Однако если оба сравниваемых значения NULL, результат будет false, и только если одно из значений NULL, возвращается true. Аналогично, условие IS NOT DISTINCT FROM равносильно = для значений не NULL, но возвращает true, если оба сравниваемых значения NULL, и false в противном случае. Таким образом, эти предикаты по сути работают с NULL, как с обычным значением, а не с « неопределённостью » .
Для проверки, содержит ли значение NULL или нет, используются предикаты:
выражениеIS NULLвыражениеIS NOT NULL
или равнозначные (но нестандартные) предикаты:
выражениеISNULLвыражениеNOTNULL
Заметьте, что проверка выражение = NULL не будет работать, так как NULL считается не « равным » NULL . (Значение NULL представляет неопределённость, и равны ли две неопределённости, тоже не определено.)
Подсказка
Некоторые приложения могут ожидать, что выражение = NULL вернёт true, если результатом выражения является NULL. Такие приложения настоятельно рекомендуется исправить и привести в соответствие со стандартом SQL. Однако в случаях, когда это невозможно, это поведение можно изменить с помощью параметра конфигурации transform_null_equals. Когда этот параметр включён, PostgreSQL преобразует условие x = NULL в x IS NULL .
Если выражение возвращает табличную строку, тогда IS NULL будет истинным, когда само выражение — NULL или все поля строки — NULL, а IS NOT NULL будет истинным, когда само выражение не NULL, и все поля строки так же не NULL. Вследствие такого определения, IS NULL и IS NOT NULL не всегда будут возвращать взаимодополняющие результаты для таких выражений; в частности такие выражения со строками, одни поля которых NULL, а другие не NULL, будут ложными одновременно. В некоторых случаях имеет смысл написать строка IS DISTINCT FROM NULL или строка IS NOT DISTINCT FROM NULL , чтобы просто проверить, равно ли NULL всё значение строки, без каких-либо дополнительных проверок полей строки.
Логические значения можно также проверить с помощью предикатов
логическое_выражениеIS TRUEлогическое_выражениеIS NOT TRUEлогическое_выражениеIS FALSEлогическое_выражениеIS NOT FALSEлогическое_выражениеIS UNKNOWNлогическое_выражениеIS NOT UNKNOWN
Они всегда возвращают true или false и никогда NULL, даже если какой-любо операнд — NULL. Они интерпретируют значение NULL как « неопределённость » . Заметьте, что IS UNKNOWN и IS NOT UNKNOWN по сути равнозначны IS NULL и IS NOT NULL , соответственно, за исключением того, что выражение может быть только булевого типа.
Также имеется несколько связанных со сравнениями функций; они перечислены в Таблице 9.3.
Таблица 9.3. Функции сравнения
num_nonnulls ( VARIADIC «any» ) → integer
Возвращает число аргументов, отличных от NULL.
num_nulls ( VARIADIC «any» ) → integer
Возвращает число аргументов NULL.
9.2. Функции и операторы сравнения#
Доступны обычные операторы сравнения, как показано в Таблица 9.1.
Таблица 9.1. Операторы сравнения
| Оператор | Описание |
|---|---|
| datatype < datatype → boolean | Less than |
| datatype > datatype → boolean | Greater than |
| datatype datatype → boolean | Less than or equal to |
| datatype >= datatype → boolean | Greater than or equal to |
| datatype = datatype → boolean | Equal |
| datatype <> datatype → boolean | Not equal |
| datatype != datatype → boolean | Not equal |
Примечание
<> — это стандартная SQL-нотация для “ не равно ” . != — это псевдоним, который преобразуется в <> на очень раннем этапе разбора. Поэтому невозможно реализовать операторы != и <> , которые выполняют разные действия.
Эти операторы сравнения доступны для всех встроенных типов данных, которые имеют естественный порядок, включая числовые, строковые и типы даты/времени. Кроме того, массивы, составные типы и диапазоны могут быть сравнены, если их составные типы данных сравнимы.
Обычно возможно сравнивать значения связанных типов данных; например, integer > bigint будет работать. Некоторые случаи такого рода реализованы непосредственно с помощью операторов сравнения “ cross-type ” , но если такой оператор недоступен, парсер приведет менее общий тип к более общему типу и применит оператор сравнения последнего.
Как показано выше, все операторы сравнения являются бинарными операторами, которые возвращают значения типа boolean . Таким образом, выражения вроде 1 < 2 < 3 недопустимы (потому что нет оператора < для сравнения логического значения с 3 ). Используйте предикаты BETWEEN , показанные ниже, для выполнения диапазонных тестов.
Также существуют некоторые предикаты сравнения, как показано в Таблица 9.2. Они ведут себя почти так же, как операторы, но имеют специальный синтаксис, предписанный стандартом SQL.
Таблица 9.2. Предикаты сравнения
datatype BETWEEN datatype AND datatype → boolean
Между (включая конечные точки диапазона).
2 МЕЖДУ 1 И 3 → t
2 МЕЖДУ 3 И 1 → f
datatype NOT BETWEEN datatype AND datatype → boolean
Не между (отрицание BETWEEN ).
2 НЕ МЕЖДУ 1 И 3 → f
datatype BETWEEN SYMMETRIC datatype AND datatype → boolean
Между, после сортировки двух значений конечных точек.
2 МЕЖДУ СИММЕТРИЧНО 3 И 1 → t
datatype NOT BETWEEN SYMMETRIC datatype AND datatype → boolean
Не между, после сортировки двух значений конечных точек.
2 НЕ МЕЖДУ СИММЕТРИЧНО 3 И 1 → f
datatype IS DISTINCT FROM datatype → boolean
Не равно, считая null сравнимым значением.
1 НЕ РАВНО NULL → t (вместо NULL )
NULL IS DISTINCT FROM NULL → f (вместо NULL )
datatype IS NOT DISTINCT FROM datatype → boolean
Равно, считая NULL как сравнимое значение.
1 IS NOT DISTINCT FROM NULL → f (вместо NULL )
NULL IS NOT DISTINCT FROM NULL → t (вместо NULL )
datatype IS NULL → boolean
Проверить, является ли значение пустым.
datatype IS NOT NULL → boolean
Проверить, является ли значение не пустым.
‘null’ IS NOT NULL → t
datatype ISNULL → boolean
Проверьте, является ли значение null (нестандартный синтаксис).
datatype NOTNULL → boolean
Проверить, является ли значение не нулевым (нестандартный синтаксис).
boolean IS TRUE → boolean
Проверить, дает ли логическое выражение истинное значение.
true IS TRUE → t
NULL::boolean IS TRUE → f (вместо NULL )
boolean IS NOT TRUE → boolean
Проверяет, дает ли логическое выражение значение false или unknown.
true IS NOT TRUE → f
NULL::boolean IS NOT TRUE → t (вместо NULL )
boolean IS FALSE → boolean
Проверяет, дает ли логическое выражение значение false.
true IS FALSE → f
NULL::boolean IS FALSE → f (вместо NULL )
boolean IS NOT FALSE → boolean
Проверяет, дает ли логическое выражение значение true или unknown.
true IS NOT FALSE → t
NULL::boolean IS NOT FALSE → t (вместо NULL )
boolean IS UNKNOWN → boolean
Проверяет, возвращает ли логическое выражение значение unknown.
true IS UNKNOWN → f
NULL::boolean IS UNKNOWN → t (вместо NULL )
boolean IS NOT UNKNOWN → boolean
Проверяет, дает ли логическое выражение true или false.
true IS NOT UNKNOWN → t
NULL::boolean IS NOT UNKNOWN → f (вместо NULL )
Предикат BETWEEN упрощает проверку диапазона:
aBETWEENxANDy
a>=xANDay
Обратите внимание, что BETWEEN рассматривает конечные значения как включенные в диапазон. BETWEEN SYMMETRIC похож на BETWEEN , за исключением того, что нет требования, чтобы аргумент слева от AND был меньше или равен аргументу справа. Если это не так, эти два аргумента автоматически меняются местами, чтобы всегда подразумевался непустой диапазон.
Различные варианты BETWEEN реализованы с использованием обычных операторов сравнения и, следовательно, будут работать для любого типа данных, который может быть сравнен.
Примечание
Использование AND в синтаксисе BETWEEN создает неоднозначность с использованием AND как логического оператора. Чтобы разрешить это, разрешается использовать только ограниченный набор типов выражений в качестве второго аргумента предложения BETWEEN . Если вам нужно написать более сложное подвыражение в BETWEEN , заключите его в скобки.
Обычные операторы сравнения возвращают значение null (обозначающее “ неизвестно ” ), а не true или false, когда хотя бы один из операндов равен null. Например, 7 = NULL возвращает null, также как и 7 <> NULL . Если такое поведение не подходит, используйте предикаты IS [ NOT ] DISTINCT FROM :
aIS DISTINCT FROMbaIS NOT DISTINCT FROMb
Для ненулевых входных данных IS DISTINCT FROM эквивалентен оператору <> . Однако, если оба входа являются null, он возвращает false, а если только один вход является null, то возвращает true. Аналогично, IS NOT DISTINCT FROM идентичен = для ненулевых входных данных, но возвращает true, когда оба входа являются null, и false, когда только один вход является null. Таким образом, эти предикаты действуют так, будто null является обычным значением данных, а не “ неизвестным ” .
Для проверки, является ли значение null или нет, используйте предикаты:
expressionIS NULLexpressionIS NOT NULL
или эквивалентные, но нестандартные предикаты:
expressionISNULLexpressionNOTNULL
Не пишите expression = NULL , потому что NULL не “ равен ” NULL . (Значение null представляет неизвестное значение, и неизвестно, равны ли два неизвестных значения).
Подсказка
Некоторые приложения могут ожидать, что expression = NULL вернет true, если expression оценивается как null. Настоятельно рекомендуется изменить эти приложения, чтобы они соответствовали стандарту SQL. Однако, если это невозможно, доступна конфигурационная переменная transform_null_equals. Если она включена, Tantor BE будет преобразовывать выражения x = NULL в x IS NULL .
Если expression имеет значение строки, то IS NULL истинно, когда само выражение строки является нулевым или когда все поля строки являются нулевыми, в то время как IS NOT NULL истинно, когда само выражение строки не является нулевым и все поля строки не являются нулевыми. Из-за такого поведения IS NULL и IS NOT NULL не всегда возвращают обратные результаты для выражений со значениями строк; в частности, выражение со значениями строк, которое содержит как нулевые, так и ненулевые поля, вернет false для обоих тестов. В некоторых случаях может быть предпочтительнее использовать row IS DISTINCT FROM NULL или row IS NOT DISTINCT FROM NULL , которые просто проверяют, является ли общее значение строки нулевым без дополнительных тестов на поля строки.
Логические значения также могут быть проверены с использованием предикатов
boolean_expressionIS TRUEboolean_expressionIS NOT TRUEboolean_expressionIS FALSEboolean_expressionIS NOT FALSEboolean_expressionIS UNKNOWNboolean_expressionIS NOT UNKNOWN
Эти операторы всегда возвращают значение true или false, никогда не null, даже если операнд является null. Null-значение входного параметра рассматривается как логическое значение «unknown». Обратите внимание, что операторы I IS UNKNOWN и IS NOT UNKNOWN фактически эквивалентны операторам IS NULL и IS NOT NULL соответственно, за исключением того, что выражение входного параметра должно быть логического типа (boolean).
Некоторые функции, связанные с сравнением, также доступны, как показано в Таблица 9.3.
Таблица 9.3. Функции сравнения
num_nonnulls ( VARIADIC «any» ) → integer
Возвращает количество ненулевых аргументов.
num_nonnulls(1, NULL, 2) → 2
num_nulls ( VARIADIC «any» ) → integer
Возвращает количество нулевых аргументов.
num_nulls(1, NULL, 2) → 1
| Назад | Наверх | Далее |
| 9.1. Логические операторы | Начало | 9.3. Математические функции и операторы |
Использование ключевых слов SOME (ANY) и ALL с предикатами сравнения
SOME и ANY являются синонимами, то есть может использоваться любое из них. Результатом подзапроса является один столбец величин. Если хотя бы для одного значения V, получаемого из подзапроса, результат операции » < оператор сравнения > V » равняется TRUE , то предикат ANY также равняется TRUE .
Исполняется так же, как и ANY , однако значение предиката ALL будет истинным, если для всех значений V, получаемых из подзапроса, предикат » V » дает TRUE .
Найти поставщиков компьютеров, моделей которых нет в продаже (то есть модели этих поставщиков отсутствуют в таблице PC)
Консоль
Выполнить
Оказалось, что только у поставщика Е есть модели, отсутствующие в продаже:
Рассмотрим подробно этот пример. Предикат
вернет значение TRUE , если модель, определяемая полем model основного запроса, найдется в списке моделей таблицы РС (возвращаемом подзапросом). Поскольку предикат используется в запросе с отрицанием NOT , то значение TRUE будет получено, если модели не окажется в списке. Этот предикат проверяется для каждой записи основного запроса, которыми являются все модели ПК (предикат type = ‘pc’) из таблицы Product. Результирующий набор состоит из одного столбца — имени производителя. Чтобы один производитель не выводился несколько раз (что может случиться, если он производит несколько моделей, отсутствующих в таблице РС), используется служебное слово DISTINCT , исключающее дубликаты.
Найти модели и цены портативных компьютеров, стоимость которых превышает стоимость любого ПК

Консоль
Выполнить
Приведем формальные правила оценки истинности предикатов, использующих параметры ANY|SOME и ALL.
- Если определен параметр ALL или SOME и все результаты сравнения значения выражения и каждого значения, полученного из подзапроса, являются TRUE, истинностное значение равно TRUE.
- Если результат выполнения подзапроса не содержит строк и определен параметр ALL, результат равен TRUE. Если же определен параметр SOME, результат равен FALSE.
- Если определен параметр ALL и результат сравнения значения выражения хотя бы с одним значением, полученным из подзапроса, является FALSE, истинностное значение равно FALSE.
- Если определен параметр SOME и хотя бы один результат сравнения значения выражения и значения, полученного из подзапроса, является TRUE, истинностное значение равно TRUE.
- Если определен параметр SOME и каждое сравнение значения выражения и значений, полученных из подзапроса, равно FALSE, истинностное значение тоже равно FALSE.
- В любом другом случае результат будет равен UNKNOWN .
Отличие работы операторов ANY, SOME и ALL в языке T-SQL
Продолжаем изучать язык T-SQL и сегодня статья будет посвящена таким операторам как: ANY, SOME и ALL, мы узнаем, что это за операторы, как они работают и чем они отличаются друг от друга.

И начать хотелось бы с того, что все эти операторы ANY, SOME и ALL используются в T-SQL для сравнения скалярного значения с результирующим набором подзапроса, состоящим из одного столбца. Во всех случаях тип данных столбца, возвращаемого подзапросом должен совпадать с типом данных столбца (выражения), с которым происходит сравнение.
Операторы ANY и SOME эквивалентны, т.е. результат их работы будет одинаковый. Какой использовать можете решать на основе контекста запроса или участка кода, например, ANY переводится как «Любой», а SOME как «Некоторые» (для сведения ALL это «Все»).
Эти операторы используются с любым допустимым оператором сравнения: = | <> | != | > | >= | !> | < |
ANY, SOME и ALL возвращают результат с типом Boolean.
- Видеокурсы по T-SQL
- Справочник T-SQL;
- Основы программирования на T-SQL;
- Самоучитель по языку Transact-SQL.
Операторы ANY и SOME в языке T-SQL
Работа этих операторов заключается в том, чтобы сравнить, по крайней мере, одно значение результирующего набора подзапроса со значением выражения и если результатом сравнения для любой пары значений является TRUE, то результат работы ANY и SOME также TRUE. Другими словами, если в качестве скалярного значения у нас будет выступать 1, а результирующий набор подзапроса возвращает 1, 2 и 3 результат условия 1 = ANY (1,2,3) будет TRUE, так как значение 1 равняется одному из значений результирующего набора подзапроса.
Примечание! В MS SQL Server использовать перечисление значений вместо подзапроса не допускается (т.е. будет ошибка, если написать ANY = (1,2,3)).
В случае если подзапрос не возвращает строк, то результат работы ANY и SOME будет FALSE.
Оператор ALL в языке T-SQL
Данный оператор сравнивает каждое значение столбца, возвращаемого вложенным запросом со значением столбца выражения и если заданное сравнение, возвращает TRUE для всех пар, то результат работы оператора ALL также TRUE, в противном случае FALSE. Другими словами, если в качестве скалярного значения у нас будет выступать 5, а результирующий набор подзапроса возвращает 1, 2 и 3 результат условия 5 > ALL (1,2,3) будет TRUE, так как значение 5 больше всех значений результирующего набора подзапроса. А если, например условие будет 2 > ALL (1,2,3), то результатом будет FALSE, так как значение 2 не больше всех возвращаемых подзапросом значений.
Если подзапрос не возвращает строк, то результат работы оператора ALL равен TRUE.
Без примеров понять работу операторов ANY, SOME и ALL, и уж тем более сравнить их, наверное, сложно, поэтому давайте сразу перейдём к примерам и для начала разберем исходные данные.
Исходные данные
В качестве СУБД у меня будет выступать MS SQL Server 2012 Express. Для примера будет база данных Test, а в ней таблица TestTable, которую мы сейчас создадим и наполним тестовыми данными. Эти данные представляют собой список товаров с указанием их цены и категории.
--Создание таблицы CREATE TABLE dbo.TestTable( ID INT IDENTITY(1,1) NOT NULL, ProductName VARCHAR(50) NOT NULL, Price MONEY NULL, CategoryID INT NOT NULL, CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED (ID ASC) ) GO --Вставляем тестовые данные INSERT INTO dbo.TestTable (ProductName, Price, CategoryID) VALUES('Компьютер', 500, 1) GO INSERT INTO dbo.TestTable (ProductName, Price, CategoryID) VALUES('Монитор', 400, 2) GO INSERT INTO dbo.TestTable (ProductName, Price, CategoryID) VALUES('Телефон', 200, 1) GO INSERT INTO dbo.TestTable (ProductName, Price, CategoryID) VALUES('Планшет', 300, 1) GO INSERT INTO dbo.TestTable (ProductName, Price, CategoryID) VALUES('Принтер', 250, 2) GO

Примеры работы операторов ANY, SOME и ALL
Пример 1
Допустим, нам необходимо получить все товары из категории 1, цена которых превышает цену товаров из категории 2. При этом мы напишем три SQL запроса SELECT, первый просто выводит цены товаров из категории 2, второй запрос с условием ANY, а третий с ALL и посмотрим на результаты их работы.
--Цена товаров из второй категории SELECT Price FROM dbo.TestTable WHERE CategoryID = 2 --ANY SELECT * FROM dbo.TestTable WHERE CategoryID = 1 AND Price > ANY (SELECT Price FROM dbo.TestTable WHERE CategoryID = 2) --ALL SELECT * FROM dbo.TestTable WHERE CategoryID = 1 AND Price > ALL (SELECT Price FROM dbo.TestTable WHERE CategoryID = 2)

Как видим, запрос с ANY вернул 2 строки, это означает что стоимость этих товаров больше стоимости хотя бы одного товара из второй категории (500 больше всех, а 300 больше 250).
Запрос с условием ALL вернул одну строку, это означает что стоимость данного товара больше стоимости всех товаров из второй категории (500 больше 400 и 500 больше 250).
Пример 2
Теперь давайте посмотрим, как будут вести себя эти операторы, если мы укажем несуществующую категорию (например, 5) в подзапросе, т.е. подзапрос, вообще не вернет строк.
--ANY SELECT * FROM dbo.TestTable WHERE CategoryID = 1 AND Price > ANY (SELECT Price FROM dbo.TestTable WHERE CategoryID = 5) --ALL SELECT * FROM dbo.TestTable WHERE CategoryID = 1 AND Price > ALL (SELECT Price FROM dbo.TestTable WHERE CategoryID = 5)

В первом случае с ANY запрос не вернул строк, а во втором с ALL вернулись все строки. Как я и говорил с ANY, если подзапрос не возвращает строк, то результат работы оператора будет FALSE т.е. мы пытались найти хоть одно сравнение значений с TRUE, но не нашли поэтому ничего и не вывелось.
С оператором ALL вывелись все строки, так как для сравнения со всеми значениями результата подзапроса нужны сами эти значения, а если их нет, то условие не применяется и отбор строк не происходит (результат работы оператора ALL в этом случае TRUE).
Пример 3
А сейчас давайте узнаем, что будет, если подзапрос возвращает помимо нормальных значений значение NULL. Для этого сначала давайте добавим еще одну строку в таблицу TestTable со значением цены NULL.
INSERT INTO dbo.TestTable (ProductName, Price, CategoryID) VALUES('Сканер', NULL, 2)
И запустим точно такой же запрос как в примере 1.

Мы видим, что результат запроса с ANY не изменился, а с ALL никаких строк не вывелось, так как еще раз повторюсь, с использованием оператора ALL сравниваются все возвращаемые значения подзапроса, а результат проверки с NULL будет NULL, а не TRUE, поэтому в данном случае результат условия с ALL будет всегда FALSE.
Заметка! Для комплексного изучения языка SQL и T-SQL рекомендую посмотреть мои видеокурсы по T-SQL, в которых используется последовательная методика обучения специально для начинающих.
На этом предлагаю заканчивать надеюсь, материал был Вам полезен, пока!
