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

💻 Примеры

📁 Блок: Финальный блок / 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;

Категории фильмов

DISTINCT не нужен, если читаем справочник category.

SELECT category_id, name
FROM category
ORDER BY name;

Все комедии

Связь film с category проходит через film_category.

SELECT f.title
FROM film AS f
JOIN film_category AS fc ON fc.film_id = f.film_id
JOIN category AS c ON c.category_id = fc.category_id
WHERE c.name = 'Comedy'
ORDER BY f.title;

Актёры и количество фильмов

film_actor связывает актёров и фильмы.

SELECT
  a.actor_id,
  a.first_name,
  a.last_name,
  COUNT(fa.film_id) AS film_count
FROM actor AS a
JOIN film_actor AS fa ON fa.actor_id = a.actor_id
GROUP BY a.actor_id, a.first_name, a.last_name
ORDER BY film_count DESC;

tax от 100 до 200

MongoDB-диапазон записывается внутри поля tax.

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

Топ-10 налогов

Сначала считаем документы по tax, затем сортируем и ограничиваем.

db.UK_used_cars.aggregate([
  { $group: { _id: '$tax', count: { $sum: 1 } } },
  { $sort: { count: -1 } },
  { $limit: 10 }
]);