Base de donnée relationnelle Exemple de table
Transcription
Base de donnée relationnelle Exemple de table
Base de donnée relationnelle IFT1147 Programmation Serveur Web avec PHP Une base de données relationnelle est composée de plusieurs tables possédant des relations logiques (théorie des ensembles) entre elles. Chaque table possède plusieurs attributs. Chaque ligne d’une table est un ensemble de valeurs pour les mêmes attributs. Introduction à MySQL IFT1147 - Introduction à MySQL Exemple de table: Film filmID 1 2 3 4 titre Les Boys annee 1997 Cyrano de Bergerac Psycho Singing in the Rain 1990 1960 1952 Exemple de table: Acteur Le filmID permet d’identifier chaque ligne de façon unique. IFT1147 - Introduction à MySQL acteurID 1 2 3 Nom Depardieu Messier Kelly Prenom Gerard Marc Gene Naissance 1948-12-27 1947-08-16 1912-08-23 4 Perkins Anthony 1932-04-04 5 Kidman Nicole 1967-06-20 6 Huard Patrick 1969-01-02 3 IFT1147 - Introduction à MySQL Exemple de table: Role 4 Contenu de la table Role Cette table fait le lien entre les acteurs et les films. IFT1147 - Introduction à MySQL 2 5 filmID 1 2 acteurID Personnage 2 Bob 1 Cyrano de Bergerac 3 4 1 4 3 6 Norman Bates Don Lockwood Ti-Guy IFT1147 - Introduction à MySQL 6 1 MySQL et MySQL AB MySQL - limitations MySQL est un serveur de base de données produit par MySQL AB qui peut, sous certaines conditions, être utilisé gratuitement (double licence). Nous utiliserons la version 3.23 Le site Web de référence est http://www.mysql.com IFT1147 - Introduction à MySQL La version 3.23 de MySQL dont nous nous servirons comporte plusieurs limitations 7 Connexion Aucun subselect n’est possible Pas de support pour des foreign key Pas de support pour des transactions Pas de trigger, view, stored procedure IFT1147 - Introduction à MySQL 8 Connexion Le serveur MySQL est installé sur europa.iro.umontreal.ca et ne peut être accédé qu’à partir du domaine iro.umontreal.ca. Vous pouvez seulement créer des bases de données dont le nom débute par votre login suivi de _, par exemple dift1147_Cinema Votre nom d’usager MySQL est le même que votre login Unix, le mot de passe initial est celui de la recette Unix initiale. Personne à part vous (et l’administrateur du serveur) ne possède de droits (même de consultation) sur vos bases de données. IFT1147 - Introduction à MySQL 9 Ligne de commande mysql Il est installé par défaut Il est créé et supporté par MySQL AB Il fonctionne sous tout système d’exploitation Afin que le client mysql puisse se connecter au serveur, vous devez lui donner le nom du serveur, votre nom d’usager et votre login mysql -h europa.iro.umontreal.ca -u login -p Le système vous demandera alors votre mot de passe. D’autres logiciels incluent PHPMyAdmin, mysqlcc, MySQL Administrator, … IFT1147 - Introduction à MySQL 10 Connexion avec mysql mysql est le logiciel de prédilection pour interagir avec le serveur MySQL. IFT1147 - Introduction à MySQL 11 IFT1147 - Introduction à MySQL 12 2 Lister les bases de données Choisir une base de données show databases permet d’afficher la liste de toutes les bases de données du serveur. Il y en a beaucoup … donc, afin de trouver les vôtres, il vaut mieux spécifier que le nom de celles que vous cherchez commence par votre login show databases like ’dift1147_%’; IFT1147 - Introduction à MySQL 13 La structure d’une table IFT1147 - Introduction à MySQL 14 La commande SQL SELECT permet d’extraire les informations d’une ou plusieurs tables. SELECT titre, annee FROM Film; describe nomDeLaTable; Et pour obtenir la commande SQL complète permettant de recréer la structure d’une table Si on veut obtenir toutes les colonnes SELECT * FROM Film; show create table nomDeLaTable; 15 Avant d’aller plus loin IFT1147 - Introduction à MySQL 16 Résultats distincts La casse n’a pas d’importance pour les mots clés SQL. Elle importe pour ce qui est des noms des tables ! Les retours à la ligne à l’intérieur d’une commande ne servent qu’à la lisibilité. Afin que le client envoie une commande au serveur, elle doit être terminée par ; (ou par \G) IFT1147 - Introduction à MySQL La prochaine étape est d’obtenir la liste des tables show tables; ou, comme précédemment show tables like ’%toto% ’; Finalement, les données … Afin de connaître la liste des colonnes d’une table, on peut utiliser la commande IFT1147 - Introduction à MySQL Afin de travailler avec une des bases de données, on utilise la commande use use dift1147_Cinema; Dans la table Film, plusieurs films peuvent porter le même titre. SELECT titre FROM Film; retournera alors des duplicats. Si on ne souhaite pas obtenir de duplicats, il faut écrire SELECT DISTINCT titre FROM Film; 17 IFT1147 - Introduction à MySQL 18 3 Limiter les résultats de SELECT Ordonner les résultats de SELECT Les résultats retournés par SELECT peuvent être limités en utilisant WHERE SELECT titre, annee FROM Film WHERE annee = 1997; ORDER BY ordonne les résultats. Les colonnes du tri n’ont pas besoin d’être affichées SELECT titre FROM FILM ORDER BY annee ASC; ORDER BY doit être utilisé après WHERE SELECT * FROM FILM WHERE annee=1997 ORDER BY titre; SELECT * FROM Film WHERE titre LIKE ’P% ’; IFT1147 - Introduction à MySQL 19 IFT1147 - Introduction à MySQL Limiter - encore Limiter - exemple De grandes bases de données contiennent des centaines de millions d’entrées. Il est inimaginable de toutes les afficher d’une seule fois. Souvent, on n’a besoin que des 100 premières (selon l’ordre choisi). On peut alors utiliser LIMIT. IFT1147 - Introduction à MySQL Voici comment afficher les 5 premiers films (en ordre alphabétique) qui ont été tournés en 1997 SELECT * FROM Film WHERE annee = 1997 ORDER BY titre ASC LIMIT 5; 21 IFT1147 - Introduction à MySQL Nombre de lignes 22 Quelques fonctions utiles Si on n’est pas vraiment intéressé au résultat d’une requête, mais seulement au nombre de lignes qu’elle retourne, il vaut mieux utiliser la fonction count (moins de transfert de données). SELECT COUNT(*) AS nombre FROM Film WHERE annee = 1997; IFT1147 - Introduction à MySQL 20 Afin de manipuler des chaînes de caractères, on peut utiliser (entre autres) LEFT(colonne, nbChr) RIGHT(colonne, nbChr) CONCAT(chaine1, chaine2) Dans la condition WHERE, on peut utiliser AND, OR, BETWEEN et ISNULL 23 IFT1147 - Introduction à MySQL 24 4 Plusieurs tables dans une requête Plusieurs tables - suite Le FROM d’une requête peut contenir plusieurs tables, séparées par des virgules. SELECT * FROM Acteur, Role La plupart du temps, on ne veut obtenir que les lignes « reliées » des deux tables, et non pas le produit cartésien au grand complet. Il faut alors spécifier la relation dans le WHERE. Le résultat de la requête est alors le produit cartésien des deux tables. IFT1147 - Introduction à MySQL SELECT * FROM Acteur, Role WHERE Acteur.acteurID=Role.acteurID; 25 Dans certains cas, seulement les lignes reliées entre deux tables ne sont pas non plus le résultat souhaité. Que faire s’il faut obtenir tous les éléments d’une première table qui ne possèdent pas d’entrée dans une autre, par exemple tous les acteurs qui n’ont encore eu aucun role ? 27 LEFT JOIN - exemple La clause LEFT JOIN permet de retourner toutes les entrées d’une première table avec, s’il y a correspondance, les entrées d’une deuxième, et NULL dans toutes les colonnes réservées à la deuxième table s’il n’y a pas de correspondance. IFT1147 - Introduction à MySQL 28 Sauvegarde SELECT Acteur.* FROM Acteur LEFT JOIN Role ON Acteur.acteurID = Role.acteurID WHERE isnull(Role.acteurID); Un LEFT JOIN est beaucoup plus lent à exécuter qu’un lien direct. À n’utiliser qu’en cas de besoin. IFT1147 - Introduction à MySQL 26 Plusieurs tables - LEFT JOIN Plusieurs tables - ce n’est pas fini IFT1147 - Introduction à MySQL IFT1147 - Introduction à MySQL 29 Avant de modifier les données dans les tables, mieux vaut savoir créer une sauvegarde ! Le logiciel mysqldump est l’utilitaire nécessaire. Il prend les mêmes arguments que le client mysql; de plus, on doit aussi spécifier le nom de la base de données à sauvegarder. IFT1147 - Introduction à MySQL 30 5 Sauvegarde - côté pratique Insérer de nouvelles données La sauvegarde créée par mysqldump contient toutes les instructions SQL afin de recréer la base de données. La commande INSERT permet d’insérer de nouvelles données dans une table. On peut spécifier les valeurs à insérer ou utiliser le résultat d’une requête. mysqldump -h europa -u dift1147 -p dift1147_Cinema > cinema.sql INSERT VALUES INSERT SELECT Pour restaurer mysql -h europa -u dift1147 -p dift1147_Cinema < cinema.sql IFT1147 - Introduction à MySQL 31 IFT1147 - Introduction à MySQL Effacer des données On peut modifier les entrées d’une table avec la commande UPDATE. De nouveau, mieux vaut ne pas oublier le WHERE UPDATE Acteur SET prenom = ’Gaston’, naissance = ’1950-12-12’ WHERE acteurID = 1; 33 IFT1147 - Introduction à MySQL Créer la structure d’une table Les types de colonnes les plus usuels Le nom de la table Pour chaque colonne, son nom et le type de données Les clés (indices) IFT1147 - Introduction à MySQL 34 Type de colonnes On crée la structure d’une table avec la commande CREATE TABLE Il faut spécifier 32 Modifier les données La commande DELETE sert à effacer des données. N’oubliez pas le WHERE, sinon, la table est vide instantanément ! Il n’y a pas de poubelle, ni de undo DELETE FROM Acteur WHERE acteurID = 1; IFT1147 - Introduction à MySQL INTO Film(titre, annee) (’LES Boys’, 1997); INTO Film(titre, annee) titre, annee FROM Table; 35 VARCHAR(lon) chaîne de caractères de longueur variable INT un entier entre -2147483648 et 2147483647 SMALLINT un entier entre -32768 and 32767 DATE une date en format AAAA-MM-JJ IFT1147 - Introduction à MySQL 36 6 Clés et indices Clés - suite Clé et indice sont des synonymes pour MySQL On se sert des clés pour Une table ne peut posséder qu’une seule clé primaire. Une clé primaire est une clé unique particulière: la différence se situe au niveau du traitement des valeurs nulles. Une clé unique empêche les duplicats. Une clé sert à accélérer les recherches. Empêcher des duplicats Accélérer les recherches Il existe trois clés: clé primaire (primary key), clé unique (unique key) et la clé (key). IFT1147 - Introduction à MySQL 37 Clés - quand les utiliser CREATE TABLE Acteur ( acteurID INT(5) UNSIGNED NOT NULL AUTO_INCREMENT, nom varchar(40) NOT NULL, prenom varchar(40) NOT NULL, naissance DATE NOT NULL, PRIMARY KEY(acteurID), KEY nom(nom) ); Les clés utilisent de l’espace disque et ralentissent les insertions (et parfois les modifications) … il ne faut donc pas exagérer. 39 Modifications de la structure IFT1147 - Introduction à MySQL 40 Modifications de la structure On peut aussi modifier la structure d’une table une fois qu’elle a été créée Les commandes sont de la forme ALTER TABLE nomTable Effacer une colonne ALTER TABLE nomTable DROP COLUMN nomColonne; IFT1147 - Introduction à MySQL 38 Création d’une table - exemple Chaque table devrait avoir une clé primaire. Une colonne qui est souvent utilisée dans un WHERE devrait avoir une clé. IFT1147 - Introduction à MySQL IFT1147 - Introduction à MySQL 41 Ajouter une clé ALTER TABLE nomTable ADD key(nomCol, nomCol2); Ajouter une colonne ALTER TABLE nomTable ADD COLUMN nomCol VARCHAR(40) AFTER autreCol; IFT1147 - Introduction à MySQL 42 7