Base de données Sakila : schéma, tables et exercices SQL
Sakila est la base de données d'exemple de MySQL qui décrit un réseau de magasins de location de films en DVD. Sur SQLtest.online, vous l'utilisez directement dans le navigateur : vous résolvez des exercices corrigés automatiquement et exécutez vos propres requêtes dans le bac à sable, sans rien installer.
- 16 tables et 7 vues
- 1 000 films
- 16 044 locations
- 179 exercices SQL
Qu'est-ce que Sakila
Sakila a été créée par Mike Hillyer, de l'équipe de documentation de MySQL, pour que les exemples de la documentation et des livres partagent un même schéma réaliste. Elle porte le nom de Sakila, le dauphin du logo MySQL, et est distribuée sous licence BSD.
La base modélise une activité ordinaire : un catalogue de films avec acteurs et genres, les clients et le personnel de deux magasins, les locations de disques et les paiements. C'est ce qui la rend idéale pour apprendre : les relations se comprennent sans explication, et il y a assez de données pour les regroupements, les fonctions de fenêtrage et l'analyse.
Diagramme ER
Le diagramme montre les tables de Sakila et les clés étrangères qui les relient. Cliquez pour l'ouvrir en taille réelle.
Contenu de la base
Les tables de Sakila se répartissent en trois groupes.
Catalogue de films
film, actor, category, language et les tables de liaison film_actor, film_category.
Magasins et personnes
store, staff, customer et les adresses : address → city → country.
Locations et paiements
inventory contient les disques de chaque magasin, rental les locations, payment les paiements.
L'essentiel à retenir : un client loue un disque, pas un film. C'est pourquoi rental est reliée à film par inventory, et non directement. La table film_text est une copie auxiliaire des titres et descriptions pour la recherche en texte intégral.
Volume de données des principales tables :
| Table | Lignes | Contenu |
|---|---|---|
| rental | 16 044 | locations de disques |
| payment | 16 049 | paiements des clients |
| film_actor | 5 462 | rôles des acteurs dans les films |
| inventory | 4 581 | disques en magasin |
| film | 1 000 | films |
| customer | 599 | clients |
| city | 600 | villes |
| actor | 200 | acteurs |
| country | 109 | pays |
| category | 16 | genres |
| store | 2 | magasins |
Structure des tables
Cliquez sur une table pour voir ses colonnes, une ligne d'exemple et ses clés.
Liste des tables
- actor_ididentifiant unique de l'enregistrement (PK)
- first_nameprénom de l'acteur
- last_namenom de famille de l'acteur
- last_updatedate et heure de la dernière mise à jour
| actor_id | first_name | last_name | last_update |
|---|---|---|---|
| 1 | John | Doe | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (actor_id)
- address_ididentifiant unique de l'enregistrement (PK)
- addressadresse postale
- address2adresse complémentaire
- districtdistrict ou région
- city_ididentifiant de la ville (FK)
- postal_codecode postal
- phonenuméro de téléphone
- last_updatedate et heure de la dernière mise à jour
| 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_ididentifiant unique de l'enregistrement (PK)
- namenom de la catégorie
- last_updatedate et heure de la dernière mise à jour
| category_id | name | last_update |
|---|---|---|
| 1 | Action | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (category_id)
- city_ididentifiant unique de l'enregistrement (PK)
- citynom de la ville
- country_ididentifiant du pays (FK)
- last_updatedate et heure de la dernière mise à jour
| 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_ididentifiant unique de l'enregistrement (PK)
- countrynom du pays
- last_updatedate et heure de la dernière mise à jour
| country_id | country | last_update |
|---|---|---|
| 1 | United States | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (country_id)
- customer_ididentifiant unique de l'enregistrement (PK)
- store_ididentifiant du magasin (FK)
- first_nameprénom du client
- last_namenom de famille du client
- emailadresse e-mail du client
- address_ididentifiant de l'adresse (FK)
- activeindicateur d'activité du client (0/1)
- create_datedate et heure d'ajout du client dans la base
- last_updatedate et heure de la dernière mise à jour
| 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_ididentifiant unique de l'enregistrement (PK)
- titletitre du film
- descriptionbrève description ou synopsis du film
- release_yearannée de sortie du film
- language_ididentifiant de la langue du film (FK)
- original_language_ididentifiant de la langue d'origine au cas où le film serait doublé
- rental_durationdurée de location en jours
- rental_ratecoût de location du film pour la durée spécifiée dans la colonne rental_duration
- lengthdurée du film en minutes
- replacement_costmontant de la pénalité en cas de perte ou de dégradation du disque
- ratingclassement (rating) attribué au film. Peut être : G, PG, PG-13, R, ou NC-17
- special_featuresliste des bonus inclus sur le DVD. Peut inclure : Trailers, Commentaries, Deleted Scenes, Behind the Scenes
- last_updatedate et heure de la dernière mise à jour
| film_id | title | description | release_year | language_id | original_language_id | rental_duration | rental_rate | length | replacement_cost | rating | special_features | last_update |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Titre du Film | Une brève description du 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_ididentifiant de l'acteur (FK)
- film_ididentifiant du film (FK)
- last_updatedate et heure de la dernière mise à jour
| 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_ididentifiant de chaque film (FK)
- category_ididentifiant de chaque catégorie (FK)
- last_updatedate et heure de la dernière mise à jour
| 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_ididentifiant unique de l'enregistrement (PK)
- film_ididentifiant du film (FK)
- store_ididentifiant du magasin où se trouve l'exemplaire (FK)
- last_updatedate et heure de la dernière mise à jour
| 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_ididentifiant unique de l'enregistrement (PK)
- namenom de la langue
- last_updatedate et heure de la dernière mise à jour
| language_id | name | last_update |
|---|---|---|
| 1 | English | 2023-01-01 12:00:00 |
- PRIMARY KEY, btree (language_id)
- payment_ididentifiant unique de l'enregistrement (PK)
- customer_ididentifiant du client (FK)
- staff_ididentifiant du membre du personnel qui a reçu le paiement (FK)
- rental_ididentifiant de l'enregistrement de location (FK)
- amountmontant du paiement
- payment_datedate et heure du paiement
- last_updatedate et heure de la dernière mise à jour
| 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_ididentifiant unique de l'enregistrement (PK)
- rental_datedate de début de location
- inventory_ididentifiant du disque (FK)
- customer_ididentifiant du client (FK)
- return_datedate de retour du film
- staff_idid du membre du personnel ayant émis le disque (FK)
- last_updatedate et heure de la dernière mise à jour
| 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_ididentifiant unique de l'enregistrement (PK)
- first_nameprénom du membre du personnel
- last_namenom de famille du membre du personnel
- address_ididentifiant de l'adresse (FK)
- picturephoto du membre du personnel
- emailadresse e-mail du membre du personnel
- store_idclé étrangère référençant la table des magasins (FK)
- activeindicateur d'activité du membre du personnel (0/1)
- usernamenom d'utilisateur pour la connexion au système
- passwordmot de passe pour la connexion
- last_updatedate et heure de la dernière mise à jour
| 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_ididentifiant unique de l'enregistrement (PK)
- manager_staff_ididentifiant du gérant du magasin (FK)
- address_ididentifiant de l'adresse (FK)
- last_updatedate et heure de la dernière mise à jour
| 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)
Exemples de requêtes
Ces requêtes montrent comment les tables sont reliées. Copiez-en une et exécutez-la dans le bac à sable.
Un film et sa langue : une relation simple plusieurs-à-un.
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 |
Où habite un client : une chaîne de quatre tables.
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 |
Quel film a été loué et combien a été payé : de la location au film en passant par 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 |
Exercices SQL par thème
La base Sakila compte 179 exercices, des simples requêtes SELECT jusqu'à l'analyse avec des fonctions de fenêtrage. Les solutions sont vérifiées automatiquement sur un vrai serveur MySQL. Le nombre à droite indique combien d'exercices compte le thème ; les points colorés montrent la plage de difficulté.
- Les bases du SQL 39
- Calculs 15
- Fonctions d'agrégation 27
- Sous-requêtes 8
- Expressions de table communes (CTE) 5
- Fonctions de fenêtrage 9
- Requêtes analytiques 33
- Manipulation de données (DML) 12
- Langage de définition de données (DDL) 4
Par où commencer
Les premiers exercices de la section « Base de données Sakila » :
- Obtenir les acteurs
- Obtenir la liste des noms d'acteurs
- Liste de films triée
- Dix premiers films par ordre alphabétique
- Liste des films — troisième page
- Obtenir une liste de films triée par plusieurs champs
- Obtenir le film le plus long
- Trouver les films longs
- Trouver les comédies longues
- Films classiques
Questions fréquentes
Faut-il installer MySQL pour utiliser Sakila ?
Non. Les exercices et le bac à sable de SQLtest.online exécutent les requêtes sur nos serveurs : un navigateur suffit. Dans le bac à sable, Sakila est disponible sous MySQL 8.0, MySQL 9.7 et MariaDB 10.
Où télécharger la base de données Sakila ?
Les fichiers officiels sakila-schema.sql et sakila-data.sql se trouvent sur la page des bases d'exemple de MySQL, et la documentation de Sakila les décrit.
Existe-t-il une version de Sakila pour PostgreSQL ?
Oui, il en existe un portage appelé Pagila. La structure est la même, mais certains types et fonctions sont remplacés par leurs équivalents PostgreSQL.
Peut-on modifier les données de Sakila ?
Dans le bac à sable, la base est en lecture seule pour que tout le monde voie les mêmes données. Les exercices sur INSERT, UPDATE et DELETE s'exécutent sur une copie temporaire de la table concernée, dont le contenu est ensuite vérifié.
Sakila convient-elle pour préparer un entretien SQL ?
Oui. Elle permet de s'entraîner facilement aux JOIN, aux regroupements, aux sous-requêtes et aux fonctions de fenêtrage, les sujets les plus demandés en entretien technique.