Скобки и NOT
Когда в условии есть и AND, и OR, важно, какой из них выполняется первым. Допустим, вам нужны спортивные или гоночные игры дешевле $20, и вы пишете:
SELECT title, genre, price
FROM games
WHERE genre = 'Sports' OR genre = 'Racing' AND price < 20
ORDER BY title;| title | genre | price |
|---|---|---|
| Goal Rush | Sports | 50 |
| Ice Hockey Pro | Sports | 45 |
| Pixel Racer | Racing | 15 |
Goal Rush стоит $50, почему же он в результате? AND выполняется раньше OR, как умножение раньше сложения в математике. SQLite сначала объединяет genre = 'Racing' AND price < 20 и только потом добавляет OR genre = 'Sports'. Поэтому запрос нашёл гоночные игры дешевле $20 и все спортивные игры, какая бы ни была у них цена.
Чтобы OR выполнялся первым, возьмите его в скобки, как в математике:
SELECT title, genre, price
FROM games
WHERE (genre = 'Sports' OR genre = 'Racing') AND price < 20
ORDER BY title;| title | genre | price |
|---|---|---|
| Pixel Racer | Racing | 15 |
Теперь каждая игра должна быть спортивной или гоночной и при этом стоить меньше $20. Когда в условии смешаны AND и OR, всегда ставьте скобки: не придётся вспоминать, что выполняется раньше, а тот, кто будет читать запрос, сразу увидит, что вы имели в виду.
NOT перед условием переворачивает его: оно истинно там, где условие ложно, и наоборот. NOT price < 20 — то же самое, что price >= 20. Особенно полезно ставить его перед скобками: тогда переворачивается всё условие внутри них. Игры, которые не спортивные и не гоночные:
SELECT title, genre
FROM games
WHERE NOT (genre = 'Sports' OR genre = 'Racing')
ORDER BY title;| title | genre |
|---|---|
| Bakery Story | Simulation |
| Castle Siege | Strategy |
| Cube Logic | Puzzle |
| … | … |
Без скобок NOT перевернул бы только первое условие: NOT genre = 'Sports' OR genre = 'Racing' находит все игры, которые не спортивные, включая гоночные.
Задание
- 1
Запрос в редакторе должен показывать оплаченные заказы покупателей с ID 6 и 8, но показывает ещё и один возвращённый заказ. Добавьте скобки, чтобы он показывал только оплаченные заказы этих двух покупателей:
id customer_id status 10 8 paid 12 6 paid 25 6 paid - 2
Ниже добавьте запрос для страницы для взрослых игроков: все игры, кроме дешёвых игр для маленьких детей. Дешёвые игры для маленьких детей — это игры, подходящие с 3 лет, которые стоят меньше $20. Запишите это условие в скобках и переверните его с помощью
NOT. Покажите название, возрастной рейтинг и цену, отсортировав по цене, а затем по названию. Результат начинается так:title age_rating price Word Quest 7 10 Ocean Deep 7 15 Lost Temple 12 20 Moon Farm 3 20 … … …