TP n o 14 : Bases de données, première partie I Introduction Dans ce TP nous allons effectuer des opérations élementaires sur une base de données ne comportant qu une seule table. Lors de la prochaine séance, nous nous intéresserons plus spécifiquement à des requêtes portant sur plusieurs tables. L idée du TP est d adapter la syntaxe générale, qui sera fournie dans l énoncé, pour les différentes instructions SQL au cas concret sur lequel nous allons travailler. Nous allons créer une base de données appelée world dont le schéma contient trois tables, mais pour le moment on n utilisera une seule table Country, avec de nombreuses informations relatives aux pays du monde. Nous allons communiquer avec le SGBD mysql par l intermédiaire de l application graphique Workbench. II Création de la base de données 1 Connexion, fonctionnement général Lancer l application Workbench. Cliquer sur l icône correspondante dans la barre d applications sur la gauche ou sur le bureau. Si elle n apparaît pas, passer par le menu Application/Programmation/Workbench Cliquer sur la connexion CONNECTION MPSI_PCSI (ou Session MPSI PCSI si vous êtes en salle G307) Le mot de passe est infocommune (ou elevesg307 si vous êtes en salle G307) Vous disposez alors d un environnement que nous allons découvrir petit à petit. Dans la fenêtre centrale (qu on appelle un Script-Tab) on peut écrire une requête SQL et l exécuter. Pour exécuter successivement la totalité des requêtes d un Script-Tab cliquer sur l icône contenant un éclair (celle de gauche.) Pour n exécuter qu une requête particulière parmi toutes celles susceptibles d apparaître dans le Script-Tab, il suffit de mettre le curseur n importe où dans cette requête et de cliquer sur l icône avec un éclair et un curseur (celle de droite). Après l exécution le résultat s affiche au milieu de la fenêtre et un compte rendu d exécution apparaît tout en bas. Quand l énoncé demandera d exécuter un script, il s agit dans ce contexte de bases de données, d exécuter une requête SQL saisie dans un Script-Tab. 1
2 Création de la base de données On commence par détruire une éventuelle base de données pour partir d un environnement propre. Remarques Les instructions SQL sont généralement écrites en majuscules, mais cela n a rien d obligatoire. Workbench reconnaît les mot-clés du SQL et les affiche en bleu. Les commandes SQL doivent se terminer par un " ;". Syntaxe SQL : pour détruire une base de données nommée dbname on utilise la syntaxe suivante : DROP DATABASE dbname; Script 1 Détruire la base de données world en remplaçant dbname par world dans la syntaxe précédente. Si il y avait une base de données world celle-ci a été effacée, et la requête s est bien passée. Si il n y en avait pas, vous devez avoir un message d erreur, mais c est logique... Remarques : Workbench propose une aide à la saisie des requêtes : on peut faire générer des squelettes de requêtes en cliquant avec le bouton droit dans le panneau latéral gauche sur les noms des bases de données, des tables, des colonnes, puis en sélectionnant Send to SQLEditor (update statement, insert statement, etc..). Essayez par vous même dans la suite. Les opérations sur le schéma de la base de données (i.e. celles qui modifient les bases de données présentes, les tables, les colonnes) ne sont curieusement pas répercutées instantanément dans le panneau latéral gauche. Pour ce faire il faut cliquez sur le double flèche circulaire en haut droite de ce panneau, pour rafraichir les informations. On peut maintenant créer la base données world. Syntaxe SQL : pour créer une base de données nommée dbname on utilise CREATE DATABASE dbname; Script 2 Créer la base de données world. On peut enfin spécifier la base de données sur laquelle on veut travailler. Syntaxe SQL : pour choisir une base de données de travail nommée dbname on utilise USE dbname; Script 3 Spécifier à workbench qu on va travailler avec la base de données world. 2
3 Création de la table Country Le schéma de la relation Country serait un peu long à taper alors on va utiliser un fichier qui contient déjà la requête de création de la table. Ouvrir le script SQL nommé CreationTableCountry.sql par le menu File/Open SQL Script (Le fichier est à récupérer sur le site du lycée si nécessaire) Script 4 Exécuter le script de création de la table Country. Question 5 En lisant la requête de création de la table Country, donner le schéma relationnel de cette table (i.e. les attributs, leurs types, les attributs formant la clef primaire). Workbench peut afficher le schéma relationnel de la Table pour contrôler la réponse à la question précédente. Syntaxe SQL : pour faire afficher le schéma d une relation table_name on utilise DESCRIBE table_name; Script 6 Faire afficher le schéma de la relation Country, et contrôler la réponse à la question précédente. Notes char(3) désigne une chaîne de 3 caractères, int(11) un entier avec 11 chiffres, float(10,2) un flottant avec 10 chiffres avant la virgule et 2 après. 4 Création et suppression d un enregistrement dans la table Country On va insérer manuellement un pays dans la base de données. Syntaxe SQL : pour insérer un enregistrement dans la table table_name on utilise INSERT INTO table_name (col_name1, col_name2,...) VALUES (val1, val2,...); les valeurs val1, val2,... servant à alimenter les attributs de noms col_name1, col_name2,... Script 7 Deployer au maximum le schéma de la base de données world apparaissant dans le cadre latéral gauche en cliquant sur les petits triangles jusqu à faire apparaître la table Country. Faire générer l instruction SQL d insertion d un enregistrement dans la table Country en cliquant avec le bouton droit sur Country et en choisissant Send to SQL Editor/ Insert statement. Compléter alors le squelette de requête ainsi généré en mettant de vraies valeurs pour les attributs (éventuellement fantaisistes si elles ne sont pas connues), en accord avec leurs domaines (cf. la description de la table réalisée juste avant). Note : par exemple <{Code: }> est à remplacer par exemple par "FRA" car c est une chaîne de trois caractères (il faut tout remplacer, le <, le {, le Code:, le } et le >). Les chaînes de caractères doivent être entourées de guillemets. Exécuter la requête et vérifier dans le rapport d exécution que tout va bien (pas d erreur ni de warning). 3
Script 8 Vérifier en executant la requête suivante qu un enregistrement a bien été créé. SELECT * FROM Country; Il est probable que l enregistrement ainsi créé ne corresponde pas aux données d un vrai pays. On va donc le supprimer. Syntaxe SQL : pour supprimer un enregistrement vérifiant une condition dans la table table_name DELETE FROM table_name WHERE Condition; Script 9 Supprimer l enregistrement créé précédemment en utilisant comme Condition : Code=" FRA" si le code donnée pour le pays est "FRA" (à adapter éventuellement à la situation). Vérifier dans le rapport d exécution que tout va bien (pas d erreur ni de warning). Script 10 Vérifier en executant la requête suivante que l enregistrement a bien disparu de la base. SELECT * FROM Country; 5 Création de tous les enregistrements dans la table Country Il est temps d alimenter vraiment la base de données. Il n est pas question là aussi dans le cadre du TP d insérer les éléments un par un. On a à notre disposition un script contenant le nécessaire. Ouvrir le script SQL nommé CreationDonnéesCountry.sql par le menu File/Open SQL Script (Le fichier est à récupérer sur le site du lycée si nécessaire). Script 11 Exécuter le script qui contient les requêtes d insertion d un grand nombre d enregistrements dans la table Country. Un compte rendu d exécution est affiché pour chacune des (nombreuses!) requêtes de création de données. On peut passer à l exploitation de la base de données 6 Récupération de tous les attributs de tous les enregistrements Syntaxe SQL : pour récupérer toutes les données d une relation appelée tablename on utilise SELECT * from tablename; Script 12 Récupérer toutes les données de tous les enregistrements de la relation Country. 4
7 Projection : récupération de certains attributs de tous les enregistrements La requête précédente est très (trop) riche en information. Il est peu probable que l on ait besoin de la totalité des données. Pour ne garder que quelques attributs des enregistrements d une relation on utilise la projection. Syntaxe SQL : pour récupérer les attributs att1 et att2 de tous les enregistrements d une relation tablename on utilise : SELECT att1, att2 FROM tablename; Script 13 Récupérer le nom et le code de chaque pays (rappel : le schéma de la table s obtient par DESCRIBE si nécessaire, ou en en exploitant le volet gauche qui contient le schéma de la base de données) 8 Renommage Si le nom des colonnes (en anglais ici par exemple) ne plaît pas, on peut les renommer grâce à la clause AS qui suit l attribut que l on veut renommer. Il est bien sûr possible de renommer plusieurs attributs d un même coup. Syntaxe SQL : pour récupérer les valeurs de l attribut att et le renommer en nouveau_nom on utilise SELECT att AS nouveau_nom FROM tablename; Script 14 Récupérer le nom du pays avec comme nom de colonne Nom (et plus Name, le code (sans renommage), et le produit national brut (PNB) (colonne GNP pour Gross National Product) sous le nom "PNB en millions de dollars". Remarques Pour pouvoir mettre une chaîne de caractères complète comme nom de colonne il faut l entourer de guillemets. Il faut bien comprendre que le renommage n a lieu que dans le résultat de la requête effectuée et pas dans la base de données elle-même (ce serait un comportement vraiment gênant si n importe qui pouvait renommer les attributs d une table!) 9 Sélection : récupération de quelques enregistrements Jusqu à présent on a récupéré des informations pour tous les enregistrements. On va maintenant sélectionner quelques enregistrements particuliers. Pour cela on rajoute une clause WHERE après le FROM tablename, suivie d une condition (un prédicat). Cette condition s écrit en utilisant classiquement les opérateurs booléns AND, OR, <,>, >=, <=, BETWEEN ainsi que les valeurs des attributs des enregistrements par l intermédaire des noms de ces attributs. Syntaxe SQL : SELECT * FROM tablename WHERE Predicat; 5
Script 15 Récupérer les données des pays dont l espérance de vie est supérieure à 80 ans. Récupérer les données des pays dont l espérance de vie est comprise entre 78 et 80 ans en utilisant BETWEEN. Récupérer les données des pays dont l espérance de vie est comprise entre 70 et 80 ans, et dont le PNB est compris entre 500000 et 2000000. Récupérer les données des pays dont l espérance de vie est comprise entre 75 et 80 ans, et dont le PNB est compris entre 1000000 et 2000000, et dont la capitale a plus d un million d habitants. Récupérer les données des pays dont l espérance de vie est comprise entre 75 et 80 ans ou dont le PNB est compris entre 1000000 et 2000000. Récupérer les données des pays dont l espérance de vie est comprise entre 75 et 80 ans et dont le PNB est compris entre 1000000 et 2000000, ou dont la population de la capitale dépasse 1 million d habitants. Récupérer les données des pays dont l espérance de vie est comprise entre 75 et 80 ans et dont, le PNB est compris entre 1000000 et 2000000 ou la population de la capitale dépasse 2 million d habitants. On peut faire des recherches sur les chaînes de caractères avec un motif. Syntaxe SQL : dans la clause du WHERE on utilise LIKE suivi d un motif (qui est lui même une chaîne de caractères). SELECT * FROM tablename WHERE att LIKE motif; Dans le motif on peut utiliser le caractère spécial % qui permet de désigner n importe quelle chaîne de caractères. Par exemple LIKE %E permet de sélectionner les chaînes de caratères qui finissent par E, LIKE F%, celles qui commencent par F, et LIKE %RANC% celles qui contiennent la sous-chaîne RANC. Il y a bien d autres possibilités (consulter la documentation si nécessaire) Script 16 Récupérer les pays qui ont un régime politique de type monarchique (avec d éventuelles variantes). Il peut ne pas être inutile de regarder d abord dans la base de données les valeurs que peut prendre l attribut GovernmentForm. De manière à éliminer les doublons on peut pourra utiliser le mot-clef DISTINCT juste après le SELECT : SELECT DISTINCT... 10 Mise à jour La base de données est assez vieille. Script 17 Selon la base qui est l actuel président de la république française? Quelle est la population de france métropolitaine? 6
Il faut donc mettre à jour la base. Syntaxe SQL : Pour mettre à jour les attributs att1 et att2 de la relation tablename avec les valeurs val1 et val2, des enregistrements vérifiant une condition Predicat, on utilise : UPDATE tablename SET att1 = val1, att2 = val2 WHERE Predicat; Script 18 La population métropolitaine est actuellement de 66318000 habitants. Mettre à jour la population et le nom du chef de l état pour la france. Mais il ne faut pas oublier les autres dépéndances françaises! Mettre à jour le nom du chef de l état pour les dépendances françaises. On pourra utiliser le fait que toutes les dépendances françaises ont comme valeur de l attribut GovernmentForm une chaîne de caractères qui contient le mot France. 11 Un petit plaisir en tant qu application... On va se faire un petit plaisir en rayant de la carte un pays rugbystiquement ennemi, ainsi que ses dépendances : l Angleterre! Note dans le contexte actuel : c est de l humour... Script 19 Faire afficher tous les pays concernés (la question, pour pouvoir les sélectionner, est «qu ont-ils tous en commun?»). Feu! Supprimer tous ces pays... Comment vérifier que ces pays ne sont plus dans la base de données? 7