Exercices vintages đŸ’Ÿ

TP2
Author

Ludovic Deneuville

Introduction

Lors du premier TP, nous avons utilisĂ© DuckDB pour lire les donnĂ©es d’un fichier parquet. Aujourd’hui nous allons crĂ©er notre propre base de donnĂ©es PostgreSQL, puis y dĂ©clarer des tables et insĂ©rer de donnĂ©es. Enfin nous allons requĂȘter ces donnĂ©es.

Lors de ce TP, vous allez :

  • CrĂ©er votre base de donnĂ©es PostgreSQL
  • Lancer des scripts de crĂ©ation de tables et d’insertion de donnĂ©es
  • Relier des tables en utilisant les jointures
  • SĂ©lectionner et filtrer des donnĂ©es
Important
  • Écrivez des requĂȘtes jolies !
  • À la fin du TP, exportez ou copiez vos requĂȘtes dans un fichier de votre VM ou machine personnelle

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
    • ouvrez la connexion (clic droit > Open), un petit rond vert apparait 🟱
Important

cloudBeaver est parfois capricieux, en cas de blocage, n’hĂ©sitez pas Ă  rafraichir la page (F5).

En attendant le lancement des services, voici un peu de lecture ci-dessous.

2 MĂ©thodo : Écrire une requĂȘte

Il est parfois difficile d’écrire du premier coup LA requĂȘte qui rĂ©pond directement Ă  la question posĂ©e.

Voici une mĂ©thode qui peut vous aider Ă  Ă©crire vos requĂȘtes pas Ă  pas :

Imaginons que l’on vous demande de lister les noms et prĂ©noms des joueuses du club de la ville de Saint Quentin, dont le prĂ©nom commence par un A classĂ©es par elo dĂ©croissant.

joueuse(id_joueuse, nom, prenom, elo, #id_club)

club(id_club, nom, ville)

2.1 Listez les tables nécessaires

Commençons par lister les tables nécessaires, puis joignons-les.

Nous avons besoin ici des 2 tables que nous pouvons joindre en utilisant la colonne id_club.

SELECT *
  FROM joueuse j
  JOIN club c USING(id_club);
Tip
  • Nous utilisons pour l’instant SELECT * pour sĂ©lectionner toutes les colonnes
    • nous enleverons les colonnes inutiles plus tard
  • Nous utilisons des alias, cela rendra la requĂȘte plus courte et plus claire
    • j pour joueuse
    • c pour club

2.2 Appliquez les filtres

Filtrons pour ne conserver que les lignes qui nous intéressent.

  • Ville du club : Saint Quentin
  • PrĂ©nom qui commence par un A
SELECT *
  FROM joueuse j
  JOIN club c USING(id_club)
 WHERE c.ville = 'Saint Quentin'
   AND j.prenom LIKE 'A%';

2.3 Ordonnez les résultats

Ordonnons par elo décroissant.

SELECT *
  FROM joueuse j
  JOIN club c USING(id_club)
 WHERE c.ville = 'Saint Quentin'
   AND j.prenom LIKE 'A%'
 ORDER BY j.elo DESC;

2.4 Sélectionner les colonnes requises

Il est demandé de ne garder que les noms et prénoms des joueuses.

Remplaçons le SELECT * par les noms des colonnes.

SELECT j.nom,
       j.prenom
  FROM joueuse j
  JOIN club c USING(id_club)
 WHERE c.ville = 'Saint Quentin'
   AND j.prenom LIKE 'A%'
 ORDER BY j.elo DESC;

Maintenant, place Ă  quelques exercices historiques.

3 Exercices

3.1 École de musique 🎾

Nous allons commencer par créer les tables et insérer les données :

    • Cliquez sur la petite icone sous les triangles oranges qui ressemble Ă  📜
    • raccourci (ALT + X)
    • En cas d’erreur, corrigez, puis relancez intĂ©gralement le script
    • Dans l’explorateur : PostgreSQL âžĄïž Databases âžĄïž defaultdb âžĄïž Schemas
    • Clic droit sur Schemas âžĄïž Refresh

Si tout est ok, vous n’avez plus besoin du script de crĂ©ation et d’insertion de donnĂ©es.

Voici le modÚle de données :

Vous pouvez maintenant commencer l’exercice et Ă©crire les requĂȘtes permettant de rĂ©pondre aux questions suivantes :

RĂ©alisez les jointures qui permettent d’obtenir :

3.2 Location de DVD 💿

Il fut un temps oĂč des entreprises se spĂ©cialisaient dans la location de DVD. Dans cet exercice, une telle entreprise souhaite informatiser la gestion des prĂȘts.

Voici le ModÚle de données :

Création de tables

  • DROP SCHEMA IF EXISTS dvd CASCADE;
    
    CREATE SCHEMA dvd;
    
    CREATE TABLE dvd.realisateur(
        num_realisateur    INT PRIMARY KEY,
        nom_realisateur    TEXT,
        prenom_realisateur TEXT);
    
    CREATE TABLE dvd.film(
        num_film       INT PRIMARY KEY,
        titre          TEXT,
        genre          TEXT,
        date_sortie    DATE);
    
    CREATE TABLE dvd.a_realise(
        num_film         INT REFERENCES dvd.film(num_film),
        num_realisateur  INT REFERENCES dvd.realisateur(num_realisateur),
        PRIMARY KEY (num_film, num_realisateur));

Attention, ici l’ordre de crĂ©ation des tables a son importance.

Reprenons et modifions l’exemple ci-dessus :

  • imaginez que vous essayez de crĂ©er en premier la table a_realise
  • le champ num_film de cette table est une clĂ© Ă©trangĂšre
  • il rĂ©fĂ©rence la clĂ© primaire num_film de la table film
  • or si la table film n’existe pas, Ă  votre avis, que va-t-il se passer ?

RequĂȘtes

Donnez les requĂȘtes pour obtenir :

NoteRecherche dans la doc

Pour connaitre la version utilisée : SELECT version();

Pour les 3 requĂȘtes suivantes, vous afficherez les noms et prĂ©noms sur une seule colonne.

Utilisez le mot clĂ© AS pour nommer cette colonne nom_complet Ă  l’affichage.

Il existe différentes maniÚres de concaténer du texte :

  • fonctions PostgreSQL CONCAT(), CONCAT_WS()
  • opĂ©rateur ||

Utilisons maintenant des mĂ©thodes d’agrĂ©gation pour rĂ©pondre aux questions suivantes :

Quelques questions sur les dates :

Pour terminer cet exercice, nous allons rechercher les titres des films qui n’ont jamais Ă©tĂ© empruntĂ©s. ProcĂ©dons par Ă©tapes et Ă©crivez les requĂȘtes suivantes :

3.3 Rugby World Cup 🏉

Pour les plus rapides 🚀

Nous souhaitons informatiser les résultats de la coupe du monde de rugby. Pour cela nous avons créé les deux tables suivantes : equipe et matches.

Commencez par créez et charger les tables avec ce script.

    • Date du match
    • Nom de la premiĂšre Ă©quipe
    • nombre de points de la premiĂšre Ă©quipe
    • nombre de points de la deuxiĂšme Ă©quipe
    • nom de la deuxiĂšme Ă©quipe et lieu du match

ArrĂȘtez vos services

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