Premières requêtes SQL 🦆

Sélectionner, Filtrer, Agréger
Author

Ludovic Deneuville

Introduction

Vous allez réaliser ce TP sur un Datalab.

Datalab du GENES ou SSPCloud

Connectez-vous à l’une des deux instances suivantes :

VM ENSAI

Uniquement en cas d’indisponibilité des Datalabs, vous pouvez réaliser le TP directement sur la VM. Le logiciel DBeaver est installé.

    • Type de connexion : DuckDB
    • Suivant
    • Path : :memory:
    • Terminer
    • Editeur SQL ➡️ Script SQL (raccourci : F3)

Cela ouvre une fenêtre dans laquelle vous pouvez saisir du SQL.

1 Lancement du service

    • Allez dans Catalogue de services
    • Onglet Databases
    • Renseignez username et password
TipCloudBeaver

CloudBeaver est une application web légère dédiée à la gestion de bases de données. Elle permet de se connecter à divers types de bases de données, qu’elles soient SQL, NoSQL ou hébergées dans le cloud, à partir d’un seul point d’accès via un navigateur. CloudBeaver facilite l’exploration, la modification et la visualisation des données sans nécessiter l’installation de logiciels locaux.

Pour ce premier TP, nous n’allons pas utiliser de base de données PostgreSQL. Nous allons simplement utiliser DuckDB pour lire des fichiers de données.

TipDuckDB

DuckDB est un moteur de base de données relationnelle conçu pour des analyses rapides et efficaces.

DuckDB est idéal pour les charges de travail analytiques en raison de sa simplicité, de sa rapidité et de son extensibilité, surtout pour traiter des fichiers volumineux localement.

Caractéristique Description
Simplicité Fonctionne sans serveur, intégré dans le processus hôte. Aucune dépendance externe pour la compilation ou l’exécution, simplifiant son déploiement.
Rapidité Optimisé pour l’analytique (OLAP) avec un moteur d’exécution vectorisé en colonnes, réduisant le temps de traitement pour les requêtes complexes.
Richesse fonctionnelle Supporte des requêtes SQL complexes, fonctions de fenêtre, index secondaires, et assure des garanties ACID grâce au contrôle de concurrence (MVCC).
Extensibilité Permet l’ajout de types de données, fonctions et formats de fichiers via des extensions (supporte Parquet, JSON, S3, HTTP(S)).
Gratuit et open-source Licence MIT, code source disponible et contributions ouvertes à tous.

Nous allons créer une base de données stockée en mémoire vive. L’avantage est que c’est très rapide. L’inconvénient, c’est que rien ne sera sauvegardé.

    • En haut à gauche, cliquez sur le +, puis New connection
    • Sélectionner DuckDB
    • Database : :memory:
    • Cliquez sur le bouton CREATE
    • Dans l’explorer à gauche, clic droit sur votre connexion DuckDB ➡️ SQL Editor
    • vous pouvez maintenant saisir du code SQL
Caution

Votre connexion doit être ouverte (rond vert).

Si ce n’est pas le cas : clic droit > Open.

Puis réouvrez une nouvelle fenêtre SQL

2 Les prénoms

Le fichier des prénoms contient des données sur les prénoms attribués aux enfants nés en France depuis 1900. Ces données sont disponibles au niveau France et par département.

Dans ce TP, nous allons utiliser la version au format parquet.

NoteFichier parquet

Le format Parquet est un format de fichier de stockage de données optimisé pour les systèmes de traitement analytique de grande échelle. Voici ses principales caractéristiques :

  1. Stockage en colonnes : Parquet stocke les données par colonnes plutôt que par lignes, ce qui améliore l’efficacité de l’accès aux données dans les charges de travail analytiques.

  2. Compression efficace : La compression par colonne permet un taux de compression moyen de 5 à 10 fois par rapport aux formats CSV, voire plus pour de gros fichiers. Cela réduit significativement la taille des données stockées et le coût de stockage.

  3. Optimisé pour l’analytique : Parquet est conçu pour les requêtes en lecture intensive, car il permet de charger uniquement les colonnes nécessaires pour une analyse, ce qui améliore les performances en particulier sur les données volumineuses.

  4. Métadonnées Riches et Auto-descriptives : Parquet inclut des métadonnées détaillées (schéma, types de données, statistiques min/max), permettant une lecture rapide et sans risque d’erreur. Ces métadonnées facilitent également le traitement des données par différents outils.

  5. Langage Indépendant et Open Source : Le format Parquet est indépendant du langage et peut être utilisé avec divers langages de programmation (Python, R, C++, Java). Il est aussi open source et compatible avec la plupart des frameworks de big data.

Pour en savoir plus sur le format Parquet :

Pour des requêtes plus rapides, nous allons forcer le téléchargement en cache du fichier

Ici le fichier est relativement modeste (10 Mo), nous pouvons nous permettre de le stocker intégralement en mémoire.

CREATE OR REPLACE TABLE prenoms AS
FROM 'https://www.insee.fr/fr/statistiques/fichier/8595130/prenoms-2024.parquet'

Vous pourrez ensuite requêter sur cette vue comme si c’était une table.

TipÉxécuter une requête

Cliquez sur la requête pour y positionner le pointeur de la souris, puis au choix :

  • Cliquez sur le petit triangle orange
  • CTRL + ENTREE

2.1 Premières requêtes

Important

