← К оглавлению занятия

✅ Решения

📁 Блок: Финальный блок / SQL и MongoDB ⏱️ Время изучения: ~90 мин 🎯 Сложность: Практикум

⚡ Кратко: суть занятия

Практикум 20 соединяет две части курса: SQL на базе sakila и MongoDB на коллекции ich.UK_used_cars.

SQL-блок повторяет подсчёт фильмов, категории, фильмы выбранной категории, актёров с количеством фильмов и языки.

Более сложные SQL-задачи требуют найти самого занятого актёра, актёров с более чем 5 фильмами и ранжировать актёров по числу фильмов.

MongoDB-блок повторяет равенство tax: 145, диапазон tax 100-200, логическое OR для tax 145 или 200.

Текстовый поиск ищет слово max в model без учёта регистра через regex /max/i.

Aggregation Pipeline используется для топ-10 частых налогов, списков производителей/моделей без повторов и поиска самых экономичных гибридов.

Главная цель занятия - не выучить новый оператор, а уверенно выбирать подходящий инструмент под задачу.

Топ-3 ошибки: забыть связующую таблицу film_actor, фильтровать агрегаты в WHERE вместо HAVING, написать regex без флага i.

Решения и разбор шагов

Фильмы в film

SELECT COUNT(*) AS film_count FROM film;

Категории

SELECT name FROM category ORDER BY name;

Comedy

JOIN film -> film_category -> category и WHERE c.name = 'Comedy'.

Актёры

JOIN actor -> film_actor, GROUP BY актёру, COUNT(film_id).

Языки

JOIN film -> language, GROUP BY l.language_id, l.name.

Самый занятый актёр

Возьмите агрегированный запрос по актёрам, ORDER BY film_count DESC LIMIT 1.

Более 5 фильмов

После GROUP BY используйте HAVING COUNT(fa.film_id) > 5.

Ранг

Оберните агрегат в CTE и примените RANK() OVER (ORDER BY film_count DESC).

tax = 145

db.UK_used_cars.find({ tax: 145 });

tax 100-200

db.UK_used_cars.find({ tax: { $gte: 100, $lte: 200 } });

tax 145 или 200

db.UK_used_cars.find({ $or: [ { tax: 145 }, { tax: 200 } ] });

model max

db.UK_used_cars.find({ model: /max/i });

Топ tax

$group по '$tax', затем $sort count:-1 и $limit:10.

Уникальные пары

Сначала $group по manufacturer/model, затем $addToSet для массивов.

Hybrid mpg

$match fuelType:'Hybrid', затем $sort mpg:-1.