Any sql all: ANY и ALL — Учебник SQL — Schoolsw3.com

SOME | ANY (Transact-SQL) — SQL Server


  • Статья


  • Чтение занимает 3 мин

Применимо к:база данныхSQL Server Azure SQL Управляемый экземпляр SQL Azure

Сравнивает скалярное значение с набором значений, состоящим из одного столбца. Ключевые слова SOME и ANY эквивалентны.

Соглашения о синтаксисе Transact-SQL

Синтаксис

scalar_expression { = | <> | != | > | >= | !> | < | <= | !< }   
     { SOME | ANY } ( subquery )   

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

scalar_expression
Любое допустимое выражение expression.

{ = | <> | != | > | >= | !> | < | <= | !< }
Любой допустимый оператор сравнения.

SOME | ANY

Указывает на необходимость сравнения.

subquery

Вложенный запрос, содержащий результирующий набор, состоящий из одного столбца. Тип данных возвращаемого столбца должен совпадать с типом данных аргумента scalar_expression.

Типы результата

Boolean

Значение результата

При использовании ключевого слова SOME или ANY значение TRUE возвращается, если указанное сравнение имеет значение TRUE для любой пары (scalar_expression, x), где x является одним из значений набора из одного столбца; в остальных случаях возвращается значение FALSE.

Для ключевого слова SOME необходим аргумент scalar_expression, чтобы провести непосредственное сравнение по крайней мере одного значения, возвращенного вложенным запросом. Инструкции, которым необходим аргумент scalar_expression для сравнения каждого значения, возвращенного вложенным запросом, перечислены в разделе ALL (Transact-SQL). Например, если вложенный запрос возвращает значения 2 и 3, то при значении scalar_expression = SOME (subquery) для выражения scalar_express, равного 2, будет возвращаться TRUE. Если вложенный запрос возвращает значения 2 и 3, то при scalar_expression = ALL (subquery) будет возвращаться FALSE, так как некоторые значения вложенного запроса (значение 3) могут не отвечать критериям этого выражения.

Примеры

A. Выполнение простого примера

Следующие инструкции создают простую таблицу и добавляют значения 1, 2, 3 и 4 в столбец ID.

CREATE TABLE T1  
(ID INT) ;  
GO  
INSERT T1 VALUES (1) ;  
INSERT T1 VALUES (2) ;  
INSERT T1 VALUES (3) ;  
INSERT T1 VALUES (4) ;  

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

IF 3 < SOME (SELECT ID FROM T1)  
PRINT 'TRUE'   
ELSE  
PRINT 'FALSE' ;  

Следующий запрос возвращает значение FALSE, так как 3 не меньше каждого из значений в таблице.

IF 3 < ALL (SELECT ID FROM T1)  
PRINT 'TRUE'   
ELSE  
PRINT 'FALSE' ;  

Б. Выполнение практического примера

В приведенном ниже примере показано создание хранимой процедуры, определяющей, могут ли в течение заданного количества дней быть выполнены все части заказа с указанным идентификатором SalesOrderID из базы данных AdventureWorks2012. В этом примере для создания списка количества значений DaysToManufacture для всех компонентов SalesOrderID используется вложенный запрос, а затем проводится проверка того, превышают ли все значения, возвращаемые вложенным запросом, указанное количество дней. Если каждое возвращаемое значение DaysToManufacture меньше заданного значения, то условие равно TRUE и печатается первое сообщение.

-- Uses AdventureWorks
CREATE PROCEDURE ManyDaysToComplete @OrderID INT, @NumberOfDays INT  
AS  
IF   
@NumberOfDays < SOME  
   (  
    SELECT DaysToManufacture  
    FROM Sales.SalesOrderDetail  
    JOIN Production.Product   
    ON Sales.SalesOrderDetail.ProductID = Production.Product.ProductID   
    WHERE SalesOrderID = @OrderID  
   )  
PRINT 'At least one item for this order can''t be manufactured in specified number of days.'
ELSE   
PRINT 'All items for this order can be manufactured in the specified number of days or less.' ;

Для проверки этой процедуры выполните ее, используя SalesOrderID``49080, имеющий один компонент, требующий на выполнение 2 дня, и два компонента, требующих немедленного выполнения. Первая инструкция отвечает этим критериям. Второй запрос — нет.

EXECUTE ManyDaysToComplete 49080, 2 ;  

Результирующий набор:

All items for this order can be manufactured in the specified number of days or less.

EXECUTE ManyDaysToComplete 49080, 1 ;  

Результирующий набор:

