Диапазоны с BETWEEN
Диапазоны вроде price >= 15 AND price <= 20 встречаются так часто, что в SQL есть более короткая запись: BETWEEN … AND …:
SELECT title, price
FROM games
WHERE price BETWEEN 15 AND 20
ORDER BY price, title;| title | price |
|---|---|
| Bakery Story | 15 |
| Ocean Deep | 15 |
| Pixel Racer | 15 |
| Lost Temple | 20 |
| Moon Farm | 20 |
Оба конца входят в диапазон: игры за $15 и за $20 есть в результате. price BETWEEN 15 AND 20 означает ровно то же, что price >= 15 AND price <= 20, только короче и читается легче. AND здесь — часть BETWEEN, он не соединяет два условия.
BETWEEN работает и с датами, ведь как текст они сравниваются правильно. Заказы летом 2024 года, с 1 июня по 31 августа:
SELECT id, ordered_at
FROM orders
WHERE ordered_at BETWEEN '2024-06-01' AND '2024-08-31'
ORDER BY ordered_at;| id | ordered_at |
|---|---|
| 7 | 2024-06-01 |
| 8 | 2024-06-18 |
| 9 | 2024-07-07 |
| 10 | 2024-08-23 |
Заказ 7 от 1 июня в результате есть: первый день диапазона входит, как и последний. (Если бы в датах было ещё и время, последний день снова пропал бы, как вы видели в предыдущем упражнении: '2024-08-31 18:30' больше, чем '2024-08-31'. Для таких дат используйте >= и < со следующим днём.)
NOT BETWEEN находит значения вне диапазона. Игры, которые стоят меньше $10 или больше $50:
SELECT title, price
FROM games
WHERE price NOT BETWEEN 10 AND 50
ORDER BY price;| title | price |
|---|---|
| Cube Logic | 5 |
| Knight's Oath | 60 |
Типичная ошибка: большее значение первым. price BETWEEN 20 AND 15 — не ошибка, но запрос ничего не находит: нет цены, которая одновременно не меньше 20 и не больше 15. Меньшее значение всегда идёт первым, а для дат — более ранняя.
Задание
- 1
Покажите название и цену игр, которые стоят от $25 до $35 включительно. Используйте
BETWEENи отсортируйте игры по цене, а затем по названию. Результат начинается так:title price Mystery Manor 25 Shadow Ninja 25 Tiny Kingdoms 25 Castle Siege 30 … … - 2
Ниже покажите ID и дату заказов за декабрь 2024 года, с 1 по 31 декабря, сначала самые старые:
id ordered_at 13 2024-12-05 14 2024-12-20 15 2024-12-23