При составлении условия 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 |