Найти в Дзене
Илья Хохлов

Приоритеты операторов в SQL запросах

Всем привет, друзья!
Как вы думаете, какие строки будут отобраны в результате следующего запроса: SELECT *
  FROM VOUCHERS
WHERE CLIENT_ID = 1
      AND DOC_TYPE = 2
         OR FILIAL_ID = 3 те, где CLIENT_ID = 1 и ещё такие строки, где либо DOC_TYPE = 2 либо FILIAL_ID = 3 ИЛИ, ВСЁ ЖЕ, те, где CLIENT_ID = 1 и одновременно в столбце DOC_TYPE = 2 и ещё такие строки, где FILIAL_ID = 3 и не важно какой CLIENT_ID и DOC_TYPE? Здесь в силу вступает правило приоритета операторов. OR разделяет условия во WHERE на два: будут отобраны строки у которых CLIENT_ID = 1 и одновременно с этим в столбце DOC_TYPE = 2 и не важно какой FILIAL_ID. И потом к полученным данным ещё будут отобраны строки у которых FILIAL_ID = 3 вне зависимости от значений в других столбцах. Если нужно отобрать строки с CLIENT_ID = 1 и в дополнении у них должен быть либо DOC_TYPE = 2 либо FILIAL_ID = 3, то мы можем воспользоваться скобками: SELECT *
  FROM VOUCHERS
WHERE CLIENT_ID = 1
      AND (DOC_TYPE = 2 OR FILIAL_ID = 3) Д

Всем привет, друзья!
Как вы думаете, какие строки будут отобраны в результате следующего запроса:

SELECT *
  FROM VOUCHERS
WHERE CLIENT_ID = 1
      AND DOC_TYPE = 2
         OR FILIAL_ID = 3

те, где CLIENT_ID = 1 и ещё такие строки, где либо DOC_TYPE = 2 либо FILIAL_ID = 3

ИЛИ, ВСЁ ЖЕ,

те, где CLIENT_ID = 1 и одновременно в столбце DOC_TYPE = 2 и ещё такие строки, где FILIAL_ID = 3 и не важно какой CLIENT_ID и DOC_TYPE?

Здесь в силу вступает правило приоритета операторов. OR разделяет условия во WHERE на два: будут отобраны строки у которых CLIENT_ID = 1 и одновременно с этим в столбце DOC_TYPE = 2 и не важно какой FILIAL_ID. И потом к полученным данным ещё будут отобраны строки у которых FILIAL_ID = 3 вне зависимости от значений в других столбцах.

Если нужно отобрать строки с CLIENT_ID = 1 и в дополнении у них должен быть либо DOC_TYPE = 2 либо FILIAL_ID = 3, то мы можем воспользоваться скобками:

SELECT *
  FROM VOUCHERS
WHERE CLIENT_ID = 1
      AND (DOC_TYPE = 2 OR FILIAL_ID = 3)

Для наглядности, всё что после AND, я вынес на отдельную строку. Благодаря скобкам, всё что в них, будет выполняться как единое целое. Итак: будут отобраны строки со значением CLIENT_ID = 1, и из всех полученных строк, удовлетворяющих этому условию, останутся те, у которых либо DOC_TYPE = 2, либо FILIAL_ID = 3.

Буду рад если понравилась статья! Не забудьте поставить лайк и подписаться на мой канал, если Вы еще не подписаны. Так Вы поддерживаете нашу работу.