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

Documents pareils