Любое из условий: OR
С AND строка должна удовлетворять всем условиям. С OR достаточно одного: строка попадает в результат, если истинно хотя бы одно условие. Неважно какое, могут быть и оба. Гоночные и спортивные игры:
SELECT title, genre
FROM games
WHERE genre = 'Racing'
OR genre = 'Sports'
ORDER BY title;| title | genre |
|---|---|
| Goal Rush | Sports |
| Ice Hockey Pro | Sports |
| Pixel Racer | Racing |
| Turbo Karts | Racing |
Обратите внимание на «и» во фразе «гоночные и спортивные игры». Вам нужны оба вида игр, но ни одна игра не бывает одновременно гоночной и спортивной, поэтому genre = 'Racing' AND genre = 'Sports' ничего бы не нашёл. Когда переводите просьбу на SQL, представьте одну строку: должна ли она удовлетворять обоим условиям или хватит одного? Здесь хватит одного, значит, нужен OR.
Условия могут относиться к разным столбцам. Игры, которые очень дёшевы или только для взрослых:
SELECT title, price, age_rating
FROM games
WHERE price < 10
OR age_rating = 18
ORDER BY title;| title | price | age_rating |
|---|---|---|
| Cube Logic | 5 | 3 |
| Zombie Town | 30 | 18 |
Типичная ошибка: столбец записан только один раз. Для SQLite это не ошибка, но запрос находит только гоночные игры:
SELECT title, genre
FROM games
WHERE genre = 'Racing' OR 'Sports'
ORDER BY title;| title | genre |
|---|---|
| Pixel Racer | Racing |
| Turbo Karts | Racing |
OR соединяет два полных условия, а 'Sports' само по себе — не условие, а просто текст. SQLite считает такой текст ложью, поэтому остаётся только первое условие. Пишите столбец в каждом условии: genre = 'Racing' OR genre = 'Sports'.
Задание
- 1
Запрос в редакторе должен показывать покупателей из London или Leeds, но показывает только покупателей из London. Исправьте его. Результат отсортирован по имени и начинается так:
name city Emma Clark London Grace Hall London Isla Young Leeds … … - 2
Ниже покажите название и цену игр, которые стоят меньше $15 или больше $45, отсортировав их по цене:
title price Cube Logic 5 Word Quest 10 Goal Rush 50 Knight's Oath 60