Discographie đŸŽ”

TP3
Author

Ludovic Deneuville

Introduction

Important
  • Écrivez des requĂȘtes jolies !

Les notions vues dans ce TP :

  • agrĂ©gations
  • jointures
  • insertion de donnĂ©es
  • utilisation de sĂ©quence
  • bonus : CTE (vu au dernier cours)

1 Lancement des services

Pour plus de dĂ©tails, allez dans l’onglet Datalab.

    • ouvrez ce service
    • vĂ©rifiez que vous ĂȘtes connectĂ©s Ă  la base de donnĂ©es PostgreSQL

2 Les données

Le thĂšme du jour sera la musique đŸŽ” 🎾 đŸŽș

2.1 Chargez les données

    • Cliquez sur la petite icone sous les triangles oranges qui ressemble Ă  📜
    • raccourci (ALT + X)

2.2 Description

Les tables sont les suivantes :

  • artiste(id_artiste, nom, code_pays, date_naissance, actif)
  • album(id_album, titre, annee, #id_artiste)
  • chanson(id_chanson, #id_artiste_principal, titre, duree, #id_album, annee)
  • playlist(id_playlist, nom, date_creation, description)
  • playlist_chanson(#id_playlist, #id_chanson, ordre, date_ajout)

2.3 ModÚle de données

3 Exercice

3.1 Exploration des tables

Lorsque vous prenez en main une base de données, la premiÚre chose à faire est de regarder ce que contiennent les tables.

Faisons quelques statistiques descriptives.

    • ordonnez par nombre de chansons dĂ©croissant

Est-ce qu’il y a plusieurs chansons ayant le mĂȘme titre ?

    • i.e. mĂȘme titre et mĂȘme artiste

Si vous en trouvez une, essayez de la supprimer. À votre avis, pourquoi cela ne fonctionne pas ?

3.2 Place aux artistes

Il y a des artistes solo et des groupes. Pour la groupe la date de naissance ne devrait pas ĂȘtre renseignĂ©e.

Interessons nous maintenant aux pays des artistes.

3.3 Créez votre playlist

Tip

Aucune de ces chansons ne correspond à vos goût musicaux


Vous ĂȘtes vraiment sĂ»r ?

Allez un petit effort, il y a des chansons et des artistes trĂšs sympas.

Nous allons maintenant ajouter à votre playlist toutes les chansons de l’album Californian Soil.

Pour crĂ©er votre requĂȘte d’insertion, vous allez avoir besoin des donnĂ©es suivantes :

  • id_playlist : vous pouvez soit :
    • insĂ©rer la valeur “en dur”
    • utiliser CURRVAL('playlist_id_playlist_seq') pour obtenir la derniĂšre valeur de id_playlist i.e. celui de la playlist que vous venez de crĂ©er
  • id_chanson : il va falloir une reqĂ»ete pour les rĂ©cupĂ©rer
  • ordre : vous allez crĂ©er et utiliser une sĂ©quence
  • date_ajout : vous utiliserez simplement : CURRENT_DATE

Pour trouver un peu d’inspiration, un exemple d’INSERT en utilisant un SELECT :

INSERT INTO joueuse_copy(nom, prenom, numero, date_creation)
SELECT nom,
       'pierre',
       nextval('seq_numero'),
       CURRENT_DATE
  FROM joueuse;

Est-ce que vous pouvez ajouter plusieurs fois la mĂȘme chanson dans une playlist ? Pourquoi ?

Comment pourrait-t-on faire pour s’affranchir de cette contrainte ?

3.4 Votez pour la meilleure playlist

Interessons-nous maintenant aux playlists.

    • Colonnes Ă  afficher : nom de la playlist, titre de la chanson
    • Classez par noms de playlists
    • Classez par nom de playlist, puis par nom d’artiste

Vous remarquez qu’à l’affichage vous avez deux colonnes appelĂ©es “nom”. Pour faire la diffĂ©rence, vous allez modifier l’affichage de ces colonnes.


Nous allons maintenant rechercher les artistes mal-aimĂ©s i.e. ceux qui ne sont dans aucune playlist. ProcĂ©dons par Ă©tape.

    • en utilisant NOT IN et une sous-requĂȘte
    • conservez uniquement les id_artiste qui ne sont pas dans la requĂȘte prĂ©cĂ©dente
    • la syntaxe est un peu moins intuitive mais la requĂȘte est plus optimisĂ©e

Concentrons-nous maintenant sur les artistes et les chansons les plus populaires.

Vous avez Ă©crit prĂ©cĂ©demment une requĂȘte listant les playlists avec les artistes et les chansons. Repartez de cette requĂȘte.

    • affichez le titre de la chanson, le nom de l’artiste, et le nombre de playlists
    • ordonnez par nombre de playlists dĂ©croissant
    • Est-ce que « Tu feras la diffĂ©rence. Ton coeur prend des vacances. Il danse avec les loups. » ?

3.5 I’m WITH u

Les CTE seront évoquées au dernier cours. Cela parait compliqué à premiÚre vue mais le principe est trÚs simple.

NoteCTE

Une CTE (Common Table Expression) est une table temporaire nommĂ©e dĂ©finie au dĂ©but d’une requĂȘte avec le mot-clĂ© WITH.

À quoi ça sert ?

  • Rendre une requĂȘte plus lisible (au lieu d’imbriquer des sous-requĂȘtes)
  • RĂ©utiliser un mĂȘme sous-rĂ©sultat plusieurs fois
  • Servir de base Ă  des requĂȘtes rĂ©cursives

Que fait cette requĂȘte ?

SELECT DISTINCT ON (code_pays) code_pays, 
       nom, 
       date_naissance
  FROM artiste
 WHERE NOT groupe
 ORDER BY code_pays, 
          date_naissance ASC;

Nous allons ici construire pas Ă  pas une requĂȘte donnant le mĂȘme rĂ©sultat en utilisant une CTE.

Nous souhaitons maintenant récupérer le nom du plus viel artiste de chaque pays.

L’idĂ©e pour obtenir ce nom :

  • stocker le rĂ©sultat de notre derniĂšre requĂȘte dans une table temporaire viel_artiste_pays
  • joindre cette table Ă  la table artiste via les colonnes pays et date_naissance
WITH viel_artiste_pays AS (
  ...
)
SELECT ...
  FROM artiste a
  JOIN plus_vieux pv ON ...
  ...
TipAutre exemple

Pour vous aider, voici un autre exemple.

Si l’on veut les noms des artistes qui sont les seuls Ă  reprĂ©senter leur pays :

  • nous commençons par lister les pays avec un seul artiste
  • nous joignons avec la table artiste pour rĂ©cupĂ©rer dans un second temps les noms
WITH artiste_seul_dans_pays AS (
SELECT code_pays,
       COUNT(*) AS nb_artistes
  FROM artiste
 GROUP BY code_pays
HAVING COUNT(*) = 1
)
SELECT a.*
  FROM artiste a
  JOIN artiste_seul_dans_pays n ON a.code_pays = n.code_pays;

ArrĂȘtez vos services

C’est la fin du TP, vous pouvez maintenant sauvegarder votre travail et libĂ©rer les ressources rĂ©servĂ©es :