Чем any отличается от in в sql
Перейти к содержимому

Чем any отличается от in в sql

  • автор:

SOME | ANY (Transact-SQL)

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

Синтаксис

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) могут не отвечать критериям этого выражения.

Примеры

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

Следующие инструкции создают простую таблицу и добавляют значения 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' ; 

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

В приведенном ниже примере показано создание хранимой процедуры, определяющей, могут ли в течение заданного количества дней быть выполнены все части заказа с указанным идентификатором SalesOrderID из базы данных AdventureWorks2022 . В этом примере для создания списка количества значений 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)

Обратная связь

Были ли сведения на этой странице полезными?

Обратная связь

Отправить и просмотреть отзыв по

SQL - Операторы ANY и ALL

Операторы ANY и ALL используются с предложением WHERE или HAVING. Оператор ANY возвращает true, если какое-либо из значений подзапроса соответствует условию. Оператор ALL возвращает true, если все значения подзапроса удовлетворяют условию.

Синтаксис ANY

SELECT column_name(s) FROM table_name WHERE column_name operator ANY (SELECT column_name FROM table_name WHERE condition);

Синтаксис ALL

SELECT column_name(s) FROM table_name WHERE column_name operator ALL (SELECT column_name FROM table_name WHERE condition);

Пример ANY

Оператор ANY возвращает TRUE, если какое-либо из значений подзапроса соответствует условию. Следующий оператор SQL возвращает TRUE и перечисляет имена товаров, если он находит ЛЮБЫЕ записи в таблице info, с количеством = 15:

Пример:

SELECT name FROM product WHERE product_id = ANY (SELECT product_id FROM info WHERE counts = 15);

Следующий оператор SQL возвращает TRUE и перечисляет имена товаров, если он находит ЛЮБЫЕ записи в таблице info, с количеством > 15:

Пример:

SELECT name FROM product WHERE product_id = ANY (SELECT product_id FROM info WHERE counts > 15);

Пример ALL

Оператор ALL возвращает TRUE, если все значения подзапроса удовлетворяют условию.

Следующий оператор SQL возвращает TRUE и перечисляет имена товаров, если ВСЕ записи в таблице info имеют количество = 7:

Пример:

SELECT name FROM product WHERE product_id = ALL (SELECT product_id FROM info WHERE couns =7);

SQL ANY и ALL

Операторы ANY и ALL используются с предложением WHERE или HAVING.

Оператор ANY возвращает true, если какое-либо из значений подзапроса удовлетворяет условию.

Оператор ALL возвращает true, если все значения подзапроса удовлетворяют условию.

Синтаксис ANY

SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY
(SELECT column_name FROM table_name WHERE condition);

Синтаксис ALL

SELECT column_name(s)
FROM table_name
(SELECT column_name FROM table_name WHERE condition);

Примечание: Оператор должен быть стандартным оператором сравнения (=, <>, !=, >, >=,

Демо база данных

Ниже приведен выбор из таблицы "Products" в образце базы данных Northwind:

ProductID ProductName SupplierID CategoryID Unit Price
1 Chais 1 1 10 boxes x 20 bags 18
2 Chang 1 1 24 - 12 oz bottles 19
3 Aniseed Syrup 1 2 12 - 550 ml bottles 10
4 Chef Anton's Cajun Seasoning 2 2 48 - 6 oz jars 22
5 Chef Anton's Gumbo Mix 2 2 36 boxes 21.35

И выбор из таблицы "OrderDetails":

OrderDetailID OrderID ProductID Quantity
1 10248 11 12
2 10248 42 10
3 10248 72 5
4 10249 14 9
5 10249 51 40

Примеры SQL ANY

Оператор ANY возвращает TRUE, если какое-либо из значений подзапроса удовлетворяет условию.

Следующий оператор SQL возвращает TRUE и перечисляет названия продуктов, если он находит какие-либо записи в таблице OrderDetails, что количество = 10:

Пример

SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);

Следующий оператор SQL возвращает TRUE и перечисляет названия продуктов, если он находит какие-либо записи в таблице OrderDetails, что количество > 99:

Пример

SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID FROM OrderDetails WHERE Quantity > 99);

Пример SQL ALL

Оператор ALL возвращает TRUE, если все значения подзапроса удовлетворяют условию.

Следующая инструкция SQL возвращает TRUE и перечисляет названия продуктов, если все записи в таблице OrderDetails имеют значение quantity = 10 ( таким образом, этот пример возвращает FALSE, поскольку не все записи в таблице OrderDetails имеют значение quantity = 10):

Пример

SELECT ProductName
FROM Products
WHERE ProductID = ALL (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);

Мы только что запустили
SchoolsW3 видео

курс сегодня!

Сообщить об ошибке

Если вы хотите сообщить об ошибке или внести предложение, не стесняйтесь отправлять на электронное письмо:

Ваше предложение:

Спасибо Вам за то, что помогаете!

Ваше сообщение было отправлено в SchoolsW3.

Schoolsw3 оптимизирован для бесплатного обучения, проверки и подготовки знаний. Примеры в редакторе упрощают и улучшают чтение и базовое понимание. Учебники, ссылки, примеры постоянно пересматриваются, чтобы избежать ошибок, но не возможно гарантировать полную правильность всего содержания. Некоторые страницы сайта могут быть не переведены на РУССКИЙ язык, можно отправить страницу как ошибку, так же можете самостоятельно заняться переводом. Используя данный сайт, вы соглашаетесь прочитать и принять Условия к использованию, Cookies и политика конфиденциальности.

В чем отличие подзапросов EXISTS и IN?

Интересует работа EXISTS в данном случае, если возвращается что-то в подзапросе, то должно выбраться все в основном запросе или нет? В данном случае возвращается 65 строк. Тогда почему если написать такое, то выберет сразу все записи?

SELECT company_name, contact_name, customer_id FROM customers WHERE EXISTS (SELECT customer_id FROM orders WHERE orders.customer_id = 'VINET') 

получается фильтрация идет также как при обычном IN или как? Помогите разобраться.
Отслеживать
задан 25 янв 2022 в 20:44
Random.random Random.random
21 3 3 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

В чем отличие подзапросов EXISTS и IN?

  1. WHERE EXISTS - как правило, коррелированный подзапрос. WHERE IN - как правило, нет.
  2. WHERE EXISTS прерывает поиск, как только найдена первая запись, соответствующая подзапросу. WHERE IN всегда получает полный набор записей подзапроса, а затем проверяет на вхождение.
  3. Подзапрос во WHERE IN допускает повторное использование, если он некоррелированный. Подзапрос во WHERE EXISTS , если он коррелированный, не предусматривает повторного использования по своей сути и выполняется для каждой записи.
  4. WHERE IN может содержать статическое выражение (обычно список литералов), тогда как WHERE EXISTS всегда содержит подзапрос.

Применительно к запросу, показанному в тексте вопроса.

Запрос в условии - некоррелированный. Поэтому он будет выполнен независимо, а его результат использован в дальнейшем как константа.

Т.е. суммарно - если в таблице orders есть хотя бы одна запись с orders.customer_id = 'VINET' , то будет возвращён результат выполнения запроса SELECT company_name, contact_name, customer_id FROM customers , иначе будет возвращён пустой набор записей.

Коррелированным называется подзапрос, если результат его выполнения зависит от значений, полученных из внешнего подзапроса. Например, от значения поля записи во внешнем запросе, для которой выполняется подзапрос.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *