Bases de données Niveau 1 SQL - MySQL MariaDB - Cours et TP 6 Clé primaire concaténée MariaDB : https://mariadb.org/ Site officiel MySQL : http://www-fr.mysql.com/ Zone pour les développeurs : http://dev.mysql.com/ Téléchargement : http://dev.mysql.com/downloads/ Documentations MySQL : http://dev.mysql.com/doc/refman/5.0/fr/ http://dev.mysql.com/doc/refman/5.6/en/ http://dev.mysql.com/doc/index.html Mémo SQL : http://www.volubis.fr/bonus/sql_memo.htm Bertrand LIAUDET SOMMAIRE SOMMAIRE 1 MODÉLISATION : MODELE RELATIONNEL - SUITE 2 1. Clé primaire concaténée : une difficulté du modèle relationnel 2 2. Questions de caractères 6 SQL : CONSULTATION DE LA BD - SUITE 10 TP N 6 : TABLES-VERBES 11 Présentation 11 Méthode 11 Exercice 1 : DDL : Création de la BD 12 Exercice 2 : SELECT : Interrogation de la BD 13 Exercice 3 : DML : Mise à jour de la BD 14 Première édition : septembre 2007 Deuxième édition : octobre 2008 mise à jour octobre 2011 BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 06 - page 1/14 - Bertrand LIAUDET
MODÉLISATION : MODELE RELATIONNEL - SUITE Clé primaire concaténée Table-verbe PRINCIPALES NOTIONS Table-nom 1. Clé primaire concaténée : une difficulté du modèle relationnel Exemple traité Une bibliothèque gère les emprunts des livres de ses adhérents. Les livres ont un titre et un auteur. Les exemplaires physiques des livres ont un numéro différent par exemplaire. Ils correspondent à un livre et ont un éditeur. Les adhérents ont un nom, un prénom, une adresse et un téléphone. On souhaite archiver tous les emprunts. Un livre ne peut pas être rendu le jour même de son emprunt. La durée maximum d'emprunt doit être est de 14 jours. La bibliothèque souhaite pouvoir connaître à tout moment la situation de chaque abonné (nombre de livres empruntés, retards éventuels). Elle souhaite aussi pouvoir faire des statistiques sur la pratique des clients (nombre de livres empruntés par an, répartition des emprunts par genre, nombre d emprunts par livre, etc. Modèle relationnel Tables des Adhérents et des Oeuvres De l analyse du texte précédent, on extrait aisément la table des adhérents et celle des oeuvres : ADHERENTS (NA, nom, prenom, adr, tel) OEUVRES (NO, titre, auteur) Table des Livres On arrive aussi à extraire assez facilement la table des livres physiques : LIVRES (NL, editeur, #NO) Remarque La table des livres physique est nommée : «Livres», ce qui facilitera l interprétation des questions (un adhérent vient rendre un livre, quels sont les livres en retard, etc.). Tables des Emprunts On peut envisager une table des emprunts. La table des emprunts c est une liste de livres par adhérent, mais aussi une liste d adhérents par livre. Les attributs de cette table sont les suivants : EMPRUNTER (#NA, #NL, datemp, datretmax, datret) Quelle est la clé primaire de cette table? BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 06 - page 2/14 - Bertrand LIAUDET
On pourrait penser créer un attribut : «NEMP» et en faire la clé primaire. Une difficulté du modèle relationnel : quand on a plusieurs clés étrangères dans une table Règle fondamentale de modélisation relationnelle : Quand on a plus d une clé étrangère dans une table, il faut se demander si la concaténation de plusieurs attributs de la table n est pas clé primaire de la table. Méthode pour déterminer la clé primaire quand on a plusieurs clés étrangères La méthode de recherche de la clé primaire sera la suivante : 1) Se demander si la concaténation des clés étrangères ne forme pas la clé primaire. 2) Si ç est le cas, se demander si on ne peut pas retirer quelques clés étrangères de la concaténation. 3) Si ce n était pas le cas, essayer d ajouter des attributs non clé étrangère pour trouver la clé primaire. 4) Une fois trouvé, essayer de supprimer des attributs clés étrangères de la nouvelle clé primaire concaténée. Application 1 ère hypothèse : EMPRUNTER(#NA, #NL, datemp, dureemax, datret) Est-ce que NA et NL forment bien la clé primaire? Non : un adhérent peut emprunter plusieurs fois le même livre à des dates différentes. 2 ème hypothèse : on ajoute datemp : EMPRUNTER(#NA, #NL, datemp, dureemax, datret) Le tripmet (NA, NL, datemp) est clé primaire 3 ème hypothèse : on supprime NL : EMPRUNTER(#NA, #NL, datemp, dureemax, datret) Le couple (NA, datemp) n est pas clé primaire. 4 ème hypothèse : on supprime NA : EMPRUNTER(#NA, #NL, datemp, dureemax, datret) Le couple (NL, datemp) est clé primaire. Conclusion : EMPRUNTER(#NL, datemp, dureemax, datret, #NA) Schéma de la BD ADHERENTS (NA, nom, prenom, adr, tel) OEUVRES (NO, titre, auteur) LIVRES (NL, editeur, #NO) EMPRUNTER(#NL, datemp, dureemax, datret, #NA) Formalisme 1. Les clés primaires sont soulignées et placées en premier dans la liste des attributs. 2. Le nom d une clé primaire simple est constitué de : «N»+1 ère lettre de la table (NA). BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 06 - page 3/14 - Bertrand LIAUDET
3. Dans une clé primaire concaténée, les attributs clés étrangères sont placés en premier. 4. Les clés étrangères sont précédées d un #. 5. Les clés étrangères sont mises en dernier dans la liste des attributs. Expression ultra-schématique De façon ultra-schématique, les tables peuvent s écrire ainsi : A (A, Ax) O (O, Ox) L (L, Lx, #NO) E (#L, datemp, Ex, #A) Graphe des tables EMPRUNTER LIVRES ADHERENTS OEUVRES Distinction entre table-nom et table-verbe On a donc deux grands types de tables : les tables-noms et les tables-verbes Les tables-noms En général, les tables noms représentent une réalité matérielle : les adhérents, les livres. Les oeuvres sont aussi une table-nom. Elles ont une clé primaire simple. Les tables-noms En général, les tables verbes représentent une relation, un lien entre deux tables noms. Formalisme Le nom des tables-noms est un nom commun au pluriel : les Adhérents. Le nom des tables-verbes est un verbe à l infinitif : Emprunter. Ce verbe désigne la relation que la table verbe établit entre les deux tables-noms : les adhérents empruntent des livres. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 06 - page 4/14 - Bertrand LIAUDET
Intérêt de la clé primaire concaténée Pourquoi n a-t-on pas utilisé un attribut NE (numéro d emprunt) comme clé primaire? Pour 3 raisons : En déclarant (NL, datemp) comme clé primaire, on garantit l unicité du couple NL, datemb, ce qui garantit la cohérence sémantique des données. On évite de créer un attribut inutile. On met au jour le fait qu un emprunt est défini par le couple (NL, datemb). Cela permet de mieux comprendre les données. Clé primaire concaténée ou clé secondaire concaténée? Principe : toujours éviter, si possible, la clé secondaire concaténée!!! Si le SGBD permet la création de clé primaire concaténée et de clé étrangère faisant référence à une clé primaire concaténée, alors on évitera toujours la clé secondaire concaténée. Formalisme des clé secondaire EMPRUNTER(NE, (#NL, datemp), datretmax, datret, #NA) On met la clé secondaire juste après la clé primaire, entre parenthèses pour la repérer. Conséquence syntaxique Syntaxe UNIQUE (NL, datemp) Clé primaire concaténée CREATE TABLE emprunter ( NL integer not null, foreign key(nl) references livres(nl), datemp date not null, primary key (NL, datemp) ); Clé étrangère concaténée Une clé primaire concaténée peut aussi devenir clé étrangère dans une autre table : CREATE TABLE test ( NL integer not null, datemp date not null, foreign key(nl, datemp) references emprunter(nl, datemp) ) ; BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 06 - page 5/14 - Bertrand LIAUDET
2. Questions de caractères Jeu de caractères : character set Définition d un jeu de caractères Ensemble de caractères (lettres, ponctuation, chiffres, etc.) auxquels sont associés un numéro de code. Exemple : code ASCII. «A»=65, «,» = 44. 128 caractères sont codés de façon standard. Select ASCII ( A ); Select CHAR(65); Codages ISO (origine ASCII) Principe : 1 octet = 8 bit = 256 codages possibles. Les jeux de caractères normalisés ISO 8859 sont codés sur 1 octet. Le ISO 8859-1 est le «latin-1» ou «occidental» ou «western» Le ISO 8859-6 fournit les caractères arabes. Codages Unicode : UTF 8 Principe : un jeu de caractères pour toutes les langues : plus que 256 caractères. Les jeux de caractères Unicode utilisent plusieurs octets. UTF-8 utilise des caractères de taille variable, de 1 à 4 octets. Attention, l UTF 8 gère mal les accents. Police de caractère : character font Mysql La police est une notion différente du jeu de caractères. Elle ne concerne que l apparence graphique. Variables d environnement Show character set; // jeux de caractères disponibles. Select * from information_schema.character_sets; // état du dictionnaire des données Show variables like %char% ; // état des variables d environnement Set @@character_set_client="latin1"; // modification des variables Signification des variables character_set_client : jeu de caractère utilisé en saisie character_set_connection : jeu de caractères utilisé pour la communication client serveur character_set_results : jeu de caractères utilisé pour l affichage des résultats character_set_database : jeu de caractères de la BD en cours d utilisation BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 06 - page 6/14 - Bertrand LIAUDET
character_set_server : jeu de caractère du serveur My.ini Show variable like datadir ; // répertoire du fichier my.ini [mysql] default-character-set=latin1 [mysqld] default-character-set=latin1 Collation: character set Définition d une collation Une collation est liée à un jeu de caractères. Elle donne l ordre de classement des caractères et l équivalence éventuelle entre caractère («e» équivalent à «E», «é», «è») Type de collation en fonction du classement _bin : dans l ordre, majuscules d abord, minuscules ensuite, accentuées après, etc. _cs : «case sensitive» _ci : «case insensitive» Collation par défaut Mysql latin1_swedish_ci : collation par défaut de latin1, bien adaptée au français. latin1_german_ci : collation sensée (?) être mieux adaptée au français. Autres collations : latin1_bin, latin1_general_cs, latin1_general_ci, utf8_bin, utf8_general_ci, utf8_unicode_ci. Show collation like «latin1%» ; // collations associées au latin1. Select * from information_schema.collations; // état du dictionnaire des données Show variables like %coll% ; // état des variables d environnement Set @@collation_database="latin1_bin"; My.ini [mysql] default-collation=latin1_german_1 [mysqld] default-collation=latin1_german1_ci BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 06 - page 7/14 - Bertrand LIAUDET
5 niveaux de définition : Serveur, Client, Base, Table, Colonne Serveur et client Base Table my.ini Colonnes show variable like select @@global..character_set_database // niveau serveur select @@local..character_set_database // niveau client CREATE DATABASE nomdatabase CHARSET latin1 COLLATE latin1_german1_ci; Show create database nomdatabase; Show variable like character_set_database ; Select @@character_set_database; Show variables like collation_database ; Select @@collation_database; ALTER DATABASE nomdatabase CHARSET latin1 COLLATE latin1_bin; // attention: l alter database modifie les variable @@character_set_database et @@collation_database. Le contraire n est pas vrai. CREATE TABLE nomtable { } CHARSET latin1 COLLATE latin1_bin; // valeurs par défaut ALTER TABLE nomtable CHARSET latin1 COLLATE latin1_bin; // valeurs par défaut CREATE TABLE nomtable {, att1 varchar(50) CHARSET latin1 COLLATE latin1_bin, }; // valeur par défaut de la colonne ALTER TABLE nomtable ADD COLUMN attx varchar(50) CHARSET latin1 COLLATE latin1_bin; // valeur par défaut de la colonne SHOW FULL COLUMNS FROM nomtable ; SELECT DISTINCT CHARSET(attribute) FROM nomtable; BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 06 - page 8/14 - Bertrand LIAUDET
Conversion : CONVERT La conversion pose un problème quand un caractère du jeu de départ n a pas d équivalent dans le jeu d arrivée. Une colonne est convertie quand on change son jeu ou sa collation. Pour convertir une table il faut utiliser la fonction CONVERT Conversion niveau colonne ALTER TABLE nomtable MODIFY attx varchar(50) CHARSET latin1 COLLATE latin1_bin; // conversion de la colonne Conversion niveau table ALTER TABLE nomtable CONVERT TO CHARSET latin1 COLLATE latin1_bin ; // conversion de toutes les colonnes et des valeurs par défaut de la table. Conversion dans les SELECT Forcer la sensibilité à la casse : binary, collate SELECT * from table WHERE BINARY attribut = TOTO ; SELECT * from table WHERE attribute COLLATE latin1_bin= TOTO ; Les toto en minuscules ne rentreront pas dans le resultats. Changer de jeu de caractères SELECT WHERE CONVERT(attribut USING utf8) Changer de jeu de caractères et de collation SELECT WHERE CONVERT(attribut USING utf8) collate utf8_unicode_ci Usages Unicode niveau serveur (jeu de caractères le plus large : exemple : utf8) ISO niveau client (jeu de caractères plus restreint et mieux adapté : exemple : latin1) En latin1, la collation par défaut est : latin1_swedish_ci. Il semblerait que la collation : latin1_german1_ci soit plus adapté au français. En théorie, l utf8 n est sensible ni à la casse, ni aux accents. Pour pouvoir regrouper des mots distingués uniquement par leurs accents, on peut passer l attribut en utf8, soit au niveau du select, soit au niveau de l attribut de la table. En pratique, c est moins convaincant BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 06 - page 9/14 - Bertrand LIAUDET
SQL : CONSULTATION DE LA BD - SUITE Les requêtes SQL qu on applique sont les mêmes que celles déjà abordées dans les cours/tp précédents : Projection Restriction Tri Statistiques Jointures naturelles Les jointures naturelles fonctionnent selon le même principe que celui abordé dans le cours/tp précédent. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 06 - page 10/14 - Bertrand LIAUDET
TP N 6 : TABLES-VERBES Présentation Base : «biblio» DDL : créer la base SELECT : répondre aux questions DML : mise à jour de la BD Méthode Travail à faire Dans un fichier texte à votre nom+tp06.txt, écrire les questions et les réponses les unes à la suite des autres. Après chaque requête, on met, en commentaire, le nom de l attribut clé primaire de la table résultat Mettez le résultat obtenu dans le fichier (copier-coller). Sur papier : faire le graphe de la question. Méthode de travail A partir du fichier texte votrenomtp06.txt, faire des copier-coller dans la calculette SQL ou dans utiliser un fichier de test avec un source, et copier coller la bonne requête dans le rapport de TP. Ordre de projection des attributs Requête sans fonction de groupe Attributs de tri, Cle Primaire, Clé Significative, Attributs demandés, Attributs de restriction Requête avec fonctions de groupe Attributs de tri, attributs du group by, fonctions de groupe demandées, fonctions de groupe de restriction (du having). BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 06 - page 11/14 - Bertrand LIAUDET
Exercice 1 : DDL : Création de la BD Présentation On travaillera sur les tables suivantes : OEUVRES(NO, TITRE, AUTEUR) NO numéro de l œuvre. Clé primaire. LIVRE titre de l oeuvre AUTEUR auteur de l oeuvre ADHERENTS(NA, NOM, VILLE) NA numéro d adhérent. Clé primaire. NOM nom de l adhérent. PRENOM prénom de l adhérent. ADR adresse de l adhérent. TEL téléphone de l adhérent. LIVRES (NL, EDITEUR, #NO) NL numéro du livre. Clé primaire. EDITEUR éditeur du livre NO numéro de l oeuvre. Clé étrangère. EMPRUNTER(#NL, DATEMP, DATRETMAX, DATRET, #NA) #NL numéro de livre. Clé primaire. Clé étrangère. DATEMP date d emprunt du livre. Clé primaire. DATRETMAX date limite de retour autorisée. DATRET date de retour effectif du livre. #NA numéro d adhérent. Clé étrangère. Exercices 1. Télécharger le script de création de la BD : BiblioTP06.txt 2. Faire le graphe des tables. 3. Lancer ce script de création de la BD. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 06 - page 12/14 - Bertrand LIAUDET
Exercice 2 : SELECT : Interrogation de la BD 4. Consulter le contenu de toutes les tables. 5. Faire le produit cartésien de la table Emprunter avec la table des Livres et la table des Adhérents. Combien y a-t-il d attributs dans la table résultat. Afficher les résultats en mode «fiche» (\G). Combien y a-t-il de tuples dans la table résultat? Quelle est la Clé primaire? Refaire la question en projetant uniquement les clés primaires et significatives. Quel tri faudrait-il faire pour clarifier l interprétation des résultats? Afficher les 200 premiers. 6. Faire la jointure naturelle de la table Emprunter avec la table des Livres et la table des Adhérents. Combien y a-t-il d attributs dans la table résultat. Afficher les résultats en mode «fiche» (\G). Combien y a-t-il de tuples dans la table résultat? Quelle est la Clé primaire? Refaire la question en projetant uniquement les clés primaires et significatives. Quel tri faudrait-il faire pour clarifier l interprétation des résultats? 7. Faire la jointure naturelle de la table Emprunter avec la table des Livres, la table des Oeuvres et la table des Adhérents. Combien y a-t-il d attributs dans la table résultat. Combien y a-t-il de tuples dans la table résultat? Quelle est la Clé primaire? Refaire la question en projetant uniquement les clés primaires et significatives. Quel tri faudrait-il faire pour clarifier l interprétation des résultats? 8. Quels sont les livres actuellement empruntés? 9. Quels sont les livres empruntés par Jeannette Lecoeur? Vérifier dans la réponse qu il n y a pas d homonymes. 10. Quels sont tous les livres empruntés en août 2008. 11. Tous les adhérents qui ont emprunté un livre de Fedor Dostoievski. 12. Quels sont le ou les auteurs du titre «Voyage au bout de la nuit» 13. Quels sont les ou les éditeurs du titre «Narcisse et Goldmund» 14. Quels sont les adhérents actuellement en retard? 15. Quels sont les livres actuellement en retard? 16. Quels sont les adhérents en retard avec le nombre de livre en retard et la moyenne du nombre de jour de retard. BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 06 - page 13/14 - Bertrand LIAUDET
17. Nombre de livres empruntées par auteur. 18. Nombre de livres empruntés par éditeur. 19. Durée moyenne des emprunts rendus. On commencera par afficher les durées des emprunts rendus. 20. Durée moyenne des retards pour l ensemble des emprunts. La fonction «if» permet de tester une valeur et de renvoyer ce qu on souhaite selon la vérité ou la fausseté de la valeur testée. if(a<0, 0, a) : permet de ramener les valeurs négatives de a à 0. 21. Durée moyenne des retards parmi les seuls retardataires. Exercice 3 : DML : Mise à jour de la BD 22. La bibliothèque vient d acquérir un nouveau exemplaire de : «Au cœur des ténèbres» de Joseph Conrad, chez Gallimard. Faire la mise à jour de la BD. 23. Ecrire les commandes qui permettent de retirer tout ce que vous avez ajouté. 24. La bibliothèque vient d acquérir un nouveau livre de Hermann Hesse intitulé «Siddhartha» chez Folio. Faire la mise à jour de la BD. 25. Ecrire les commandes qui permettent de retirer tout ce que vous avez ajouté (supprimer une œuvre et les livres correspondants). 26. Un nouvel adhérent vient s inscrire : Olivier DUPOND, 76, quai de la Loire, 75019 Paris, téléphone : 0102030405 27. Martine CROZIER vient emprunter «Au cœur des ténèbres» que vous venez d ajouter et Le rouge et le noir chez Hachette, livre n 23. Faire les mises à jour de la BD. 28. M. Cyril FREDERIC ramène les livres qu il a empruntés. Faire la mise à jour de la BD. 29. M. Cyril FREDERIC essaye d emprunter le livre n 23. Que constatez vous? 30. M. Cyril FREDERIC essaye d emprunter le livre n 29. Que constatez vous? BASES DE DONNÉES - Niveau 1 - MySQL - MariaDB - Cours 06 - page 14/14 - Bertrand LIAUDET