Prenez le temps et l’habitude d’écrire de jolies requêtes bien alignées !!!

bien.sql
SELECT c.nom AS club, 
       AVG(j.elo) AS moyenne_elo
  FROM joueuse j 
 INNER JOIN club c USING (id_club) 
 WHERE j.mail IS NOT NULL 
 GROUP BY c.nom 
 ORDER BY 2 DESC;


pasbien.sql
SELECT c.nom AS club, AVG(j.elo) AS moyenne_elo FROM joueuse j INNER JOIN club c USING (id_club) WHERE mail IS NOT NULL GROUP BY c.nom ORDER BY 2 DESC;
TipSecret statistique

Vous remarquerez que les valeurs sont des multiples de 5.

Pour chaque prénom, il est indiqué, pour chaque année de naissance et chaque sexe, le nombre de personnes inscrites à l’état civil sous ce prénom, arrondi au multiple de 5 le plus proche

Vous remarquerez également que certaines années sont manquantes.

Un prénom est diffusé s’il a été attribué au moins 3 fois à des personnes de sexe féminin ou à des personnes de sexe masculin

En statistique publique, on exige au moins 3 individus pour garantir le secret statistique. Avec 1 ou 2 personnes, on peut identifier ou déduire leurs données.

Pour la suite, nous allons uniquement nous interesser au niveau géographique FRANCE :

    • les lignes où le niveau géographique est égal à FRANCE
    • les colonnes suivantes : sexe, prenom, periode, valeur

2.2 Année 2022

Filtrez sur l’année 2022

    • Classez-les en décroissant par le nombre de fois où ils sont été donnés
    • Affichez également ces colonnes pour les questions suivantes
    • Quels sont les prénoms masculins et féminins les plus donnés ?
Tip

Pour extraire la première lettre d’un prénom, vous pouvez utiliser :

  • la fonction SUBSTRING
  • le slicing comme en R ou Python

2.3 Statistiques descriptives

    • Commencez par écrire une requête donnant le nombre de caractères maximum
    • Utilisez-là comme sous-requête pour afficher les 3 prénoms
    • classez par année
    • Difficulty :
    • classez par année
    • utilisez la fonction ROUND(<value>, 2) pour arrondir les moyennes
    • Que remarquez-vous ?

2.4 Jérôme, c’est moi

    • Classez par année décroissante
    • Que remarquez-vous ?
    • Recherchez une fonction DuckDB qui permet de répondre à ce besoin
  • voir Fontion DuckDB strip_accents()
  • Regroupez par strip_accents(prenom) et annais
  • Affichez strip_accents(prenom), annais et la somme de la colonne nombre

2.5 Vérifions le classement

Avec cette histoire d’accent, posons-nous la question si cela peut modifier le classement des top prénoms.

    • Y-a-t-il d’autres orthographes proches pour écrire ce prénom ?

2.6 Prénoms composés

Nous allons maintenant nous interesser aux prénoms composés entre 2000 et 2009

    • Triez en décroissant par ce nombre
    • Que remarquez-vous ? N’y a-t-il pas des intrus ?

2.7 Cette année-là

Difficulty :

Filtrez sur l’année 1962.

    • exemple : ici Dominique (H) et Dominique (F) comptent pour deux prénoms
    • affichez le nombre de fois où ils ont été donnés à chaque sexe
    • True si le prénom a été donné à plus de filles que de garçons
    • False sinon

3 Fichier des individus

CREATE OR REPLACE VIEW individus AS
FROM 'https://static.data.gouv.fr/resources/recensement-de-la-population-fichiers-detail-individus-localises-au-canton-ou-ville-2020-1/20231023-122841/fd-indcvi-2020.parquet';
    • Pourquoi ce nombre d’individus vivant en France paraît faible ?
TipPoids de l’individu

Dans de nombreuses bases de données de l’INSEE, la variable ipondi représente le poids de l’individu.

i.e. Si une ligne a un IPONDI égal à 2, cela signifie qu’elle représente 2 individus.

    • Vous pouvez suffixer votre somme par ::INT pour convertir ce nombre en entier
    • Que remarquez-vous ?
NoteCodification

Pourquoi utiliser une codification pour le fichier national individus localisés au canton-ou-ville du recensement de la population 2020 ?

  • Espace de stockage réduit : Les codes courts remplacent des chaînes de texte plus longues, ce qui diminue la taille du fichier et rend le stockage et le transfert de données plus efficaces. Même après codification, le fichier pèse plus de 500 Mo
  • Standardisation et uniformité : Utiliser des codes standardisés permet de garantir une structure homogène et facilite l’intégration et la comparaison des données entre différents fichiers ou études.
  • Performances de traitement : Les codes sont plus rapides à traiter que des textes longs, notamment pour des opérations de recherche, de tri, et de filtrage, ce qui est crucial pour les grands ensembles de données.
CREATE OR REPLACE VIEW variables_individus AS
FROM 'https://static.data.gouv.fr/resources/recensement-de-la-population-fichiers-detail-individus-localises-au-canton-ou-ville-2020-1/20231025-082910/dictionnaire-variables-indcvi-2020.csv'
    • ordonnez par numéro de département
    • restreignant sur les individus entre 25 et 29 ans
    • différenciant les hommes et les femmes

Arrêtez votre service

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

    • par exemple dans P:/Cours1A/UE3-Bases-de-donnees-relationnelles/TP1/tp1.sql

Pour aller plus loin