База данных Sakila: схема, таблицы и SQL-задачи
Sakila — учебная база данных компании MySQL, которая описывает сеть пунктов проката фильмов на DVD. На SQLtest.online с ней можно работать прямо в браузере: решать задачи с автоматической проверкой и писать свои запросы в песочнице, ничего не устанавливая.
- 16 таблиц и 7 представлений
- 1 000 фильмов
- 16 044 записи о прокате
- 179 SQL-задачи
Что такое Sakila
Sakila создал Майк Хиллиер (Mike Hillyer) из команды документации MySQL, чтобы у примеров в документации и книгах была одна общая и достаточно реалистичная схема. Название база получила в честь дельфина Sakila с логотипа MySQL. Распространяется по лицензии BSD.
База моделирует обычный бизнес: каталог фильмов с актёрами и жанрами, клиентов и сотрудников двух магазинов, прокат дисков и оплату. Поэтому на ней удобно учиться: связи между таблицами понятны без пояснений, а данных хватает для группировок, оконных функций и аналитики.
ER-диаграмма
Диаграмма показывает таблицы Sakila и связи между ними по внешним ключам. Нажмите, чтобы открыть её в полном размере.
Из чего состоит база
Таблицы Sakila удобно разделить на три группы.
Каталог фильмов
film, actor, category, language и таблицы связей film_actor, film_category.
Магазины и люди
store, staff, customer и адреса: address → city → country.
Прокат и платежи
inventory — конкретные диски в магазинах, rental — выдачи, payment — оплаты.
Главное, что стоит запомнить: клиент берёт в прокат не фильм, а диск. Поэтому rental связана с film не напрямую, а через inventory. Таблица film_text — вспомогательная копия названий и описаний для полнотекстового поиска.
Сколько данных в основных таблицах:
| Таблица | Строк | Что хранит |
|---|---|---|
| rental | 16 044 | выдачи дисков |
| payment | 16 049 | платежи клиентов |
| film_actor | 5 462 | роли актёров в фильмах |
| inventory | 4 581 | диски в магазинах |
| film | 1 000 | фильмы |
| customer | 599 | клиенты |
| city | 600 | города |
| actor | 200 | актёры |
| country | 109 | страны |
| category | 16 | жанры |
| store | 2 | магазины |
Структура таблиц
Нажмите на таблицу, чтобы увидеть её столбцы, пример строки и ключи.
Список таблиц
- actor_id уникальный идентификатор записи (ПК).
- first_name имя актера.
- last_name фамилия актера.
- last_update дата и время последнего изменения.
| actor_id | first_name | last_name | last_update |
|---|---|---|---|
| 1 | John | Doe | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (actor_id)
- address_id уникальный идентификатор записи (ПК).
- address почтовый адрес.
- address2 дополнительный адрес.
- district район или регион.
- city_id идентификатор городов (ВК).
- postal_code почтовый индекс.
- phone номер телефона.
- last_update дата и время последнего изменения.
| address_id | address | address2 | district | city_id | postal_code | phone | last_update |
|---|---|---|---|---|---|---|---|
| 1 | 123 Main St | [null] | Downtown | 1 | 12345 | +1234567890 | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (address_id)
- FOREIGN KEY (city_id) REFERENCES city(city_id)
- category_id уникальный идентификатор записи (ПК).
- name название категории.
- last_update дата и время последнего изменения.
| category_id | name | last_update |
|---|---|---|
| 1 | Action | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (category_id)
- city_id уникальный идентификатор записи (ПК).
- city название города.
- country_id идентификатор страны (ВК).
- last_update дата и время последнего изменения.
| city_id | city | country_id | last_update |
|---|---|---|---|
| 1 | Metropolis | 1 | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (city_id)
- FOREIGN KEY (country_id) REFERENCES country(country_id)
- country_id уникальный идентификатор записи (ПК).
- country название страны.
- last_update дата и время последнего изменения.
| country_id | country | last_update |
|---|---|---|
| 1 | United States | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (country_id)
- customer_id уникальный идентификатор записи (ПК).
- store_id идентификатор магазина (ВК).
- first_name имя клиента.
- last_name фамилия клиента.
- email адрес электронной почты клиента.
- address_id идентификатор адреса (ВК).
- active идикатор активности клиента (0/1).
- create_date дата и время добавления в базу данных.
- last_update дата и время последнего изменения.
| customer_id | store_id | first_name | last_name | address_id | active | create_date | last_update | |
|---|---|---|---|---|---|---|---|---|
| 1 | 1 | John | Doe | john.doe@example.com | 1 | 1 | 2023-01-01 12:00:00 | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (customer_id)
- FOREIGN KEY (store_id) REFERENCES store(store_id)
- FOREIGN KEY (address_id) REFERENCES address(address_id)
- film_id уникальный идентификатор записи (ПК).
- title название фильма.
- description краткое описание или сюжет фильма.
- release_year год выхода фильма.
- language_id id языка фильма (ВК).
- original_language_id id языка оригинала фильма в случае, если фильм дублирован.
- rental_duration продолжительность периода аренды в днях.
- rental_rate стоимость проката фильма на период, указанный в столбце rental_duration.
- length продолжительность фильма в минутах.
- replacement_cost штраф за утерю или порчу диска.
- rating рейтинг, присвоенный фильму. Может быть одним из: G, PG, PG-13, R или NC-17.
- special_features список общих специальных функций, включенных в DVD. Может быть ноль или более: трейлеры, комментарии, удаленные сцены, за кадром.
- last_update дата и время последнего изменения.
| film_id | title | description | release_year | language_id | original_language_id | rental_duration | rental_rate | length | replacement_cost | rating | special_features | last_update |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Film Title | A brief description of the film. | 2000 | 1 | 2 | 5 | 4.99 | 120 | 19.99 | PG-13 | Trailers, Commentaries | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (film_id)
- FOREIGN KEY (language_id) REFERENCES language(language_id)
- FOREIGN KEY (original_language_id) REFERENCES language(language_id)
- actor_id идентификатор актера (ВК).
- film_id идентификатор фильма (ВК).
- last_update дата и время последнего изменения.
| actor_id | film_id | last_update |
|---|---|---|
| 1 | 1 | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (actor_id, film_id)
- FOREIGN KEY (actor_id) REFERENCES actor(actor_id)
- FOREIGN KEY (film_id) REFERENCES film(film_id)
- film_id идентификатор фильма (ВК).
- category_id идентификатор категории (ВК).
- last_update дата и время последнего изменения.
| film_id | category_id | last_update |
|---|---|---|
| 1 | 1 | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (film_id, category_id)
- FOREIGN KEY (film_id) REFERENCES film(film_id)
- FOREIGN KEY (category_id) REFERENCES category(category_id)
- inventory_id уникальный идентификатор записи (ПК).
- film_id идентификатор фильма (ВК).
- store_id id филиала, где находится диск (ВК).
- last_update дата и время последнего изменения.
| inventory_id | film_id | store_id | last_update |
|---|---|---|---|
| 1 | 23 | 2 | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (inventory_id)
- FOREIGN KEY (film_id) REFERENCES film(film_id)
- FOREIGN KEY (store_id) REFERENCES store(store_id)
- language_id уникальный идентификатор записи (ПК).
- name название языка.
- last_update дата и время последнего изменения.
| language_id | name | last_update |
|---|---|---|
| 1 | English | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (language_id)
- payment_id уникальный идентификатор записи (ПК).
- customer_id идентификатор клиента (ВК).
- staff_id id сотрудника принявшего платёж (ВК).
- rental_id идентификатор записи аренды (ВК).
- amount сумма платежа.
- payment_date дата и время платежа.
- last_update дата и время последнего изменения.
| payment_id | customer_id | staff_id | rental_id | amount | payment_date | last_update |
|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 4.99 | 2023-01-01 12:13:14 | 2023-01-01 12:14:15 |
- PRIMARY KEY, btree (payment_id)
- FOREIGN KEY (customer_id) REFERENCES customer(customer_id)
- FOREIGN KEY (staff_id) REFERENCES staff(staff_id)
- FOREIGN KEY (rental_id) REFERENCES rental(rental_id)
- rental_id уникальный идентификатор записи (ПК).
- rental_date дата начала аренды.
- inventory_id идентификатор диска (ВК).
- customer_id идентификатор клиента (ВК).
- return_date дата возврата фильма.
- staff_id id сотрудника выдавшего диск (ВК).
- last_update дата и время последнего изменения.
| rental_id | rental_date | inventory_id | customer_id | return_date | staff_id | last_update |
|---|---|---|---|---|---|---|
| 1 | 2023-01-01 16:15:21 | 1 | 1 | 2023-01-10 09:12:36 | 1 | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (rental_id)
- FOREIGN KEY (inventory_id) REFERENCES inventory(inventory_id)
- FOREIGN KEY (customer_id) REFERENCES customer(customer_id)
- FOREIGN KEY (staff_id) REFERENCES staff(staff_id)
- staff_id уникальный идентификатор записи (ПК).
- first_name имя сотрудника.
- last_name фамилия сотрудника.
- address_id идентификатор адреса (ВК).
- picture фотография сотрудника.
- email адрес электронной почты сотрудника.
- store_id id филиала (ВК).
- active идикатор активности сотрудника (0/1).
- username имя пользователя для входа в систему.
- password пароль для входа.
- last_update дата и время последнего изменения.
| staff_id | first_name | last_name | address_id | picture | store_id | active | username | password | last_update | |
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | John | Doe | 1 | [null] | john.doe@example.com | 1 | 1 | johndoe | ******** | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (staff_id)
- FOREIGN KEY (address_id) REFERENCES address(address_id)
- FOREIGN KEY (store_id) REFERENCES store(store_id)
- store_id уникальный идентификатор записи (ПК).
- manager_staff_id id менеджера магазина (ВК).
- address_id id адреса (ВК).
- last_update дата и время последнего изменения.
| store_id | manager_staff_id | address_id | last_update |
|---|---|---|---|
| 1 | 1 | 1 | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (store_id)
- FOREIGN KEY (manager_staff_id) REFERENCES staff(staff_id)
- FOREIGN KEY (address_id) REFERENCES address(address_id)
Примеры запросов
Эти запросы показывают, как связаны таблицы. Скопируйте любой и запустите в песочнице.
Фильм и его язык — простая связь «многие к одному»:
SELECT f.title, l.name AS language, f.rental_rate, f.length
FROM film f
JOIN language l ON l.language_id = f.language_id
ORDER BY f.film_id
LIMIT 3;
| title | language | rental_rate | length |
|---|---|---|---|
| ACADEMY DINOSAUR | English | 0.99 | 86 |
| ACE GOLDFINGER | English | 4.99 | 48 |
| ADAPTATION HOLES | English | 2.99 | 50 |
Где живёт клиент — цепочка из четырёх таблиц:
SELECT c.first_name, c.last_name, ci.city, co.country
FROM customer c
JOIN address a ON a.address_id = c.address_id
JOIN city ci ON ci.city_id = a.city_id
JOIN country co ON co.country_id = ci.country_id
ORDER BY c.customer_id
LIMIT 3;
| first_name | last_name | city | country |
|---|---|---|---|
| MARY | SMITH | Sasebo | Japan |
| PATRICIA | JOHNSON | San Bernardino | United States |
| LINDA | WILLIAMS | Athenai | Greece |
Какой фильм взяли и сколько заплатили — путь от проката к фильму через inventory:
SELECT r.rental_date, f.title, p.amount
FROM rental r
JOIN inventory i ON i.inventory_id = r.inventory_id
JOIN film f ON f.film_id = i.film_id
JOIN payment p ON p.rental_id = r.rental_id
ORDER BY r.rental_id
LIMIT 3;
| rental_date | title | amount |
|---|---|---|
| 2005-05-24 22:53:30 | BLANKET BEVERLY | 2.99 |
| 2005-05-24 22:54:33 | FREAKY POCUS | 2.99 |
| 2005-05-24 23:03:39 | GRADUATE LORD | 3.99 |
SQL-задачи по темам
Задач на базе Sakila: 179 — от простых SELECT до аналитики с оконными функциями. Решение проверяется автоматически на настоящей MySQL. Число справа — количество задач в теме, цветные метки — диапазон сложности.
- Основы SQL 39
- Вычисления 15
- Агрегатные функции 27
- Подзапросы 8
- Общие табличные выражения (CTE) 5
- Оконные функции 9
- Аналитические запросы 33
- Манипулирование данными (DML) 12
- Язык определения данных (DDL) 4
С чего начать
Первые задачи раздела «База данных Sakila»:
- Получить список актёров
- Имена актёров
- Упорядоченный список фильмов
- Первые 10 фильмов по алфавиту
- Третья страница списка фильмов
- Отсортировать фильмы по нескольким полям
- Самый длинный фильм
- Длинные фильмы
- Длинные комедии
- Классические фильмы
Частые вопросы
Нужно ли устанавливать MySQL, чтобы работать с Sakila?
Нет. Задачи и песочница на SQLtest.online выполняют запросы на сервере, достаточно браузера. В песочнице Sakila доступна в MySQL 8.0, MySQL 9.7 и MariaDB 10.
Где скачать базу Sakila?
Официальные файлы sakila-schema.sql и sakila-data.sql лежат на странице примеров баз данных MySQL, описание — в документации Sakila.
Есть ли Sakila для PostgreSQL?
Да, есть порт под названием Pagila. Структура та же, но некоторые типы и функции заменены на аналоги из PostgreSQL.
Можно ли изменять данные в Sakila?
В песочнице база доступна только для чтения, чтобы у всех были одинаковые данные. Задачи на INSERT, UPDATE и DELETE выполняются на временной копии нужной таблицы, после чего проверяется её содержимое.
Подойдёт ли Sakila для подготовки к собеседованию?
Да. На ней удобно отработать JOIN, группировки, подзапросы и оконные функции — темы, которые чаще всего спрашивают на технических интервью.