360 lines
12 KiB
Markdown
360 lines
12 KiB
Markdown
|
|
# TP : Base de données d'un service de streaming musical
|
||
|
|
|
||
|
|
## Contexte
|
||
|
|
|
||
|
|
Vous êtes data analyst chez **Musicfy**, un service de streaming musical concurrent de Spotify et Deezer. Votre mission est d'analyser les données d'écoute pour comprendre les habitudes des utilisateurs et proposer des améliorations.
|
||
|
|
|
||
|
|
Vous disposez d'une base de données contenant les informations sur les artistes, albums, titres, utilisateurs et leurs écoutes.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Objectifs
|
||
|
|
|
||
|
|
- Pratiquer les requêtes SQL sur une base de données réaliste
|
||
|
|
- Maîtriser les jointures entre plusieurs tables
|
||
|
|
- Utiliser les fonctions d'agrégation pour l'analyse de données
|
||
|
|
- Comprendre l'organisation d'une base de données relationnelle
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Partie 1 : Découverte de la base de données
|
||
|
|
|
||
|
|
### 1.1. Création de la base
|
||
|
|
|
||
|
|
1. Ouvrez **DB Browser for SQLite** et créez une nouvelle base de données `musicfy.db`.
|
||
|
|
|
||
|
|
2. Exécutez les requêtes suivantes pour créer les tables :
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Table des artistes
|
||
|
|
CREATE TABLE ARTISTES (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
nom TEXT NOT NULL,
|
||
|
|
pays TEXT,
|
||
|
|
genre_principal TEXT,
|
||
|
|
ann_debut INTEGER
|
||
|
|
);
|
||
|
|
|
||
|
|
-- Table des albums
|
||
|
|
CREATE TABLE ALBUMS (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
titre TEXT NOT NULL,
|
||
|
|
id_artiste INTEGER,
|
||
|
|
ann_sortie INTEGER,
|
||
|
|
nb_titres INTEGER,
|
||
|
|
FOREIGN KEY (id_artiste) REFERENCES ARTISTES(id)
|
||
|
|
);
|
||
|
|
|
||
|
|
-- Table des titres (chansons)
|
||
|
|
CREATE TABLE TITRES (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
nom TEXT NOT NULL,
|
||
|
|
id_album INTEGER,
|
||
|
|
duree_sec INTEGER,
|
||
|
|
explicite BOOLEAN DEFAULT FALSE,
|
||
|
|
FOREIGN KEY (id_album) REFERENCES ALBUMS(id)
|
||
|
|
);
|
||
|
|
|
||
|
|
-- Table des utilisateurs
|
||
|
|
CREATE TABLE UTILISATEURS (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
pseudo TEXT NOT NULL,
|
||
|
|
email TEXT UNIQUE,
|
||
|
|
pays TEXT,
|
||
|
|
type_abo TEXT DEFAULT 'gratuit',
|
||
|
|
date_inscription DATE
|
||
|
|
);
|
||
|
|
|
||
|
|
-- Table des écoutes
|
||
|
|
CREATE TABLE ECOUTES (
|
||
|
|
id INTEGER PRIMARY KEY,
|
||
|
|
id_utilisateur INTEGER,
|
||
|
|
id_titre INTEGER,
|
||
|
|
date_ecoute DATE,
|
||
|
|
duree_ecoute_sec INTEGER,
|
||
|
|
FOREIGN KEY (id_utilisateur) REFERENCES UTILISATEURS(id),
|
||
|
|
FOREIGN KEY (id_titre) REFERENCES TITRES(id)
|
||
|
|
);
|
||
|
|
```
|
||
|
|
|
||
|
|
### 1.2. Insertion des données
|
||
|
|
|
||
|
|
Exécutez les requêtes suivantes pour insérer les données :
|
||
|
|
|
||
|
|
```sql
|
||
|
|
-- Artistes
|
||
|
|
INSERT INTO ARTISTES (id, nom, pays, genre_principal, ann_debut) VALUES
|
||
|
|
(1, 'Daft Punk', 'France', 'Electro', 1993),
|
||
|
|
(2, 'Kendrick Lamar', 'USA', 'Hip-Hop', 2004),
|
||
|
|
(3, 'Adele', 'Royaume-Uni', 'Pop', 2006),
|
||
|
|
(4, 'BTS', 'Corée du Sud', 'K-Pop', 2013),
|
||
|
|
(5, 'Stromae', 'Belgique', 'Electro', 2009),
|
||
|
|
(6, 'Taylor Swift', 'USA', 'Pop', 2004),
|
||
|
|
(7, 'PNL', 'France', 'Hip-Hop', 2014),
|
||
|
|
(8, 'Beyoncé', 'USA', 'R&B', 1997),
|
||
|
|
(9, 'Ed Sheeran', 'Royaume-Uni', 'Pop', 2004),
|
||
|
|
(10, 'Aya Nakamura', 'France', 'Pop', 2014);
|
||
|
|
|
||
|
|
-- Albums
|
||
|
|
INSERT INTO ALBUMS (id, titre, id_artiste, ann_sortie, nb_titres) VALUES
|
||
|
|
(1, 'Random Access Memories', 1, 2013, 13),
|
||
|
|
(2, 'Discovery', 1, 2001, 14),
|
||
|
|
(3, 'DAMN.', 2, 2017, 14),
|
||
|
|
(4, 'To Pimp a Butterfly', 2, 2015, 16),
|
||
|
|
(5, '21', 3, 2011, 11),
|
||
|
|
(6, '30', 3, 2021, 12),
|
||
|
|
(7, 'Map of the Soul: 7', 4, 2020, 20),
|
||
|
|
(8, 'Racine carrée', 5, 2013, 13),
|
||
|
|
(9, 'Multitude', 5, 2022, 12),
|
||
|
|
(10, '1989', 6, 2014, 13),
|
||
|
|
(11, 'Midnights', 6, 2022, 13),
|
||
|
|
(12, 'Dans la légende', 7, 2016, 17),
|
||
|
|
(13, 'Deux frères', 7, 2019, 18),
|
||
|
|
(14, 'Lemonade', 8, 2016, 12),
|
||
|
|
(15, 'Renaissance', 8, 2022, 16),
|
||
|
|
(16, 'Divide', 9, 2017, 16),
|
||
|
|
(17, 'Nakamura', 10, 2018, 14),
|
||
|
|
(18, 'DNK', 10, 2023, 15);
|
||
|
|
|
||
|
|
-- Titres (sélection)
|
||
|
|
INSERT INTO TITRES (id, nom, id_album, duree_sec, explicite) VALUES
|
||
|
|
(1, 'Get Lucky', 1, 369, FALSE),
|
||
|
|
(2, 'Instant Crush', 1, 337, FALSE),
|
||
|
|
(3, 'Lose Yourself to Dance', 1, 353, FALSE),
|
||
|
|
(4, 'One More Time', 2, 320, FALSE),
|
||
|
|
(5, 'Digital Love', 2, 301, FALSE),
|
||
|
|
(6, 'Harder Better Faster Stronger', 2, 224, FALSE),
|
||
|
|
(7, 'HUMBLE.', 3, 177, TRUE),
|
||
|
|
(8, 'DNA.', 3, 185, TRUE),
|
||
|
|
(9, 'LOYALTY.', 3, 227, TRUE),
|
||
|
|
(10, 'Alright', 4, 219, TRUE),
|
||
|
|
(11, 'King Kunta', 4, 234, TRUE),
|
||
|
|
(12, 'Rolling in the Deep', 5, 228, FALSE),
|
||
|
|
(13, 'Someone Like You', 5, 285, FALSE),
|
||
|
|
(14, 'Set Fire to the Rain', 5, 241, FALSE),
|
||
|
|
(15, 'Easy On Me', 6, 224, FALSE),
|
||
|
|
(16, 'Oh My My', 6, 218, FALSE),
|
||
|
|
(17, 'Dynamite', 7, 199, FALSE),
|
||
|
|
(18, 'ON', 7, 242, FALSE),
|
||
|
|
(19, 'Papaoutai', 8, 234, FALSE),
|
||
|
|
(20, 'Formidable', 8, 192, FALSE),
|
||
|
|
(21, 'Alors on danse', 8, 205, FALSE),
|
||
|
|
(22, 'Santé', 9, 188, FALSE),
|
||
|
|
(23, 'L''enfer', 9, 224, FALSE),
|
||
|
|
(24, 'Shake It Off', 10, 219, FALSE),
|
||
|
|
(25, 'Blank Space', 10, 231, FALSE),
|
||
|
|
(26, 'Style', 10, 231, FALSE),
|
||
|
|
(27, 'Anti-Hero', 11, 201, FALSE),
|
||
|
|
(28, 'Lavender Haze', 11, 202, FALSE),
|
||
|
|
(29, 'Le monde ou rien', 12, 228, TRUE),
|
||
|
|
(30, 'DA', 12, 195, TRUE),
|
||
|
|
(31, 'Au DD', 13, 199, TRUE),
|
||
|
|
(32, 'A l''ammoniaque', 13, 234, TRUE),
|
||
|
|
(33, 'Formation', 14, 226, TRUE),
|
||
|
|
(34, 'Sorry', 14, 232, FALSE),
|
||
|
|
(35, 'BREAK MY SOUL', 15, 279, FALSE),
|
||
|
|
(36, 'CUFF IT', 15, 225, FALSE),
|
||
|
|
(37, 'Shape of You', 16, 233, FALSE),
|
||
|
|
(38, 'Castle on the Hill', 16, 261, FALSE),
|
||
|
|
(39, 'Perfect', 16, 263, FALSE),
|
||
|
|
(40, 'Djadja', 17, 176, FALSE),
|
||
|
|
(41, 'Pookie', 17, 185, TRUE),
|
||
|
|
(42, 'Copines', 18, 179, FALSE),
|
||
|
|
(43, 'SMS', 18, 164, FALSE);
|
||
|
|
|
||
|
|
-- Utilisateurs
|
||
|
|
INSERT INTO UTILISATEURS (id, pseudo, email, pays, type_abo, date_inscription) VALUES
|
||
|
|
(1, 'music_lover_33', 'music33@email.com', 'France', 'premium', '2020-03-15'),
|
||
|
|
(2, 'alex_beats', 'alex.b@email.com', 'France', 'gratuit', '2021-06-22'),
|
||
|
|
(3, 'sophie_melody', 'sophie.m@email.com', 'Belgique', 'premium', '2019-11-08'),
|
||
|
|
(4, 'dj_max', 'maxime.dj@email.com', 'France', 'famille', '2022-01-10'),
|
||
|
|
(5, 'luna_music', 'luna.music@email.com', 'Canada', 'etudiant', '2021-09-01'),
|
||
|
|
(6, 'kevin_hiphop', 'kevin.hh@email.com', 'USA', 'premium', '2020-07-19'),
|
||
|
|
(7, 'emma_pop', 'emma.pop@email.com', 'Royaume-Uni', 'gratuit', '2023-02-28'),
|
||
|
|
(8, 'thomas_electro', 'thomas.e@email.com', 'France', 'premium', '2018-05-12'),
|
||
|
|
(9, 'clara_world', 'clara.w@email.com', 'Espagne', 'etudiant', '2022-10-05'),
|
||
|
|
(10, 'jp_kpop', 'jp.kpop@email.com', 'Japon', 'premium', '2021-03-20');
|
||
|
|
|
||
|
|
-- Écoutes (échantillon)
|
||
|
|
INSERT INTO ECOUTES (id, id_utilisateur, id_titre, date_ecoute, duree_ecoute_sec) VALUES
|
||
|
|
(1, 1, 1, '2024-01-15', 369),
|
||
|
|
(2, 1, 4, '2024-01-15', 320),
|
||
|
|
(3, 1, 19, '2024-01-15', 234),
|
||
|
|
(4, 2, 7, '2024-01-15', 177),
|
||
|
|
(5, 2, 8, '2024-01-15', 150),
|
||
|
|
(6, 2, 29, '2024-01-15', 228),
|
||
|
|
(7, 3, 19, '2024-01-16', 234),
|
||
|
|
(8, 3, 20, '2024-01-16', 192),
|
||
|
|
(9, 3, 22, '2024-01-16', 188),
|
||
|
|
(10, 4, 1, '2024-01-16', 369),
|
||
|
|
(11, 4, 6, '2024-01-16', 224),
|
||
|
|
(12, 5, 17, '2024-01-16', 199),
|
||
|
|
(13, 5, 18, '2024-01-16', 242),
|
||
|
|
(14, 6, 7, '2024-01-17', 177),
|
||
|
|
(15, 6, 10, '2024-01-17', 219),
|
||
|
|
(16, 6, 11, '2024-01-17', 234),
|
||
|
|
(17, 7, 12, '2024-01-17', 228),
|
||
|
|
(18, 7, 24, '2024-01-17', 219),
|
||
|
|
(19, 7, 37, '2024-01-17', 233),
|
||
|
|
(20, 8, 1, '2024-01-17', 369),
|
||
|
|
(21, 8, 4, '2024-01-17', 320),
|
||
|
|
(22, 8, 5, '2024-01-17', 301),
|
||
|
|
(23, 8, 6, '2024-01-17', 224),
|
||
|
|
(24, 9, 40, '2024-01-18', 176),
|
||
|
|
(25, 9, 42, '2024-01-18', 179),
|
||
|
|
(26, 10, 17, '2024-01-18', 199),
|
||
|
|
(27, 10, 18, '2024-01-18', 242),
|
||
|
|
(28, 1, 19, '2024-01-18', 234),
|
||
|
|
(29, 1, 21, '2024-01-18', 205),
|
||
|
|
(30, 2, 31, '2024-01-18', 199),
|
||
|
|
(31, 3, 23, '2024-01-19', 224),
|
||
|
|
(32, 4, 35, '2024-01-19', 279),
|
||
|
|
(33, 5, 27, '2024-01-19', 201),
|
||
|
|
(34, 6, 8, '2024-01-19', 185),
|
||
|
|
(35, 7, 39, '2024-01-19', 263),
|
||
|
|
(36, 8, 2, '2024-01-19', 337),
|
||
|
|
(37, 9, 41, '2024-01-20', 185),
|
||
|
|
(38, 10, 17, '2024-01-20', 199),
|
||
|
|
(39, 1, 1, '2024-01-20', 369),
|
||
|
|
(40, 2, 7, '2024-01-20', 177);
|
||
|
|
```
|
||
|
|
|
||
|
|
### 1.3. Schéma de la base
|
||
|
|
|
||
|
|
Dessinez le schéma relationnel de la base de données en identifiant :
|
||
|
|
- Les clés primaires (PK)
|
||
|
|
- Les clés étrangères (FK)
|
||
|
|
- Les relations entre les tables
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Partie 2 : Requêtes de base
|
||
|
|
|
||
|
|
**Pour chaque question, écrivez la requête SQL et notez le résultat.**
|
||
|
|
|
||
|
|
1. Affichez tous les artistes de la base de données.
|
||
|
|
|
||
|
|
2. Affichez le nom et le pays des artistes français.
|
||
|
|
|
||
|
|
3. Affichez les titres de tous les albums sortis après 2015.
|
||
|
|
|
||
|
|
4. Affichez les pseudos des utilisateurs ayant un abonnement premium.
|
||
|
|
|
||
|
|
5. Affichez les titres (chansons) qui durent plus de 4 minutes (240 secondes).
|
||
|
|
|
||
|
|
6. Affichez les artistes dont le genre principal est "Hip-Hop" ou "Pop".
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Partie 3 : Requêtes avec jointures
|
||
|
|
|
||
|
|
7. Affichez le nom des titres avec le nom de leur album.
|
||
|
|
|
||
|
|
8. Affichez le nom des titres avec le nom de l'artiste qui les a créés.
|
||
|
|
*(Indice : vous devez passer par la table ALBUMS)*
|
||
|
|
|
||
|
|
9. Affichez les albums de Daft Punk avec leur année de sortie.
|
||
|
|
|
||
|
|
10. Affichez la liste des écoutes avec le pseudo de l'utilisateur et le nom du titre écouté.
|
||
|
|
|
||
|
|
11. Affichez tous les titres des artistes français.
|
||
|
|
|
||
|
|
12. Pour chaque écoute, affichez le pseudo de l'utilisateur, le nom du titre, le nom de l'album et le nom de l'artiste.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Partie 4 : Agrégations
|
||
|
|
|
||
|
|
13. Combien y a-t-il de titres dans la base de données ?
|
||
|
|
|
||
|
|
14. Quelle est la durée moyenne des titres (en secondes) ?
|
||
|
|
|
||
|
|
15. Quel est le titre le plus long ? Le plus court ?
|
||
|
|
|
||
|
|
16. Combien d'albums a sorti chaque artiste ? Affichez le nom de l'artiste et le nombre d'albums.
|
||
|
|
|
||
|
|
17. Combien d'écoutes ont été effectuées par chaque utilisateur ? Affichez le pseudo et le nombre d'écoutes.
|
||
|
|
|
||
|
|
18. Quel est le nombre total de titres par genre musical ?
|
||
|
|
*(Indice : il faut passer par ARTISTES et ALBUMS)*
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Partie 5 : Requêtes avancées
|
||
|
|
|
||
|
|
19. Quels sont les artistes ayant sorti plus d'un album ?
|
||
|
|
|
||
|
|
20. Quels sont les 5 titres les plus écoutés ? Affichez le nom du titre et le nombre d'écoutes.
|
||
|
|
|
||
|
|
21. Quels utilisateurs ont écouté des titres de Stromae ?
|
||
|
|
|
||
|
|
22. Quelle est la durée totale d'écoute (en minutes) par utilisateur ?
|
||
|
|
|
||
|
|
23. Quels artistes n'ont aucun titre explicite dans leurs chansons ?
|
||
|
|
|
||
|
|
24. Pour chaque pays d'utilisateur, calculez le nombre d'écoutes et la durée totale d'écoute.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Partie 6 : Analyse business
|
||
|
|
|
||
|
|
Le département marketing vous demande des analyses pour améliorer le service.
|
||
|
|
|
||
|
|
25. **Taux de conversion** : Combien d'utilisateurs ont un abonnement payant (premium, famille ou étudiant) vs gratuit ?
|
||
|
|
|
||
|
|
26. **Artistes populaires en France** : Quels artistes sont les plus écoutés par les utilisateurs français ?
|
||
|
|
|
||
|
|
27. **Recommandations** : Trouvez les utilisateurs qui ont écouté Daft Punk mais pas Stromae (ces utilisateurs pourraient aimer Stromae).
|
||
|
|
|
||
|
|
28. **Contenu explicite** : Quel pourcentage des titres est marqué comme explicite ?
|
||
|
|
|
||
|
|
29. **Rétention** : Quels utilisateurs inscrits avant 2021 ont écouté de la musique en janvier 2024 ?
|
||
|
|
|
||
|
|
30. **Rapport final** : Créez une vue synthétique montrant pour chaque artiste : son nom, son pays, son genre, le nombre d'albums, le nombre de titres et le nombre total d'écoutes.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Partie 7 : Modifications de données (Bonus)
|
||
|
|
|
||
|
|
31. Ajoutez l'artiste "Angèle" (Belgique, Pop, 2014).
|
||
|
|
|
||
|
|
32. Ajoutez son album "Brol" sorti en 2018 avec 15 titres.
|
||
|
|
|
||
|
|
33. Un utilisateur change d'abonnement : mettez à jour `alex_beats` vers l'abonnement "etudiant".
|
||
|
|
|
||
|
|
34. Supprimez toutes les écoutes de l'utilisateur `jp_kpop`.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Questions de réflexion
|
||
|
|
|
||
|
|
1. Pourquoi a-t-on séparé les artistes et les albums dans des tables différentes au lieu de tout mettre dans une seule table ?
|
||
|
|
|
||
|
|
2. Quel problème pourrait survenir si on supprimait un artiste qui a des albums dans la base ?
|
||
|
|
|
||
|
|
3. Comment pourrait-on améliorer la base pour gérer les collaborations entre artistes sur un même titre ?
|
||
|
|
|
||
|
|
4. Quelles informations supplémentaires pourrait-on ajouter pour un vrai service de streaming ?
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Barème indicatif
|
||
|
|
|
||
|
|
| Partie | Points |
|
||
|
|
|--------|--------|
|
||
|
|
| Partie 1 : Création et schéma | 2 |
|
||
|
|
| Partie 2 : Requêtes de base | 3 |
|
||
|
|
| Partie 3 : Jointures | 4 |
|
||
|
|
| Partie 4 : Agrégations | 4 |
|
||
|
|
| Partie 5 : Requêtes avancées | 4 |
|
||
|
|
| Partie 6 : Analyse business | 3 |
|
||
|
|
| **Total** | **20** |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
Auteur : Florian Mathieu
|
||
|
|
|
||
|
|
Licence CC BY NC
|
||
|
|
|
||
|
|
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.
|