At least one item for this order can't be manufactured in specified number of days.

См. также раздел

  • ALL (Transact-SQL)
  • CASE (Transact-SQL)
  • Встроенные функции (Transact-SQL)
  • Операторы (Transact-SQL)
  • SELECT (Transact-SQL)
  • Предложение WHERE (Transact-SQL)
  • IN (Transact-SQL)
  • IS [NOT] DISTINCT FROM (Transact-SQL)

Отличие работы операторов ANY, SOME и ALL в языке T-SQL | Info-Comp.ru

Продолжаем изучать язык 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.

Содержание

  1. Операторы ANY и SOME в языке T-SQL
  2. Оператор ALL в языке T-SQL
  3. Исходные данные
  4. Примеры работы операторов ANY, SOME и ALL
  5. Пример 1
  6. Пример 2
  7. Пример 3

Операторы 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).

Заметка! XACT_ABORT в T-SQL – что это такое и как использовать.

Пример 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, в которых используется последовательная методика обучения специально для начинающих.

На этом предлагаю заканчивать надеюсь, материал был Вам полезен, пока!

Оператор SQL ANY, иллюстрированный практическими примерами

Резюме : в этом руководстве вы узнаете об операторе SQL ANY и о том, как его использовать для сравнения значения с набором значений.

Знакомство с оператором SQL ANY

Оператор ANY — это логический оператор, который сравнивает значение с набором значений, возвращаемых подзапросом. Перед оператором ANY должен стоять оператор сравнения >, >=, <, <=, =, <>, а за ним следует подзапрос.

Ниже показан синтаксис оператора ANY :

 

WHERE имя_столбца оператор сравнения ANY (подзапрос)

Язык кода: SQL (язык структурированных запросов) (sql)

Если подзапрос не возвращает ни одной строки, условие оценивается как ложное. Предположим, что подзапрос не возвращает нулевые строки. Ниже показано значение оператора ANY при его использовании с каждым оператором сравнения:

Условие Значение
x = ЛЮБОЙ (…) Значения в столбце c должны соответствовать одному или нескольким значениям в наборе, чтобы их оценка была истинной.
x != ЛЮБОЙ (…)  Значения в столбце c не должны совпадать с одним или несколькими значениями в наборе, чтобы их оценка была истинной.
x > ANY (…)  Значения в столбце c должны быть больше наименьшего значения в наборе, чтобы они были истинными.
x < ЛЮБОЙ (…)  Значения в столбце c должны быть меньше самого большого значения в наборе, чтобы оно было истинным.
x >= ANY (…)  Значения в столбце c должны быть больше или равны наименьшему значению в наборе, чтобы быть верными.
x <= ANY (…) Значения в столбце c должны быть меньше или равны наибольшему значению в наборе, чтобы оно было истинным.

SQL ЛЮБЫЕ примеры

Для демонстрации мы будем использовать таблицу сотрудников из примера базы данных:

SQL ANY с оператором равенства пример

Следующий оператор использует функцию AVG() и предложение GROUP BY для поиска средняя зарплата каждого отдела:

 

ВЫБЕРИТЕ ОКРУГЛ(СРЕДНЕЕ(зарплата), 2) ОТ сотрудники ГРУППА ПО id_отдела СОРТИРОВАТЬ ПО AVG(зарплата) DESC;

Язык кода: SQL (язык структурированных запросов) (sql)

Чтобы найти всех сотрудников, зарплата которых равна средней зарплате в их отделе, используйте следующий запрос:

 

SELECT имя, фамилия, зарплата ОТ сотрудники ГДЕ зарплата = ЛЮБАЯ ( ВЫБИРАТЬ СРЕДНЯЯ (зарплата) ОТ сотрудники ГРУППА ПО id_отдела) СОРТИРОВАТЬ ПО имя, фамилия, зарплата;

Язык кода: SQL (язык структурированных запросов) (sql)

Использование SQL ANY с оператором not equal to пример

Аналогично, следующий запрос находит всех сотрудников, чьи зарплаты не равны средней зарплате каждого отдела:

 

SELECT имя, фамилия, зарплата ОТ сотрудники ГДЕ зарплата <> ЛЮБАЯ (ВЫБЕРИТЕ СРЕДНЯЯ (зарплата) ОТ сотрудники СГРУППИРОВАТЬ ПО ИД_отдела) СОРТИРОВАТЬ ПО имя, фамилия, зарплата;

Язык кода: SQL (язык структурированных запросов) (sql)

Пример использования SQL ANY с оператором больше

