Короткие семейные фильмы для утренника
Задача
Маркетинг готовит подборку «для семейного просмотра»: нужны фильмы, которые не затянут утренник и подходят детям по рейтингу. Просьба звучит так: «Дай фильмы длиной от 60 до 90 минут с рейтингом G или PG».
Верни film_id, title, length и rating подходящих фильмов.
Схема данных
Учебная база проката dvdrental, одна таблица:
film(film_id, title, length, rating, ...)— каталог;length— длительность в минутах (integer),rating— возрастной рейтинг из набораG,PG,PG-13,R,NC-17.
Решение
SELECT film_id, title, length, rating
FROM film
WHERE length BETWEEN 60 AND 90
AND rating IN ('G', 'PG')
ORDER BY length, title;
Разбор
Здесь два условия, и оба — про удобные сокращения.
length BETWEEN 60 AND 90 — это то же самое, что length >= 60 AND length <= 90, только короче и читабельнее. Ключевое, что нужно держать в голове: BETWEEN включает обе границы. Фильм ровно на 60 минут и фильм ровно на 90 минут в выборку попадут. Если бы нужно было отсечь концы, BETWEEN не подошёл бы — писали бы явные строгие неравенства.
rating IN ('G', 'PG') — компактная замена для rating = 'G' OR rating = 'PG'. Когда вариантов два, разница косметическая, но на списке из десяти значений IN спасает от простыни OR-ов и от классической ошибки со скобками: без них A AND B OR C читается движком как (A AND B) OR C, и фильтр тихо разъезжается. IN эту ловушку убирает.
Оба условия соединены через AND — фильм должен удовлетворять и длине, и рейтингу одновременно. Если поменять AND на OR, смысл сломается: в выборку полезут двухчасовые боевики с рейтингом PG. Комбинация «и по длине, и по рейтингу» — это всегда AND.
Тонкость про IN и NULL: если бы в списке значений оказался NULL и мы использовали NOT IN, результат мог бы схлопнуться в пусто — та самая трёхзначная логика из задачи про должников и IS NULL. В нашем IN без отрицания этой мины нет, но привычка проверять список на NULL — правильная.
Ожидаемый результат
film_id | title | length | rating
--- | --- | --- | ---
485 | Jersey Sassy | 60 | PG
586 | Mockingbird Hollywood | 60 | PG
743 | Room Roman | 60 | PG
811 | Smile Earring | 60 | G
77 | Birds Perdition | 61 | G
106 | Bulworth Commandments | 61 | G
144 | Chinatown Gladiator | 61 | PG
688 | Polish Brooklyn | 61 | PG
914 | Trouble Date | 61 | PG
964 | Waterfront Deliverance | 61 | G
… всего строк: 87 (показаны первые 10)
Прорешай такие задачи сам
Читать разбор полезно, а настоящая прокачка — самому писать запросы и получать обратную связь. В симуляторе живая база и проверка запросов, лёгкий режим — бесплатно.
Прорешать в бесплатной песочнице