Задачи на SELECT и WHERE
Выборка и фильтры·middle

Короткие семейные фильмы для утренника

Задача

Маркетинг готовит подборку «для семейного просмотра»: нужны фильмы, которые не затянут утренник и подходят детям по рейтингу. Просьба звучит так: «Дай фильмы длиной от 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)

Прорешай такие задачи сам

Читать разбор полезно, а настоящая прокачка — самому писать запросы и получать обратную связь. В симуляторе живая база и проверка запросов, лёгкий режим — бесплатно.

Прорешать в бесплатной песочнице

Смежные задачи

Вопросы по теме