IFT 6800 – Démonstration 2 But de la démonstration Préalables
Transcription
IFT 6800 – Démonstration 2 But de la démonstration Préalables
Département d’informatique et de recherche opérationnelle IFT 6800 – Démonstration 2 But de la démonstration Cette démonstration vise à vous présenter une introduction aux bases de données relationnelles et aux systèmes de gestion de bases de données (SGBD) associés. Ici, nous utiliserons un système de gestion base de données appelé mysql, gratuit et populaire1. Préalables Révisez les notes de cours de la séance 3 du cours, en particulier ce qui touche au langage SQL, un langage de manipulation de bases de données. Connexion au SGBD mysql Ouvrez d’abord une session Linux tel qu’expliqué lors de la précédente démonstration. Au DIRO, mysql est installé sur une machine dédiée, soit la machine mysql.iro.umontreal.ca. Pour vous connecter à mysql, faites mysql -u nom_usager -p -h mysql.iro.umontreal.ca Entrez le mot de passe pour mysql. Celui-ci est construit avec la recette : en minuscules, les 2 premiers caractères du nom de famille en minuscules, les 2 premiers caractères du prénom le dernier chiffre de l'année de naissance en MAJUSCULES pour les HOMMES, en minuscules pour les femmes : la lettre représentant l’ordre du mois de naissance (A = janvier, B = février, C = mars, ..., L = décembre) les 2 chiffres du jour de naissance, entre 01 et 31 Le système vous souhaite alors la bienvenue et vous offre une invite de commande (« prompt ») qui a cette forme : mysql> C’est de cette invite que nous contrôlerons la base de données. Lorsque vous aurez terminé avec mysql, tapez exit. Pour changer votre mot de passe, sortez de mysql et faites dans Linux : mysqladmin -h mysql -u nom_usager -p password leNouveauMotDePasse Il y a plus d’informations sur le site du soutien technique, à http://support.iro.umontreal.ca/doku.php?do=show&id=logiciel%3Amysql . 1 http://www.mysql.com Nous citerons des sections du document utilisé par votre enseignant, présenté en cours et disponible à http://www.iro.umontreal.ca/~nie/IFT6800/ (lien Bases de données). Les autres liens de cette section sont également très utiles. Changement du moteur Pour pleinement profiter des possibilités du modèle relationnel, entrez toujours la commande suivante avant de travailler : set storage_engine=InnoDB; Partie I : une agence de voyage Dans cet exercice, nous allons créer, peupler, interroger et modifier les tables d’une agence de voyage fictive. Ces tables sont au nombre de quatre : Station, Activite, Client, Sejour. Au DIRO, vous ne pouvez créer ou manipuler que les bases de données dont les noms commencent par votre nom d’utilisateur. Par conséquent, dans ce texte, lorsqu’on se réfère à une base de données NomDeLaBase, en fait, vous devez utiliser le nom nomutilisateur_NomDeLaBase pour que mysql accepte vos commandes. Création de la base de données Avant de créer les tables de l’agence de voyage, créons la base de données qui les contiendra. Pour ce faire, entrez les commandes suivantes : CREATE DATABASE nomutilisateur_Agence; USE nomutilisateur_Agence; Notez le préfixe nomutilisateur, sans quoi mysql vous refuse l’accès au DIRO. Création des tables (pages 36 et suivantes) Créez les tables de l’agence de voyage en vous servant des descriptions et des contraintes qui suivent. Pour chaque station, les champs et leurs contraintes respectives sont expliqués. Comme vu en cours, lorsqu’un champ est souligné, c’est qu’il fait partie de la clé primaire d’une table. C’est-à-dire qu’on peut se servir de cette clé pour désigner un enregistrement (appelé aussi n-uplet dans les notes ou « record » ou « rows » en anglais). Ainsi, votre code permanent pourrait servir de clé primaire pour vous identifier, car il est unique pour chaque personne. Votre prénom ne suffirait pas, puisque bien des gens le partagent, à moins de vous appeler Dweezil Zappa. Station nomStation capacite lieu La capacité et le lieu ne doivent pas être nuls (vides). Le tarif doit être par défaut à 0. tarif 2 Solution pour cette table CREATE TABLE Station ( nomStation VARCHAR(32), capacite INTEGER NOT NULL, lieu VARCHAR(32) NOT NULL, tarif FLOAT(10,2) DEFAULT '0.0', PRIMARY KEY(nomStation) ); La 2e ligne indique que le champ nomStation est de type VARCHAR(32) (chaîne de caractères de longueur variable comptant au plus 32 caractères). Elle est déclarée comme clé primaire (on peut identifier uniquement un enregistrement en l’utilisant) à la dernière ligne à l’aide de l’instruction PRIMARY KEY. Remarquez que NOT NULL permet de satisfaire la contrainte sur les champs capacite et lieu qui veut que ces champs ne peuvent être vides dans un enregistrement. DEFAULT stipule la valeur par défaut. Terminez toujours vos instructions par le point-virgule. Notez également que tarif est de type FLOAT, pas INTEGER, ce qui veut dire que c’est un nombre fractionnaire (un prix doit pouvoir être fractionnaire, naturellement). En spécifiant FLOAT(10,2), on demande qu’il puisse contenir 10 chiffres avant la virgule et 2 après. Pour voir la structure d’une table, faites DESC nomDeLaTable; La table est donc créée, et elle est vide (elle ne contient pas encore d’enregistrements). Créez le reste des tables. Par convention, certains auteurs2 utilisent les majuscules pour les mots-clés de mysql, la majuscule initiale seulement pour les noms de tables et de bases de données, et la minuscule pour les noms des champs. Nous suivrons cette convention ici. mysql, lorsqu’il tourne sous Linux, tient compte de la casse dans les noms des bases, tables et champs. Les mots-clés, eux, peuvent être écrits en majuscules ou en minuscules indifféremment. Activite nomStation libelle prix Le prix par défaut est de 0,00 $. nomStation fait référence à la table Station. Indice Il faut utiliser l’instruction FOREIGN KEY (p. 43). Client id nom prenom ville solde id est un nombre entier. Le nom, la ville et le solde ne doivent pas être nuls (vides). 2 Voir notamment le livre Apprendre SQL avec MySQL cité dans les sources. 3 Sejour id nomStation debut nbPlaces Le nombre de places ne peut être nul. debut est une date, type de données DATE (p. 36 pour les types). id fait référence à la table Client. nomStation fait référence à la table Station. Peuplement des tables (p. 62 et suivantes) Toutes les tables créées sont vides pour le moment. On utilisera la commande INSERT pour ajouter des enregistrements à une table (lignes grisées dans les tableaux qui suivent). Station nomStation capacite lieu tarif Mont Tremblant Saint-Sauveur Chutes du Niagara 1300 1000 1800 Mont Tremblant Saint-Sauveur Niagara Falls 1200 1500 2000 Par exemple, pour le premier enregistrement, on aurait l’instruction qui suit. INSERT INTO Station(nomStation, capacite, lieu, tarif) VALUES('Mont Tremblant', 1300, 'Mont Tremblant', 1200); Notez les guillemets simples autour des chaînes de caractères et leur absence autour des nombres. Rappelez-vous que, comme pour un terminal Linux, vous pouvez rappeler la dernière commande soumise à mysql en tapant la flèche vers le haut. Pour voir à quoi ressemble une table que vous peuplez, faites simplement : SELECT * FROM nomDeLaTable; (on en reparle plus bas) En cas d’erreur de frappe, vous pouvez supprimer un enregistrement en utilisant la commande suivante : DELETE FROM nomDeLaTable WHERE NOM_CLE_PRIMAIRE = VALEUR_DE_ENREGISTREMENT_A_DETRUIRE; Complétez les autres tables avec les données qui suivent. Activite nomStation libelle prix Saint-Sauveur ski de fond 150 Saint-Sauveur ski alpin 120 Chutes du Niagara voile 200 Mont Tremblant motoneige 500,50* *Pour taper le point décimal, utilisez un point plutôt qu’une virgule (500.50). 4 Client id nom prenom ville solde 10 20 30 40 Kepoura Therieur Therieur Oma Adrienne Alain Alex Modeste Montreal Quebec Quebec Ste-Foy 12690 256 659 145 Sejour id nomStation debut nbPlaces 20 Saint-Sauveur 2007-09-28* 4 10 Chutes du Niagara 2006-10-10 3 30 Mont Tremblant 2007-01-01 2 40 Chutes du Niagara 2006-05-17 5 *Les dates ont le format AAAA-MM-JJ et sont entourées de guillemets simples. Violation des contraintes Tentez les requête suivante et expliquez-vous pourquoi mysql refuse de les exécuter : INSERT INTO Station(nomStation, capacite, lieu, tarif) VALUES('Mont Tremblant', 1200, 'dummy', 300); INSERT INTO Station(nomStation, capacite, lieu, tarif) VALUES('Jay Peak', NULL, 'dummy', 300); INSERT INTO Activite(nomStation, libelle, prix) VALUES('Jay Peak', 'ski de fond', 150); Questions Utilisez l’instruction SELECT pour les questions qui suivent. 1) Sélectionnez tous les champs (colonnes) de la table Station. 2) Sélectionnez les champs nomStation et capacite de Station. 3) Sélectionner tous les champs de la table Station pour les stations où la capacité excède 1200 personnes. 4) Sélectionnez les champs id et nomStation de la table Sejour où le nombre de places est soit 2, soit 4, soit 5. 5) Sélectionnez tous les champs de la table Client pour les clients dont le prénom commence par un « A » et dont le solde excède 300 $. 6) Sélectionnez tous les champs de la table Client pour les clients dont le prénom ne commence pas par un « A ». 7) Sélectionnez les champs libelle et prix de la table Activite et triez les résultats en ordre croissant de prix. 8) Sélectionnez les champs libelle et prix de la table Activite et triez les résultats en ordre décroissant de prix. 5 Utilisez l’instruction DELETE pour les questions qui suivent. 9) INSERT INTO Station(nomStation, capacite, lieu, tarif) VALUES('Cortina', 5000, 'Italie', 10000), ('Aspen', 6000, 'USA', 10000); 10) Détruisez l’enregistrement de la station d’Aspen. 11) Réinsérer l’enregistrement d’Aspen (avec un INSERT). 12) Détruisez toutes les stations dont le tarif excède 5000 $. Utilisez l’instruction DROP TABLE pour les questions qui suivent. 13) Créez une table temporaire Dummy (peu importent ses champs). 14) Détruisez-la. 15) Tentez de détruire la table Client. Expliquez. Utilisez l’instruction UPDATE TABLE pour la question qui suit. 16) Dans la table Activite, substituez « skidoo » à « motoneige »3. Utilisez l’instruction ALTER TABLE pour les questions qui suivent. 17) Ajoutez une colonne dateCreation de type DATE dans la table Client en affectant la date 2007-01-01 par défaut. 18) Renommez la colonne dateCreation de Client en dateAjout. Notes supplémentaires Vous pouvez afficher la structure d’une table en faisant DESC NomDeLaTable; Vous pouvez afficher la liste des tables d’une base en faisant SHOW TABLES; Partie II : une bibliothèque Création À vous de jouer. Créez par vous-même la base de données Bibliotheque décrite cidessous, puis trouvez les instructions SQL permettant de répondre aux questions qui suivent. N’oubliez pas de créer une nouvelle base de données pour y mettre ces tables. En dessous des noms des champs, vous trouverez leur type. Une string est une chaîne de caractères de type VARCHAR(32) (ou plus de 32 caractères si vous le jugez nécessaire). Les champs soulignés sont les clés primaires. Emprunteurs idPersonne nom prenom ville nbRetards entier string string entier string Ni le nom ni le prénom ne peuvent être nuls. Le nombre de retards a 0 pour valeur par défaut. 3 « skidoo » est un anglicisme, sorry. 6 Livres idLivre isbn titre nbPages dateParution entier entier string entier date L’isbn ne peut être nul, ni la date de parution. Emprunts idEmprunt idLivre idPersonne datePret nbJoursEmprunt entier entier entier date entier idLivre est une clé étrangère vers la table Livres, idPersonne est une clé étrangère vers la table Emprunteurs. nbJoursEmprunts vaut 14 par défaut. Vous n’avez pas à entrer de valeurs dans les tables avec INSERT. Questions supplémentaires Trouvez les requêtes SQL qui permettent d’exécuter les consignes suivantes sur la base de données Bibliotheque. 1) Ajoutez une colonne auteur à la table Livres, avec comme valeur par défaut « Michel Tremblay ». 2) Quelle commande SQL vous permet de vous assurer que le changement a bien été fait ? 3) Renommez la colonne auteur de la table Livres en editeur sans changer la valeur par défaut (« Michel Tremblay ») de ce champ. 4) Changer le type de la colonne isbn de la table Livres en string, plutôt qu’un entier sans perdre la contrainte voulant que le champ ne puisse être nul. 5) Affichez les noms, prénoms de tous les emprunteurs dont le nom finit par « e » et qui ont au moins 6 retards à leur actif. Il est normal que vous n’obteniez aucun résultat si la table est vide, mais tentez l’exercice. 6) Affichez les titres des livres dont le titre commence par « Le » OU qui ont plus de 300 pages. Sources Ce document est une adaptation de démonstrations similaires faites pour les cours ift6800 et ift3030 à l’Université de Montréal. L’excellent livre Apprendre SQL avec MySQL4, de Christian Soutou a fourni quelques idées. Rédigé & adapté par Fabrizio Gotti, été 2007. 4 SOUTOU, Christian, Apprendre SQL avec MySQL, Paris, Eyrolles, 2006, 396 pages. 7