Приоритет логических операторов
При использовании в инструкции нескольких логических операторов первым вычисляется NOT, затем AND и, наконец, OR. Арифметические и побитовые операторы выполняются до логических.
В следующем примере условие цвета относится к модели продукта 21
, но не к модели продукта 20
, так как у оператора AND
приоритет над оператором OR
.
SELECT ProductID, ProductModelID
FROM AdventureWorks.Production.Product
WHERE ProductModelID = 20 OR ProductModelID = 21
AND Color = 'Red'
Можно изменить смысл запроса, добавляя скобки, чтобы добиться вычисления OR
сначала. В следующем запросе будут найдены модели 20
и 21
красного цвета.
SELECT ProductID, ProductModelID
FROM AdventureWorks.Production.Product
WHERE (ProductModelID = 20 OR ProductModelID = 21)
AND Color = 'Red'
С помощью скобок, даже если они не требуются, можно улучшить читаемость запросов и уменьшить вероятность совершения незаметной ошибки из-за приоритета операторов. Использование скобок практически не влияет на производительность. Следующий пример более понятен, чем исходный, хотя синтаксически они равноправны.
SELECT ProductID, ProductModelID
FROM AdventureWorks.Production.Product
WHERE ProductModelID = 20 OR (ProductModelID = 21
AND Color = 'Red')
См. также
Другие ресурсы
Операторы (Transact-SQL)
Предложение WHERE (Transact-SQL)