Base de datos Sakila: esquema, tablas y ejercicios de SQL
Sakila es la base de datos de ejemplo de MySQL que describe una cadena de videoclubes de alquiler de películas en DVD. En SQLtest.online puedes usarla directamente en el navegador: resolver ejercicios con corrección automática y ejecutar tus propias consultas en el playground, sin instalar nada.
- 16 tablas y 7 vistas
- 1000 películas
- 16 044 alquileres
- 179 ejercicios de SQL
Qué es Sakila
Sakila la creó Mike Hillyer, del equipo de documentación de MySQL, para que los ejemplos de la documentación y de los libros compartieran un mismo esquema realista. Su nombre viene de Sakila, el delfín del logotipo de MySQL, y se distribuye con licencia BSD.
La base modela un negocio corriente: un catálogo de películas con actores y géneros, clientes y empleados de dos tiendas, alquileres de discos y pagos. Por eso es ideal para aprender: las relaciones se entienden sin explicaciones y hay datos suficientes para agrupaciones, funciones de ventana y análisis.
Diagrama ER
El diagrama muestra las tablas de Sakila y las claves foráneas que las unen. Haz clic para abrirlo a tamaño completo.
Qué contiene la base
Las tablas de Sakila se agrupan en tres bloques.
Catálogo de películas
film, actor, category, language y las tablas de relación film_actor, film_category.
Tiendas y personas
store, staff, customer y las direcciones: address → city → country.
Alquileres y pagos
inventory guarda los discos de cada tienda, rental los alquileres y payment los pagos.
Lo principal: el cliente alquila un disco, no una película. Por eso rental se relaciona con film a través de inventory, no directamente. La tabla film_text es una copia auxiliar de títulos y descripciones para la búsqueda de texto completo.
Cuántos datos hay en las tablas principales:
| Tabla | Filas | Contenido |
|---|---|---|
| rental | 16 044 | alquileres de discos |
| payment | 16 049 | pagos de clientes |
| film_actor | 5462 | papeles de los actores en las películas |
| inventory | 4581 | discos en las tiendas |
| film | 1000 | películas |
| customer | 599 | clientes |
| city | 600 | ciudades |
| actor | 200 | actores |
| country | 109 | países |
| category | 16 | géneros |
| store | 2 | tiendas |
Estructura de las tablas
Haz clic en una tabla para ver sus columnas, una fila de ejemplo y sus claves.
La lista de tablas
- actor_ididentificador único del registro (PK)
- first_namenombre del actor
- last_nameapellido del actor
- last_updatefecha y hora de la última actualización
| actor_id | first_name | last_name | last_update |
|---|---|---|---|
| 1 | John | Doe | 2023-01-01 12:00:00 |
- CLAVE PRIMARIA, btree (actor_id)
- address_ididentificador único del registro (PK)
- addressdirección postal
- address2dirección adicional
- districtdistrito o región
- city_ididentificador de la ciudad (FK)
- postal_codecódigo postal
- phonenúmero de teléfono
- last_updatefecha y hora de la última actualización
| 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 |
- CLAVE PRIMARIA, btree (address_id)
- CLAVE FORÁNEA (city_id) REFERENCIAS city(city_id)
- category_ididentificador único del registro (PK)
- namenombre de la categoría
- last_updatefecha y hora de la última actualización
| category_id | name | last_update |
|---|---|---|
| 1 | Acción | 2023-01-01 12:00:00 |
- CLAVE PRIMARIA, btree (category_id)
- city_ididentificador único del registro (PK)
- citynombre de la ciudad
- country_ididentificador del país (FK)
- last_updatefecha y hora de la última actualización
| city_id | city | country_id | last_update |
|---|---|---|---|
| 1 | Metropolis | 1 | 2023-01-01 12:00:00 |
- CLAVE PRIMARIA, btree (city_id)
- CLAVE FORÁNEA (country_id) REFERENCIAS country(country_id)
- country_ididentificador único del registro (PK)
- countrynombre del país
- last_updatefecha y hora de la última actualización
| country_id | country | last_update |
|---|---|---|
| 1 | Estados Unidos | 2023-01-01 12:00:00 |
- CLAVE PRIMARIA, btree (country_id)
- customer_ididentificador único del registro (PK)
- store_ididentificador de la tienda (FK)
- first_namenombre del cliente
- last_nameapellido del cliente
- emaildirección de correo electrónico del cliente
- address_ididentificador de la dirección (FK)
- activeindicador de actividad del cliente (0/1)
- create_datefecha y hora en que se agregó el cliente a la base de datos
- last_updatefecha y hora de la última actualización
| 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 |
- CLAVE PRIMARIA, btree (customer_id)
- CLAVE FORÁNEA (store_id) REFERENCIAS store(store_id)
- CLAVE FORÁNEA (address_id) REFERENCIAS address(address_id)
- film_ididentificador único del registro (PK)
- titletítulo de la película
- descriptionbreve descripción o trama de la película
- release_yearaño en que se lanzó la película
- language_ididentificador del idioma de la película (FK)
- original_language_ididentificador del idioma original de la película en caso de que esté doblada a un nuevo idioma
- rental_durationduración del período de alquiler en días
- rental_ratecosto de alquilar la película por la duración especificada en la columna rental_duration
- lengthduración de la película en minutos
- replacement_costmonto de penalización por pérdida o daño del disco
- ratingcalificación asignada a la película. Puede ser una de: G, PG, PG-13, R, o NC-17
- special_featureslista de características especiales incluidas en el DVD. Puede ser cero o más de: Tráilers, Comentarios, Escenas eliminadas, Detrás de cámaras
- last_updatefecha y hora de la última actualización
| film_id | title | description | release_year | language_id | original_language_id | rental_duration | rental_rate | length | replacement_cost | rating | special_features | last_update |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Título de la película | Una breve descripción de la película. | 2000 | 1 | 2 | 5 | 4.99 | 120 | 19.99 | PG-13 | Tráilers, Comentarios | 2023-01-01 12:00:00 |
- CLAVE PRIMARIA, btree (film_id)
- CLAVE FORÁNEA (language_id) REFERENCIAS language(language_id)
- CLAVE FORÁNEA (original_language_id) REFERENCIAS language(language_id)
- actor_ididentificador del actor (FK)
- film_ididentificador de la película (FK)
- last_updatefecha y hora de la última
Consultas de ejemplo
Estas consultas muestran cómo se relacionan las tablas. Copia cualquiera y ejecútala en el playground.
Una película y su idioma: una relación sencilla de muchos a uno.
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 |
Dónde vive un cliente: una cadena de cuatro tablas.
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 |
Qué película se alquiló y cuánto se pagó: del alquiler a la película pasando por 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 |
Ejercicios de SQL por tema
La base Sakila tiene 179 ejercicios, desde consultas SELECT sencillas hasta análisis con funciones de ventana. Las soluciones se comprueban automáticamente en un MySQL real. El número de la derecha es la cantidad de ejercicios del tema; los puntos de color muestran el rango de dificultad.
- Fundamentos de SQL 39
- Cálculos 15
- Funciones de Agregación 27
- Subconsultas 8
- Expresiones de Tabla Comunes (CTE) 5
- Funciones de Ventana 9
- Consultas analíticas 33
- Consultas de manipulación de datos (DML) 12
- Lenguaje de Definición de Datos (DDL) 4
Por dónde empezar
Los primeros ejercicios de la sección «Base de datos Sakila»:
- Obtener los actores
- Recuperar Nombres de Actores
- Títulos de Películas Ordenados
- Las 10 Mejores Películas por Título
- Lista de Películas - Tercera Página
- Ordenar Películas por Múltiples Campos
- La Película Más Larga
- Identificar Películas Largas
- Encontrar Comedias Largas
- Películas Clásicas
Todos los ejercicios de Sakila →
Preguntas frecuentes
¿Hay que instalar MySQL para usar Sakila?
No. Los ejercicios y el playground de SQLtest.online ejecutan las consultas en nuestros servidores, así que basta con un navegador. En el playground, Sakila está disponible en MySQL 8.0, MySQL 9.7 y MariaDB 10.
¿Dónde descargar la base de datos Sakila?
Los archivos oficiales sakila-schema.sql y sakila-data.sql están en la página de bases de datos de ejemplo de MySQL, y la documentación de Sakila los describe.
¿Existe Sakila para PostgreSQL?
Sí, existe una adaptación llamada Pagila. La estructura es la misma, pero algunos tipos y funciones se sustituyen por sus equivalentes de PostgreSQL.
¿Se pueden modificar los datos de Sakila?
En el playground la base es de solo lectura, para que todos vean los mismos datos. Los ejercicios de INSERT, UPDATE y DELETE se ejecutan sobre una copia temporal de la tabla necesaria, y después se comprueba el contenido de esa copia.
¿Sirve Sakila para preparar una entrevista de SQL?
Sí. Con ella es fácil practicar JOIN, agrupaciones, subconsultas y funciones de ventana, los temas que más se preguntan en las entrevistas técnicas.