DESKTOP Bases de données (1) TP10
L’objectif de ce TP est de découvrir la structure et l’utilisation d’une base de données. Pour cela, nous utiliserons SQLite3 qui est un moteur de bases de données relationnelles développé au début de années 2000. Il s’agit aujourd’hui du moteur le plus utilisé au monde grâce notamment à sa grande légèreté. Afin d’accéder aux informations contenues dans la base de données nous serons amenés à formuler des requêtesdans un nouveau langage : SQL pour Structured Query Langage.
Nous utiliserons le logiciel SQLiteStudio (à récupérer sous forme d’archive sur le site https:
//sqlitestudio.pl/). Une fois téléchargée, faire un clic droit sur l’archive puis cliquer sur l’op- tion "Extraire tout" puis "Extraire". Créer alors dans "mes documents" (et pas sur le bureau) un dossier du nom de votre choix pour y placer tous les fichiers nécessaires.
Ouvrir le dossier et cliquer sur l’exécutable "SQLiteStudio.exe". L’interface de SQLiteStudio est constituée de plusieurs zones (la zone 3 "espace de travail" ne sera créée qu’à partir de l’exercice 2) :
1
2
3a
3b
5 4
1 Barre d’outils : ouverture d’une base de données, création de table, ouverture de l’éditeur SQL...
2 Arborescence des bases de données : la liste de toutes les tables composant la base de données.
3 Espace de travail : sur l’exemple, zone de saisie des requêtes SQL (a) et résultats des requêtes sous forme de tables (b).
4 Barre d’état : console pour suivre l’exécution des requêtes, les erreurs.
5 Onglets : sur l’exemple, le premier onglet est l’explorateur de la base de données, le second l’éditeur SQL.
Exercice 1 Découverte de la structure d’une base de données
La base de données que nous utiliserons aujourd’hui contient les informations relatives à différentes oeuvres d’art dans différents musées. La base de données est disponible sur cahier de prépa sous le nom tp10.db. La télécharger et l’enregistrer dans votre dossier de bases de données.
Dans SQLiteStudio, cliquer sur l’icône puis ouvrir la base de données tp10.db.
Dans l’arborescence des bases de données, on constate que notre base tp10.db se constitue d’une unique tableappelée oeuvres. Plus tard nous utiliserons des bases de données possédant plusieurs tables.
Double-cliquez sur le nom de la table pour voir son contenu. L’onglet "Strcture" présente la struc- ture générale de la table. Notre table oeuvresest composée de 7 attributs nommés id, titre, peintre, annee, musee, ville, pays. Chacun de ces attributs possède un certain type de données ou domaine. C’est la nature de l’information correspondante :integer (entier) pour l’an- née, text (texte) pour le titre, etc. Un attribut est spécial, c’est id: il est identifié comme étant la clé primairede la table. Cela signifie que cet attribut sert à s’assurer que deux peintures présentes dans la base de données soient toujours distinguables, même si elles ont les mêmes valeurs sur tous les autres attributs.
L’onglet "Données" permet de visualiser les entrées de la table ou enregistrements. Chaque ligne correspond à un enregistrement différent. Et pour chaque enregistrement sont renseignés les valeurs de ses attributs, placés en colonnes.
Q1 Vérifiez que les colonnes de l’onglet "Données" correspondent aux lignes de l’onglet "Structure".
Donner un exemple de deux enregistrements ayant la même valeur pour l’attribut ville.
Q2 Existe-t-il deux enregistrements ayant la même valeur pour l’attribut id? Pourquoi ? Q3 Combien y a-t-il d’enregistrements en tout dans la table ?
Exercice 2 Premières requêtes SQL
Q1 Quelles sont toutes les villes présentes dans la base de données ?
Pour ce premier TP, nous manipulons une base de données très limitée, de sorte qu’on a pu répondre à la question précédente en parcourant à la main tous ses enregistrements. En pratique les bases de données utilisées comportent plusieurs milliers d’enregistrements, il faut donc un langage pour expri- mer une requête consistant, par exemple, à trouver tous les noms des villes présentes dans la base.
Nous utiliserons le langage SQL. Dans SQLiteStudio, cliquer sur l’icône pour ouvrir l’environ- nement de saisie des requêtes. S’ouvrent un éditeur SQL (zone 3a) et une zone d’affichage des tables résultats (zone 3b).
Toutes nos requêtes débuteront par la commande SELECT suivie des attributs que l’on souhaite afficher. Ensuite, la commandeFROMprécède le nom de la table dont on veut extraire les données. Ce sont les deux commandes de base que nous utiliserons systématiquement pour accéder aux données d’une base de données.
Important :
• Par convention, les commandes SQL (SELECT,FROM, ...) sont écrites en lettres capitales et les noms des tables et des attributs en minuscules.
• Toutes les requêtes se terminent par un point-virgule.
• Vous pouvez commenter votre code SQL en ajoutant deux tirets (--) en début de ligne.
Q2 Dans l’éditeur de requête SQL, saisir la re- quête suivante puis cliquer sur le bouton ou appuyer sur F9 .
1 SELECT titre, pays FROM oeuvres;
Que renvoie cette requête ?
Q3 Que renvoie la requête suivante ? 1 SELECT * FROM oeuvres;
Q4 Écrire une requête permettant de renvoyer la liste des villes de la base de données. Que remarquez-vous ?
Pour rendre le résultat d’une requête plus lisible, on peut demander de n’afficher que les valeurs distinctes d’un attribut. On utilise pour cela la commande DISTINCT, et on demande d’afficher l’attributDISTINCT(attribut).
Q5 Écrire une requête permettant d’afficher la liste des villes sans répétition. On doit obtenir une table contenant seulement 8 lignes.
Il peut arriver qu’on souhaite renommer une colonne dans la table résultat. Pour cela on place la commande ASsuivie du nouveau nom souhaité après leSELECT.
Q6 Que renvoie la requête suivante ?
1 SELECT annee AS dates FROM oeuvres;
Q7 Écrire une requête renvoyant la liste des pays renommée "country".
Q8 Écrire une requête renvoyant la liste des musées et des villes en renommant "lieudexpo" les musées et "city" les villes.
Q9 Écrire une requête renvoyant la liste des peintres sans répétition renommée "auteurs". On doit obtenir une tale contenant 18 lignes.
Exercice 3 WHERE is Vincent ?
Q1 Quelles sont toutes les oeuvres de la base de données exposées en Allemagne ? On donnera les attributsidde ces oeuvres.
À nouveau, pour une base de données réelle, il n’est pas raisonnable de répondre à la question précé- dente “à la main” en parcourant tous les enregistrements.
On peut restreindre la table résultat d’une requête aux seuls enregistrements vérifiant une condition donnée. Pour cela on place en fin de requête la commandeWHERE suivie de la condition souhaitée.
Q2 Que renvoie la requête suivante ?
1 SELECT titre, annee FROM oeuvres WHERE annee = 1890;
LIGHTBULB Remarque
Pour exprimer les conditions, le langage SQL dispose d’opérateurs semblables à ceux utilisés en Python : <, >, =, <=, >=, AND, OR, NOT.
Notons qu’en SQL “différent de” s’écrit indifféremment !=ou <> (mais le programme officiel de BCPST mentionne uniquement <>).
Q3 Écrire une requête permettant d’afficher les titres des oeuvres antérieures à 1512. Vous devez obtenir une table de 10 lignes.
Q4 Écrire une requête permettant de récupérer les identifiants, titres et musées des oeuvres exposées en Allemagne.
Q5 Écrire une requête permettant de récupérer la totalité des informations sur les oeuvres de Vincent Van Gogh présentes dans la base de données. On doit obtenir une table contenant 8 lignes.
Q6 Écrire une requête permettant de récupérer les titres et les villes des oeuvres exposées en France mais pas à Paris. On doit trouver une seule oeuvre, le "retable d’Issenheim".
Q7 Écrire une requête permettant d’afficher toutes les informations sur les oeuvres dont la ville d’exposition porte le même nom que le pays d’exposition.
Exercice 4 Des peintres agrégés
Comme on l’a vu avec la commande DISTINCT, il est possible d’afficher des tables qui ne sont pas simplement des restrictions de la table principale. Le langage SQL permet en effet de faire plus que “consulter” les attributs, il peut effectuer des “opérations” sur ces attributs. On parle alors de fonctions d’agrégation. Voici une liste des fonctions les plus courantes :
Procédure d’agrégation Commande SQL
Compter le nombre d’enregistrements COUNT(attribut) Sommer les valeurs d’un attribut SUM(attribut) Calculer la moyenne des valeurs d’un attribut AVG(attribut)
Renvoyer la valeur min./max. d’un attribut MIN(attribut)|MAX(attribut) Q1 Que renvoie la requête suivante ?
1 SELECT AVG(annee) FROM oeuvres;
Q2 Écrire une requête permettant d’afficher le titre et l’auteur de l’oeuvre la plus ancienne présente dans la base de données.
Q3 Que renvoie la requête suivante ? 1 SELECT COUNT(*) FROM oeuvres;
Q4 Écrire une requête permettant de compter le nombre de peintresdistincts présents dans la base de données. On doit obtenir pour résultat une tabled’une seule lignecontenant le nombre de peintres distincts (18).
Q5 Écrire une requête renvoyant le nombre d’oeuvres de la base de données exposées à Paris. On doit obtenir pour résultat une table d’une seule ligne contenant le nombre d’oeuvres (18).
Q6 Écrire une requête renvoyant le nombre de musées dans la ville de Paris. On doit obtenir pour résultat une table d’une seule ligne contenant le nombre de musées (3).
Q7 Écrire une requête renvoyant le titre et l’année de l’oeuvre la plus ancienne exposée en Allemagne.
On doit obtenir pour résultat une table d’une seule ligne et de deux colonnes contenant cette oeuvre (il s’agit de la “Vierge à l’Enfant avec des saints”).
Exercice 5 Filtrage des résultats
Pour cet exercice, on s’intéresse aux données de l’INSEE relatives aux communes de France1. Télé- chargez la base de donnéesFranceINSEE.db et ouvrez-la à l’aide de SQLiteStudio.
Q1 Combien de tables contient cette base de données ?
Pour l’ensemble des questions suivantes, vous prêterez une attention particulière au choix de la table sur laquelle effectuer les requêtes.
Q2 Combien y a-t-il d’enregistrements en tout dans la table communes? Q3 Écrire une requête renvoyant le nombre total d’habitants en France.
Q4 Écrire une requête renvoyant le nombre total de boulangeries en France.
Lorsque l’on manipule un grand nombre de données, il peut être intéressant de filtrer les résultats affichés. Ainsi, la formulation des requêtes SQL permet par exemple de choisir l’ordre de des résultats selon un attribut choisi ou bien limiter le nombre de résultats.
Procédure Nom de l’opération Commande SQL
Renvoyer les résultats triés Ordonnancement ORDER BY attribut ASC ORDER BY attribut DESC
Renvoyer les npremiers résultats LIMIT n
Q5 Écrire une requête renvoyant tous les noms des communes triés par nombre d’habitants décrois- sant.
Q6 Écrire une requête renvoyant tous les noms des communes de l’Ain (numéro de département 01) triés par ordre alphabétique. On doit obtenir une table de 461 enregistrements commençant par
"Abergement-Clémenciat".
Q7 Écrire une requête renvoyant le top 10 des villes classées par nombre de boulangeries décroissant.
La requête affichera le nom des villes ainsi que leur nombre de boulangeries. On doit obtenir pour résultat une table de 10 lignes dont la dernière indique qu’il y a 160 boulangeries à Bordeaux.
Q8 Écrire une requête renvoyant la liste des communes dont le nom commence par "le", "la" ou "l’"
classés par ordre alphabétique. Puis écrire une autre requête permettant de compter combien de telles communes existent. On doit en trouver 2239.
Q9 Écrire une requête renvoyant le libellé et la population de la commune avec le plus grand nombre d’habitants. La requête n’utilisera pas la commande MAX et devra ignorer les réponses dont la valeur de population est "N/A".
Q10 Écrire une requête affichant les noms des villes où il y a strictement plus de pharmacies que de boulangeries. Votre requête affichera le nombre de pharmacies de plus sous le nom différence et triera les résultats par ordre décroissant de l’attributdifférence. On doit obtenir pour résultat une table contenant 707 lignes dont la première indique qu’il y a 6 pharmacies de plus que de boulangeries à Thiais.
1. Pour plus d’informations sur les acronymes utilisés, vous pouvez consulter le site de l’INSEE :https://www.