Следующий запрос находит всех сотрудников, чья зарплата превышает среднюю зарплату в каждом отделе:

 

ВЫБИРАТЬ имя, фамилия, зарплата ОТ сотрудники ГДЕ зарплата > ЛЮБАЯ (ВЫБЕРИТЕ СРЕДНЯЯ (зарплата) ОТ сотрудники СГРУППИРОВАТЬ ПО ИД_отдела) СОРТИРОВАТЬ ПО зарплата;

Язык кода: SQL (язык структурированных запросов) (sql)

Обратите внимание, что самая низкая средняя заработная плата составляет 4 150 . Приведенный выше запрос возвращает всех сотрудников, чья зарплата выше минимальной зарплаты.

Использование SQL ANY с оператором больше или равно Пример

Следующая инструкция возвращает всех сотрудников, чья зарплата больше или равна средней зарплате в каждом отделе:

 

SELECT имя, фамилия, зарплата ОТ сотрудники ГДЕ зарплата >= ЛЮБАЯ (ВЫБЕРИТЕ СРЕДНЯЯ (зарплата) ОТ сотрудники СГРУППИРОВАТЬ ПО ИД_отдела) ЗАКАЗАТЬ ПО first_name , last_name , зарплате;

Язык кода: SQL (язык структурированных запросов) (sql)

Пример использования SQL ANY с оператором меньше

Следующий запрос находит всех сотрудников, чья зарплата меньше средней зарплаты в каждом отделе:

 

ВЫБЕРИТЕ имя, фамилия, зарплата ОТ сотрудники ГДЕ зарплата < ЛЮБАЯ (ВЫБЕРИТЕ СРЕДНЯЯ (зарплата) ОТ сотрудники СГРУППИРОВАТЬ ПО ИД_отдела) ЗАКАЗАТЬ ПО ЗАРАБОТНОЙ DESC;

Язык кода: SQL (язык структурированных запросов) (sql)

В этом примере сотрудники, чья зарплата меньше максимальной средней зарплаты в каждом отделе:

Использование SQL ANY с оператором меньше или равно Пример

Чтобы найти сотрудников, зарплата которых меньше или равна средней зарплате в каждом отделе, используйте следующий запрос:

 

SELECT имя, фамилия, зарплата ОТ сотрудники ГДЕ зарплата <= ЛЮБОЙ (ВЫБЕРИТЕ СРЕДНЯЯ (зарплата) ОТ сотрудники СГРУППИРОВАТЬ ПО ИД_отдела) ЗАКАЗАТЬ ПО ЗАРАБОТНОЙ DESC;

Язык кода: SQL (язык структурированных запросов) (sql)

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

Теперь вы должны знать, как использовать оператор SQL ANY для формирования условия путем сравнения значения с набором значений.

Было ли это руководство полезным?

Работа с операторами SQL ANY и ALL

Операторы SQL ANY и ALL полезны для оценки условий для ограничения результатов запроса; они часто передаются с операторами LIKE и ILIKE. Оператор ANY вернет истину, если какое-либо из условий, переданных в оценку, будет истинным, в то время как ALL вернет истину только в том случае, если все переданные в него условия верны.

Используйте эту страницу, чтобы лучше понять, как использовать ЛЮБЫЕ и ВСЕ операторы, примеры использования этих операторов и какие хранилища данных их поддерживают.

Операторы ANY и ALL имеют очень простой синтаксис и часто передаются в операторе LIKE/ILIKE или подзапросе:

где нравится/нравится любому/всем (array_of_options)

где = any /all (подзапрос)

Несколько замечаний по синтаксису и функциональности этого оператора:

  • Вы можете передать подзапрос оператору ANY или ALL вместо массива опций
  • Используйте оператор ILIKE с оператором ANY или ALL, чтобы избежать учета регистра

Теперь давайте перейдем к практическому примеру использования оператора ANY.

SQL ЛЮБОЙ пример​

 select 
order_id,
status
from {{ ref('orders') }}
где status как любой ('return%', 'ship%')

Этот простой запрос с использованием заказов Jaffle Shop table will return orders whose status is like the patterns start with 'return' or start with 'ship' :

order_id status
18 returned
23 return_pending
74 отправлено

Поскольку LIKE чувствителен к регистру, он не будет возвращать результаты в этом запросе для заказов со статусом ВОЗВРАЩЕНО или ОТПРАВЛЕНО . Если в ваших данных есть как строчные, так и прописные строки, рассмотрите возможность стандартизации регистра для строк с помощью функций UPPER и LOWER или используйте более гибкий оператор ILIKE.