При составлении условия WHERE
важно учитывать порядок выполнения условий. А выполняются они в следующем порядке:
NOT
AND
OR
Рассмотрим пример. Необходимо получить информацию о продуктах магазинов с кодами 300
и 302
, стоимость которых превышает 20000.
Для начала получим информацию о продуктах магазинов с кодами 300
и 302
:
SELECT *
FROM product_price
WHERE store_id = 300
OR store_id = 302
product_id | store_id | price |
---|---|---|
1 | 300 | 10500.00 |
8 | 302 | 38300.00 |
9 | 302 | 44500.00 |
А в результате мы хотим получить следующие данные:
product_id | store_id | price |
---|---|---|
8 | 302 | 38300.00 |
9 | 302 | 44500.00 |
Для достижения необходимого результата необходимо добавить только условие на стоимость. Здесь многие ошибаются, не учитывая приоритеты выполнения операций:
SELECT *
FROM product_price
WHERE store_id = 300
OR store_id = 302
AND price > 20000
В результате выполнения запроса получим неверные данные:
product_id | store_id | price |
---|---|---|
1 | 300 | 10500.00 |
8 | 302 | 38300.00 |
9 | 302 | 44500.00 |
Данный результат получился следующим образом:
AND
более приоритетаная операция, поэтому сначало выполнилось условиеstore_id = 302 AND price > 20000
;- затем срабатывает условие
OR
Для изменения порядка выполнения необходимо воспользоваться скобками:
SELECT *
FROM product_price
WHERE (store_id = 300
OR store_id = 302)
AND price > 20000
product_id | store_id | price |
---|---|---|
8 | 302 | 38300.00 |
9 | 302 | 44500.00 |