При составлении условия WHERE важно учитывать порядок выполнения условий. А выполняются они в следующем порядке:
NOTANDOR
Рассмотрим пример. Необходимо получить информацию о продуктах магазинов с кодами 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 |