bases de données relationnelles & sql - ephe

of 88 /88
Bases de données relationnelles & SQL Objectifs Appréhender les concepts du modèle relationnel. Etre capable de concevoir un schéma relationnel. Etre capable de créer une base de données relationnelle et d’en manipuler les données avec le langage SQL. Niveau requis Aucune connaissance préalable n’est requise. Durée 3 jours Droits d’auteur Michel GRECH

Upload: others

Post on 18-Oct-2021

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Bases de données relationnelles & SQL - EPHE

Bases de données

relationnelles

& SQL

Objectifs

Appréhender les concepts du modèle relationnel.

Etre capable de concevoir un schéma relationnel.

Etre capable de créer une base de données relationnelle et d’en manipuler les données avec le langage SQL.

Niveau requis Aucune connaissance préalable n’est requise.

Durée 3 jours

Droits d’auteur Michel GRECH

Page 2: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 2 -

SOMMAIRE

conception des bases de données relationnelles ............................................ 5

1. Introduction aux bases de données ................................................................................ 5

1.1. Architecture d’un système informatique utilisant des bases de données ........................................ 5

1.2. Les trois niveaux de description des données ................................................................................... 5

2. La conception des bases de données .............................................................................. 6

2.1. les deux étapes principales de la conception .................................................................................... 6

2.2. Objectif de la modélisation ............................................................................................................... 6

2.3. Raisonnements et démarche pour la conception des bases de données ......................................... 7

2.4. Démarche pour la conception des modèles de données .................................................................. 9

2.5. Quelques représentations intéressantes ........................................................................................ 13

2.6. Les contraintes ................................................................................................................................ 17

2.7. Exercice récapitulatif ................................................................................. Erreur ! Signet non défini.

Systèmes de gestion de bases de données .................................................... 21

1. Indépendance des niveaux physique / interne / externe ............................................. 21

2. Manipulation des données par des langages non procéduraux ................................... 22

3. Partage des données ..................................................................................................... 22

4. Sécurité des données .................................................................................................... 23

5. Principales fonctions assurées par les SGBD ................................................................. 23

Le modèle relationnel ................................................................................... 24

1. Objectifs du modèle relationnel.................................................................................... 24

2. Les concepts principaux ................................................................................................ 24

2.1. Domaine .......................................................................................................................................... 24

2.2. Relation ........................................................................................................................................... 24

2.3. Attribut ............................................................................................................................................ 25

2.4. Clefs ................................................................................................................................................. 25

2.5. Vues ................................................................................................................................................. 26

2.6. Les types de colonnes ..................................................................................................................... 26

3. Les opérateurs relationnels ........................................................................................... 28

3.1. Les opérateurs uniares .................................................................................................................... 29

3.2. Les opérateurs n-aires ..................................................................................................................... 29

3.3. Les agrégats ..................................................................................................................................... 32

4. Les contraintes .............................................................................................................. 32

Page 3: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 3 -

4.1. L’intégrité des bases de données .................................................................................................... 33

4.2. Contraintes sur une colonne ........................................................................................................... 33

4.3. Contraintes d’intégrité référentielle ............................................................................................... 35

5. Les règles de normalisation ........................................................................................... 36

5.1. Première forme normale ................................................................................................................. 36

5.2. Deuxième forme normale ............................................................................................................... 36

5.3. Troisième forme normale................................................................................................................ 36

6. Les règles de traduction modèles conceptuels de données -> schémas relationnels .. 37

6.1. Traduction des entités..................................................................................................................... 37

6.2. Traduction des associations ............................................................................................................ 37

7. Exemple récapitulatif .................................................................................................... 38

7.1. Dictionnaire des données ................................................................................................................ 38

7.2. Dictionnaire des règles .................................................................................................................... 39

7.3. Enoncé ............................................................................................................................................. 39

7.4. Solution ........................................................................................................................................... 39

SQL ............................................................................................................... 44

1. Objectifs de SQL ............................................................................................................ 44

2. Normes .......................................................................................................................... 44

3. Utilisation de SQL .......................................................................................................... 44

4. La création et la modification de schémas .................................................................... 45

4.1. Création de schéma ......................................................................................................................... 45

4.2. Création de table ............................................................................................................................. 45

4.3. Modification de table ...................................................................................................................... 46

4.4. Ajouter des contraintes ................................................................................................................... 47

4.5. Suppression de table ....................................................................................................................... 47

4.6. Création de vues.............................................................................................................................. 47

5. La mise à jour des données ........................................................................................... 48

5.1. Insertion de lignes ........................................................................................................................... 48

5.2. Modification .................................................................................................................................... 48

5.3. Suppression de lignes ...................................................................................................................... 50

6. La consultation des données ......................................................................................... 50

6.1. Forme canonique des requêtes SELECT .......................................................................................... 50

6.2. Les opérateurs : booléens, BETWEEN, LIKE… .................................................................................. 50

6.3. Utilisation de fonctions SQL ............................................................................................................ 52

6.4. Fonctions numériques ..................................................................................................................... 53

Page 4: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 4 -

6.5. Fonctions date ................................................................................................................................. 53

6.6. Les agrégats ..................................................................................................................................... 54

6.7. Les jointures .................................................................................................................................... 55

6.8. Les opérateurs ensemblistes ........................................................................................................... 56

6.9. Les sous-requêtes ............................................................................................................................ 57

7. Le contrôle des autorisations ........................................................................................ 58

7.1. Accorder une autorisation .............................................................................................................. 58

7.2. Révoquer une autorisation.............................................................................................................. 58

MySQL et PHP ............................................................................................... 59

1. MySQL – brève présentation ......................................................................................... 59

2. Utilisation de MySQL ..................................................................................................... 59

2.1. L’utilisation en mode commande .................................................................................................... 59

2.2. Utilisation via l’utilitaire PHPMYADMIN .......................................................................................... 63

2.3. Utilisation via un programme PHP .................................................................................................. 63

3. Eléments d’administration de MySQL ........................................................................... 68

3.1. Administrer comptes utilisateurs et autorisation ........................................................................... 68

3.2. Créer une base de données ............................................................................................................. 70

3.3. Afficher, insérer, modifier, supprimer des données ....................................................................... 74

3.4. Exécuter des requêtes SQL .............................................................................................................. 74

3.5. Sauvegarder, importer et exporter ................................................................................................. 75

4. Exemple récapitulatif .................................................................................................... 76

4.1. Premier exemple – recherche dans une base de données et affichage du résultat dans un

formulaire ..................................................................................................................................................... 76

4.2. Identification, authentification et ouverture d’une session ........................................................... 81

Page 5: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 5 -

CONCEPTION DES

BASES DE DONNEES

RELATIONNELLES

1. Introduction aux bases de

données

1.1. ARCHITECTURE D’UN SYSTEME INFORMATIQUE UTILISANT DES BASES DE

DONNEES

Premier composant- la base de données que l’on peut considérer en première approche comme un stock de données sur support permanent

Deuxième composant - un Système de Gestion de Base de Données (SGBD) dont la fonction est la manipulation des données de la base de façon efficace et sure : mise à jour et consultation

Troisième composant : une ou des application(s) informatiques qui constituent des interfaces entre les utilisateurs et leur logique « métier » et le SGBD

1.2. LES TROIS NIVEAUX DE DESCRIPTION DES DONNEES

Le niveau conceptuel qui s’attache à décrire (à représenter) la sémantique d’un ensemble d’objets de gestion constituant un « domaine » sans préoccupation de représentation en machine. Ce niveau sera représenté par un « modèle conceptuel des données ».

Le niveau interne (ou logique) qui représente l’implémentation du niveau conceptuel pour une classe de solutions informatiques : par exemple les Systèmes de Gestion de Bases de Données Relationnelles SGBDR. Dans le contexte d’un SGBD relationnel, ce niveau sera représenté, par exemple, par un « schéma relationnel ».

Page 6: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 6 -

Le schéma, unique, de la base de données est parfois nommé « schéma canonique » par opposition aux schémas liés aux applications.

Le niveau externe qui décrit la vision des applications (perception via les besoins utilisateurs) sur les données. Ce niveau sera lui aussi représenté par des schémas relationnels qui constitueront des « vues ».

2. La conception des bases de

données

2.1. LES DEUX ETAPES PRINCIPALES DE LA CONCEPTION

Dans le cadre des bases de données relationnelles, le résultat de l’opération de conception d’une base de données est un « modèle logique de données » ou « schéma relationnel » immédiatement implémentable avec le SGBD choisi.

L’opération de conception se déroule généralement en deux étapes de poids différents :

Une étape de modélisation sémantique des données dont le résultat est un ou plusieurs « modèles conceptuels des données « (vocabulaire Merise) ou diagrammes de classes (vocabulaire UML). Cette étape représente la plus grande part de l’effort de conception.

Une étape de traduction des modèles conceptuels des données ou diagrammes de classes en schémas relationnels.

2.2. OBJECTIF DE LA MODELISATION

D’une façon générale un modèle est la représentation d’un objet réel tel que la manipulation du modèle vaille celle de l’objet lui-même. Le modèle « simule » l’objet représenté.

Le modèle est présenté dans un formalisme adéquat.

Le modèle ne préjuge d’aucune solution d’implémentation (base de données ou autre).

La modélisation de données vise en premier lieu à « capturer » la sémantique d’objets de gestion dans un document.

Le document résultant est exprimé dans un formalisme adapté dont les principales qualités doivent être notamment :

L’expressivité : utilisation d’un nombre de signes réduit pour exprimer n’importe quelle situation

La simplicité d’interprétation pour permettre un dialogue sans ambigüité entre utilisateurs et concepteurs

Un modèle conceptuel des données ne doit pas essayer de représenter le point de vue des

applications (besoin en données) mais le point de vue sémantique d’un domaine : gestion des

Page 7: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 7 -

effectifs, manuscrits médiévaux, observatoire virtuel… Un modèle de données vise la plus grande neutralité de point de vue sur le domaine considéré.

2.3. RAISONNEMENTS ET DEMARCHE POUR LA CONCEPTION DES BASES DE

DONNEES

Les deux principaux formalismes couramment utilisés sont :

Le modèle « Entité / Association »

Le diagramme de classe UML 2

2.3.1. Le modèle « Entité / Association » Il s’agit d’un modèle graphique à base de deux objets : les entités et les associations.

2.3.1.1. Les représentations graphiques

Graphiquement, une entité est représentée par un rectangle doté de deux compartiments :

Un premier compartiment pour le titre : « Personne », « Unité »

Un second compartiment pour les propriétés de l’entité, c'est-à-dire toutes les informations pouvant lui être associées.

Une association est représentée par un rectangle aux bords arrondis. Une association peut posséder un titre (« affecté ») ainsi que des propriétés.

2.3.1.2. Sémantique

Entités

Du point de vue de la sémantique, une entité représente un objet majeur dans le domaine de l’utilisateur, c'est-à-dire d’un objet homogène et consistant et d’un objet aisément distinguable des autres objets du domaine.

Les propriétés à l’intérieur d’une entité sont fortement couplées : le numéro d’agent, le nom d’agent et la date de naissance agent sont par exemple fortement liés.

Page 8: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 8 -

Associations

Une association représente un couplage sémantique entre plusieurs objets du domaine de l’utilisateur.

Une association est le signe d’un couplage entre données mais moins fort qu’entre données appartenant à une même entité. Les données numéro agent et code unité sont couplées mais d’une façon moins forte que sont couplées les données numéro agent et nom agent.

Le titre d’une association est souvent une forme verbale.

Une association peut elle-même porter des propriétés.

La dimension d’une association est le nombre d’entités y participant.

La plupart des associations sont binaires (dimension de deux), mais on peut représenter des associations d’une dimension supérieure.

Une dimension supérieure à trois ou quatre est souvent le signe d’une erreur de représentation.

L’exemple ci-dessous présente une association de dimension trois.

L’association porte une propriété.

Une association peut être définie d’une entité sur elle-même :

Une personne est supérieure hiérarchique d’une autre

Un mot clef peut être synonyme (ou antonyme ou dérivé…) d’un autre

Plusieurs associations peuvent être définies entre deux mêmes entités

Page 9: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 9 -

2.3.1.3. Les cardinalités

Chaque « patte » d’association est qualifiée par un couple de cardinalité mesurant une sorte d’intensité de participation d’une entité à une association.

Le couple de cardinalité est un couple d’entier : (cardinalité minimum, cardinalité maximum).

Par exemple : une personne est affectée au minimum à aucune unité et au maximum à une unité. Le couple de cardinalité est : (0, 1).

Les cardinalités minimum sont 0 ou 1

Les cardinalités maximum sont 1 ou n

Les cardinalités sont l’indication de contraintes sur la participation d’une entité à une assocation.

Ces contraintes sont indiquées pour la participation minimum : 0 (pas de contrainte) et 1 (contrainte) et pour la cardinalité maximum : 1 (contrainte) et n (pas de contrainte).

2.3.1.4. Les identifiants

Une des règles essentielles liées à la construction des modèles est la garantie d’absence de doublons d’occurrences d’entités.

L’identifiant d’une entité est une propriété ou la combinaison minimum de propriétés nécessaire pour distinguer deux occurrences d’une entité.

Plusieurs propriétés ou combinaisons de propriétés peuvent parfois jouer le rôle d’identifiant, il importe de choisir parmi les identifiants potentiels celui qui jouera ce rôle.

Un identifiant peut être « relatif », c'est-à-dire qu’il n’identifie une entité que dans le contexte de la participation de celle-ci à une association.

Dans l’exemple ci-dessous une classe est identifiée par un numéro de classe (par exemple A2) et par un niveau (par exemple 6ème). L’identifiant complet de Classe est donc la combinaison de numéro de classe et de niveau, numéro de classe étant un identifiant relatif.

2.3.1.5. Identifiant d’une association

L’identifiant d’une association est constitué de la collection des identifiants des entités participant à l’association.

Dans l’exemple cité plus haut et concernant les Personnages, les Textes et les Rôles, l’identifiant de l’association « intervient » est constitué de la collection des identifiants de Personne, de Rôle et de Texte.

2.4. DEMARCHE POUR LA CONCEPTION DES MODELES DE DONNEES

Page 10: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 10 -

2.4.1. Première étape : préparation du projet Les deux tâches préalables à mener au minimum sont les suivantes :

Mener l’étude d’opportunité

Délimiter le domaine

2.4.2. Deuxième étape : établissement du dictionnaire des données et du dictionnaire des règles

Un dictionnaire des données est un document à deux colonnes :

Nom de la donnée

Signification de la donnée

Le dictionnaire des données se construit après avoir délimité précisément le domaine.

2.4.2.1. Dresser la liste des données

La première étape de constitution du domaine consiste en un relevé systématique de toutes les informations du domaine jugées « pertinentes ».

Ce travail s’appuie principalement sur le dépouillement de documents existants (documents écrits, écrans d’applications…)

La principale préoccupation est de dresser un relevé complet.

A l’issue de cette première étape, on dispose d’une liste « brute » d’informations.

2.4.2.2. Epurer la liste des données

La deuxième étape vise à épurer la liste obtenue en la débarrassant :

Des informations calculées

Des synonymes

Des polysèmes

Les informations calculées ne seront pas stockées dans la future base de données pour deux raisons :

Si des résultats de calcul étaient stockés, ils deviendraient faux dès qu’un des opérandes changerait de valeur

Les résultats peuvent être recalculés à tout instant

La suppression des synonymes et des polysèmes permet de lever toutes les ambigüités de représentation des informations et d’interprétation de leur restitution.

2.4.2.3. Dictionnaire des règles

Le dictionnaire des règles consigne l’énoncé des principales règles de gestion dans le but de déterminer comment associer les données entre elles (soit en les regroupant au sein d’une même entité, soit en associant des entités).

Page 11: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 11 -

2.4.3. Troisième étape : ébaucher le modèle de données Il n’est en général pas très difficile de produire une première ébauche de modèle de données.

Une démarche possible est la suivante :

1) Identifier les principaux objets du domaine de gestion concerné

2) Dessiner les entités (au moins les entités majeures)

3) Dessiner les associations en s’appuyant sur le dictionnaire des règles

4) Préciser les cardinalités

5) Choisir les identifiants

2.4.4. Quatrième étape : supprimer les redondances et les multivaluations Le premier objectif d’un modèle est de « capturer » la sémantique d’un domaine.

Un autre objectif essentiel d’un modèle est d’éviter les anomalies de représentation et de cohérence liées à :

La redondance de certaines informations

Au caractère multivalué de certaines propriétés

La redondance des informations est une des principales sources d’incohérence des bases de données.

Si une même valeur doit être répétée plusieurs fois (une orthographe de pays par exemple), elle risque de ne pas l’être d’une façon identique ce qui rendrait impossible toute recherche sur la propriété concernée (le pays par exemple)

En cas de mise à jour, il n’est pas garanti que toutes les occurrences de la valeur soit bien mises à jour (le Zaïre devient le congo…)

Le problème de la redondance d’une propriété est entièrement résolu par la création d’une nouvelle entité de type référentiel.

Exemple

Dans cette entité, la propriété grade est redondante.

La solution est :

Page 12: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 12 -

La multivaluation des informations, classique dans les bases de données réalisées sans méthode, entraine une mauvaise représentation des données et un futur accès malaisé à celles-ci. Par exemple, si une entreprise implantée sur plusieurs sites était représentée sous la forme : entreprise, site 1, site 2, site 3…

Il faudrait pour bien faire pouvoir prévoir le nombre maximum de sites,

La majorité des entreprises auraient des propriétés vides

Pour rechercher toutes les entreprises implantées sur un site donné, il faudrait écrire une requête du type : Site = site 1 ou Site = site 2….

Le problème de la multivaluation est entièrement résolu par la création d’une nouvelle entité.

Exemple

Cette entité possède en fait une propriété ville multivaluée.

Le fait qu’une unité soit implantée dans 4 ou 5 villes ne pourrait être représenté.

La solution est la suivante :

La modélisation et surtout la génération de la base de données sont grandement facilitées par

l’utilisation d’un AGL, si possible libre, comme DBDesigner (v4).

Page 13: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 13 -

2.5. QUELQUES REPRESENTATIONS INTERESSANTES

2.5.1. Les associations réflexives

Cette modélisation permet d’exprimer qu’une entité est associée à elle-même.

Peuvent être traitées de cette façon les associations exprimant une hiérarchie entre occurrences d’une entité.

Dans l’exemple ci-dessous, on modélise un organigramme hiérarchique. L’association n’est pas symétrique, le « rôle » de chacune des pattes de l’association doit être précisé : « est le » et « a pour ».

Peuvent également être traitées les associations exprimant une équivalence entre occurrences d’une entité.

Dans l’exemple ci-dessous, les deux associations sont symétriques, il n’est pas nécessaire de préciser le « rôle » de chacune des pattes de l’association.

Page 14: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 14 -

2.5.2. Généralisation / spécialisation

Une difficulté récurrente de la modélisation est de choisir entre représenter des objets comme étant des objets différents ou comme étant un seul objet.

Le mécanisme dit de « généralisation / spécialisation » appuyé sur le concept d’héritage permet de faire coexister les deux points de vue.

Cette modélisation permet d’exprimer que :

Des entités sont traitées de la même façon (un agent titulaire, un CDD, un thésard sont tous trois collaborateurs d’une unité de recherche).

Les mêmes entités sont traitées différemment (un agent titulaire, un CDD, un thésard n’ont pas toutes leurs propriétés en commun).

Page 15: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 15 -

2.5.3. Les historiques

En cas de modification d’une occurrence d’association, on peut souhaiter conserver l’ancienne valeur. On ajoute alors la nouvelle valeur aux anciennes plutôt que de remplacer la dernière valeur par la nouvelle.

Si la cardinalité maximum était de 1, elle est alors de n.

La modélisation ci-dessous permet de conserver l’historique des nominations des personnes à des grades successifs.

L’identifiant de l’association possèdeGrade est constitué par le couple des identifiants des entités associées, soit(numeroPersonne, CodeGrade).

Il sera impossible d’enregistrer deux fois la même occurrence d’association (Personne, Grade) ce qui convient bien car il est impossible d’être nommé deux fois au même grade dans la carrière d’une personne.

Dans l’exemple ci-dessous, l’association est de dimension 3 et son identifiant est (numeroPersonne, codeSite, Date).

En effet, il doit être possible d’enregistrer deux affectations successives d’une même personne à une même unité, l’identifiant ne peut par conséquent être limité au couple (numeroPersonne, codeSite) et doit contenir un troisième élément quel qu’il soit (date est le plus courant).

Page 16: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 16 -

La date est placée dans une entité (pseudo entité) Date et n’est pas considérée comme une

propriété de l’association affecté pour que l’on puisse distinguer deux affectations successives d’un agent à une même unité.

2.5.4. La méta modélisation

Cette modélisation permet, en introduisant un degré d’abstraction supplémentaire, de représenter de façon commune un grand nombre d’entités qu’il serait peu pratique de considérer comme étant tout à fait différentes.

On souhaite modéliser les équipements installés sur les carrefours à feu d’un département.

Dans le but de pouvoir assurer la maintenance de ces équipements et de pouvoir éditer des statistiques périodiques, les caractéristiques techniques des équipements doivent être décrites.

Les équipements sont très divers : poteaux, lampes, radars, boucles enterrées, modems, pilotes d’armoires à feu… et leurs caractéristiques très différentes.

Une première modélisation « naïve » donnerait ceci (on ne tient pas compte des propriétés redondantes) :

Page 17: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 17 -

2.6. LES CONTRAINTES

D’une façon générale, la qualité des données dans un système d’information, automatisé ou non, dépend de la bonne structuration de celles-ci et aussi pour une part importante du respect d’un certain nombre de contraintes de gestion de celles-ci.

La qualité des données contenues dans une base de données dépendra donc en grande partie du soin apporté identifier ces contraintes, les exprimer et les implémenter dans la base.

Les contraintes peuvent être exprimées :

Soit dans le modèle (conceptuel) des données

Soit dans le schéma relationnel

Soit lors de l’implémentation du schéma relationnel.

Il est notamment possible d’exprimer un certain nombre de contraintes sémantiques dans un modèle de données, même s’il n’existe pas de langage approprié et complet pour le faire :

Soit sous forme purement textuel (essentiellement)

Soit sous forme normalisée

2.6.1. Les contraintes concernant les propriétés

2.6.1.1. Contrainte d’existence

Cette contrainte exprime le fait qu’une propriété possède nécessairement une valeur.

2.6.1.2. Contrainte d’unicité

Cette contrainte exprime le fait qu’une propriété ne peut posséder deux fois une même valeur.

Page 18: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 18 -

2.6.1.3. Contrainte d’identifiant

Une contrainte d’identifiant est la combinaison d’une contrainte d’existence et d’une contrainte d’unicité.

2.6.1.4. Contrainte de type

Cette contrainte exprime le fait qu’une propriété appartient à un des types suivants : texte (ou caractère ou alphanumérique), numérique, date…

Si la propriété est de type texte, on peut spécifier s’il s’agit d’une propriété dont la longueur (nombre de caractères) est fixe ou variable et indiquer une longueur qui sera soit une longueur exacte, soit une longueur maximum).

2.6.1.5. Contrainte de valeur

Les contraintes de valeurs peuvent s’exprimer de plusieurs façons :

Par encadrement : valeur minimale et valeur maximale

En définissant un domaine de valeur.

Dans l’exemple ci-dessous, on définit un domaine de valeurs pour la propriété quotitePersonne, stipulant que cette propriété ne peut prendre qu’une parmi les valeurs suivantes : 50, 60, 70, 80, 90, 100.

Si le domaine contient plus de quelques valeurs (une dizaine), on préfèrera construire une

entité.

2.6.1.6. Contrainte de stabilité

Cette contrainte exprime le fait que la valeur d’une propriété ne change pas dans le temps.

Les propriétés identifiables possèdent en général des valeurs stables.

Page 19: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 19 -

2.6.2. Contraintes d’intégrité référentielle La contrainte d’intégrité référentielle entre deux entités stipule que si une occurrence de la première entité est associée à une occurrence de la deuxième entité, la modification ou la suppression de cette dernière ne doit pas entrainer la survenue d’une association « vide ».

Par exemple, si plusieurs personnes sont affectées à un site, il doit être impossible de supprimer le site sans soit « recaser » les personnes dans un site existant, soit supprimer les personnes concernées (ceci n’est qu’un point de vue informatique).

Il y a contrainte d’intégrité référentielle pour chacune des associations.

Cette question est traitée plus en détail au chapitre consacré au modèle relationnel.

2.6.3. Contraintes sur les pattes d’associations Une patte d’association peut être « verrouillée », c'est-à-dire que les associations entre les occurrences de deux entités ne peuvent être mises à jour, c'est-à-dire ni modifiées ni supprimées.

Dans l’exemple ci-dessous, on exprime que si un règlement est noté comme effectué par une société, cette information ne peut pas être modifiée ni supprimée.

2.6.4. Les contraintes entre associations De même qu’il est possible d’exprimer des contraintes afférentes à des propriétés d’entités, il est possible d’exprimer des contraintes entre associations.

Les contraintes entre association peuvent décrire une des situations suivantes :

Aucune contrainte (c’est le cas général)

Partition (Totalité et Exclusion) : XT

Totalité sans Exclusion : T

Pas de totalité et Exclusion : X

Inclusion : I

)

Dans l’exemple ci-dessous, on exprime le fait que l’on ne peut être à la fois propriétaire et locataire d’une même habitation.

On peut en revanche occuper une autre position vis-à-vis de son habitation (« hébergé à titre gratuite »…). Il y a donc une contrainte d’exclusion mais pas de totalité.

Page 20: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 20 -

Dans l’exemple ci-dessous, on exprime le fait qu’un règlement peut s’opérer soit (exclusif) en espèces, en chèque ou en carte bancaire. Il y a donc une double contrainte : de totalité (pas d’autre modalité de règlement) et d’exclusion (un règlement ne peut s’opérer en espèces et en chèque). La contrainte est de type « X » et « T », il s’agit d’une contrainte de partition.

Ce modèle n’est donné qu’au titre d’exemple pédagogique. En réalité, une représentation de

type « généralisation / spécialisation » (voir plus haut) aurait été préférable.

Dans l’exemple ci-dessous, on exprime le fait que le responsable d’une unité est nécessairement affecté à l’unité. Le « I » désigne une inclusion.

Page 21: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 21 -

SYSTEMES DE

GESTION DE BASES

DE DONNEES

Le terme « base de données » est lié à la notion de « persistance des données ».

Une donnée est dite « persistante » si sa durée de vie excède la durée d’exécution du programme qui l’a créée. Une donnée persistante peut être rechargée en mémoire principale à tout instant.

En pratique la persistance de données est assurée par leur stockage sur un support permanent (disque…).

De ce point de vue, le terme de base de données mérite précision.

Deux acceptions peuvent être proposées :

Une acception générale : une base de données est un ensemble de données électroniques stockées sur support permanent

Une acception plus restrictive : une base de données est un ensemble de données électroniques stockées sur support permanent et manipulées par un logiciel spécialisé : un Système de Gestion de Base de Données Les Systèmes de Gestion de Base de Données imposent un certain nombre de règles de structuration des données, notamment des règles de représentation sous forme tabulaire, règles de non redondance, de non répétitivité....

1. Indépendance des niveaux

physique / interne / externe

Le niveau physique désigne le mode de stockage matériel des données sur mémoire permanente : types de fichiers, méthodes d’accès, modes de placement, procédés de chainage…, les données d’une base de données étant , comme toutes les données informatiques stockées dans des fichiers organisés suivant des modalités de placement, d’accès…

Le niveau logique désigne une perception des données sous forme tabulaire exprimant la sémantique des informations du domaine couvert par la base de données.

La fourniture d’une vision « logique » ou « niveau logique » des données permet de masquer totalement les détails de stockage physique des données : noms et emplacements des fichiers,

Page 22: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 22 -

organisation des fichiers : méthodes de placement, méthodes d’accès… et présente les données comme étant organisées en tables.

Il est ainsi possible qu’une modification de l’organisation physique des données, dans le but d’optimiser l’occupation mémoire ou les temps d’accès aux données, n’ait aucune incidence sur le niveau physique.

Réciproquement, il est également possible qu’une modification du schéma logique consécutif au changement d’une règle de gestion n’ait aucune d’incidence sur l’organisation physique des fichiers de stockage.

Le niveau externe désigne le niveau des applications, c'est-à-dire la vision particulière des applications sur le schéma canonique de la base. Un schéma externe est obtenu par un réarrangement des données du schéma interne, quitte à introduire des synonymes, un certain niveau de redondance…

Grâce aux mécanismes de production de schémas externes, il est possible qu’une modification applicative laisse inchangés les autres schémas externes et le schéma interne (ou presque).

Il faut bien comprendre qu’une base de données ne doit pas être liée à une utilisation

particulière des données, c'est-à-dire à une application. Une base de données organise les données suivant leur sémantique sous forme d’un schéma « canonique » auquel les applications viendront s’alimenter.

2. Manipulation des données par

des langages non procéduraux

L’accès aux données à une base de données doit pouvoir s’effectuer d’une façon totalement indépendante des structures de stockage physique (organisation en fichiers).

L’accès aux données doit pouvoir être réalisé en formant des prédicats sur la valeur des données contenues dans la base.

Les langages de manipulation doivent être relativement proches du langage naturel.

Ces langages doivent pouvoir être utilisés aussi bien en mode intercatif qu’intégré à des programmes procéduraux.

3. Partage des données

Un des objectifs majeurs des SGBD est de permettre le partage des données contenues entre plusieurs utilisateurs, plusieurs applications successivement et simultanément. Tout doit se passer comme si chaque utilisateur, chaque application était seul à utiliser (consultation et mise à jour de la base).

Page 23: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 23 -

4. Sécurité des données

La sécurité des données doit être envisagée sous deux aspects :

La protection contre les accès non autorisés est assurée par des mécanismes d’attribution explicite d’autorisations (lecture, écriture…) à des d’utilisateurs identifiés sur certains objets de la base.

La tolérance aux pannes

La tolérance aux pannes est assurée par un certain nombre de mécanismes tels que la restauration de données sauvegardées, journalisation des transactions, reprise à chaud, à froid

5. Principales fonctions assurées

par les SGBD

Les principales fonctions d’un SGBD peuvent être présentées de façon synthétique :

La définition des schémas

La recherche de données

La mise à jour des données

La transformation des données (schémas externes)

Le contrôle de l’intégrité des données

La gestion de la sécurité

Page 24: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 24 -

LE MODELE

RELATIONNEL

1. Objectifs du modèle relationnel

Le « modèle relationnel » est un ensemble de concepts et de règles de structuration de données, essentiellement alphanumériques, sous forme tabulaire.

Ces règles, énoncées par CODD au début des années 70, associées à un langage de requête basé sur des prédicats en logique du premier ordre (des énoncés sur les données) visent à représenter de façon assez simple la sémantique d’objets de gestion tout en évitant les anomalies de mise à jour.

2. Les concepts principaux

2.1. DOMAINE

Un domaine est un ensemble de valeurs (essentiellement alphanumériques). Comme en théorie des ensembles, un domaine peut être défini « en compréhension » et / ou « en extension ».

Le plus souvent un domaine est défini par un type de données : numérique (entier, réel, caractère, date…) et par des valeurs.

Exemple :

Domaine (noms de personnes) : {DUPONT, DUPOND, DURAND, DURANT}

Domaine (prénoms de personnes) : {Emile, Berthe, Joseph, Amélie}

Domaine (années de naissances de personnes) : {1923, 1920, 1937, 2005}

Les domaines sont caractérisés par un nom : nom de personne, prénom de personne…

2.2. RELATION

Une relation est un sous-ensemble du produit cartésien de plusieurs domaines.

Exemple :

Page 25: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 25 -

Relation Personne : {(DUPONT, Emile, 1923), (DUPOND, Berthe, 1920), (DURAND, Joseph, 1937), (DURANT, Amélie, 2005)}

Une relation est donc composée de vecteurs.

Le terme consacré est celui de tuples .

D’une façon moins savante et plus courante, on parle :

De table plutôt que de relation

De ligne plutôt que de tuple

2.3. ATTRIBUT

Un attribut est une colonne d’une relation.

Le nom d’une colonne doit être évocateur de sa sémantique.

Le nom d’une colonne peut obéir à des restrictions de caractères et à une convention de nommage.

2.4. CLEFS

2.4.1. Clefs primaires Le concept de clef primaire est équivalent à celui d’identifiant conceptuel.

Les qualités d’une clef primaire sont les suivantes :

Valeur obligatoire et unicité par définition

Stabilité de valeur dans le temps

Compacité : les clefs primaires étant utilisées pour rapprocher des tables en consultation (jointures), plus les clefs sont compactes et de petite taille, plus les temps de traitement seront courts.

Une clef primaire est soit une des propriétés (ou une collection des propriétés) de la table, soit un élément artificiel (numéro d’ordre).

En pratique, l’exigence de stabilité de valeur dans le temps interdit l’utilisation d’une propriété significative et entraine l’utilisation systématique d’un numéro d’ordre (un entier autoincrémenté).

2.4.2. Clefs étrangères Une clef étrangère est la duplication de la clef primaire d’une table dans une autre table dans le but de traduire une association conceptuelle entre les deux entités représentées par les deux tables.

Le concept de clef étrangère est un des concepts majeurs du modèle relationnel.

Page 26: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 26 -

2.5. VUES

Une vue est un assemblage des données du schéma d’une base de données (appelé souvent « schéma canonique) visant à satisfaire les besoins d’une application en informations.

Dit autrement, un ensemble de vues liées à une application constitue un « sous schéma » relationnel, déduit du schéma de la base de données et représentant le « point de vue » de cette application sur l’ensemble des données.

Le schéma constitué des vues liées à une application peut différer sensiblement du schéma canonique :

Les vues peuvent être construites par projection (seulement certaines colonnes) et par restriction (seulement certaines lignes) des tables de base.

Les colonnes peuvent ne pas être nommées de la même façon

Des données réparties entre plusieurs tables dans le schéma canonique peuvent être assemblées en une seule vue

Les règles de structuration du modèle canonique peuvent ne pas être respectées dans les vues qui ne sont en définitive qu’une présentation des tables de base (qui doivent respecter les règles d’intégrité).

Les principaux intérêts de ce mécanisme sont :

La possibilité de masquer la complexité du schéma canonique aux applications

L’apport d’un haut niveau d’indépendance schéma canonique / vues : une modification du schéma interne n’entraine pas de changements profonds des applications et réciproquement, un changement applicatif n’entraine pas nécessairement une modification profonde du schéma canonique.

2.6. LES TYPES DE COLONNES

Pour des motifs de représentation des données en mémoire, il est indispensable de décrire chacune des colonnes d’une base de données par un type prédéfini.

Ces types sont alphanumériques ou binaires.

Aucun SGBD ne respectant scrupuleusement les normes SQL, il convient de s’intéresser aux idiomes de chacun de ceux-ci.

Les types principaux sont les suivants :

Chaines de caractères

Types numériques

Types temporels

Types binaires

Page 27: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 27 -

2.6.1. Types chaines de caractères Une colonne de type chaine de caractères permet de stocker des caractères sous forme d’un octet (ASCII ou codes ISO 88-59-n) ou de plusieurs octets (UNICODE dans ses implémentations UTF-8 ou UTF-16 notamment).

Les principaux types chaines de caractères sont les suivants :

CHAR(n) : chaîne de longueur fixe n et d’une longueur maximum de 255 caractères. Une option permet de préciser le jeu de caractères : binaire, ASCII, UNICODE. Si le nombre de caractères effectif est inférieur à la taille fixée, ceux-ci seront complétés par des caractères « blancs » (par exemple des espaces) non restitués par les extractions.

VARCHAR(n) : chaîne de longueur variable de maximum n caractères (jusqu’à 65 535 caractères dans MySQL). Les caractères sont codés en UNICODE.

D’autres types permettent de stocker des caractères sur une taille plus importante : TEXT (n) jusqu’à 65 535 caractères pour MySQL), MEDIUMTEXT(n) : 16 MO, LONGTEXT(n) : 4,29 GO.

2.6.2. Types numériques Les deux types principaux sont :

Le type entier qui se subdivise généralement lui-même en sous types :

SMALLINT – entier non signé sur 2 octets

MEDIUMINT (pas dans la norme SQL, utilisable avec MySQL) – entier signé sur 3 octets

INTEGER – entier signé sur 4 octets

BIGINT (pas dans la norme SQL, utilisable avec MySQL) – entier signé sur 8 octets

Le type réel qui se subdivise généralement lui-même en sous types :

FLOAT – réel entre 4 et 8 octets – précision simple (7 décimales)

DOUBLE – réel sur 8 octets - précision double (15 décimales)

2.6.3. Types temporels Les principaux types temporels sont :

DATE - sur 3 octets stocke les dates comprises entre 1er janvier de l’an 1 000 jusqu’au 31 décembre 999. Le format est ‘YYYY-MM-DD’ (MySQL)

DATETIME – sur 8 octets – date et heure (MySQL)

TIME – sur 3 octets – stocke les heures de – 839 heures 59 minutes et 59 secondes à + 839 heures 59 minutes et 59 secondes (MySQL)

TIMESTAMP : sur 4 octets – instants écoulés du 1er janvier 1970 à 0h 0m jusqu’à l’année 2037. Mise à jour à chaque modification de la table (MySQL)

2.6.4. Types binaires Les colonnes binaires contiennent des chaînes de bits, sans référence à un jeu de caractères.

Peuvent être stockés dans une colonne de ce type des éléments multimédia, des applications…

Le type BLOB permet de stocker jusqu’à 65 535 octets (MySQL)

Page 28: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 28 -

Le type MEDIUMBLOB (n) permet de stocker jusqu’à 16 MO (MySQL)

Le type LONGBLOB (n) permet de stocker jusqu’à 4,29 GO (MySQL)

3. Les opérateurs relationnels

Les SGBDR fournissent un ensemble d’opérateurs dits relationnels dont les opérandes sont des relations (des tables) et les résultats des relations (des tables).

Les opérateurs relationnels peuvent être classés en deux catégories :

Les opérateurs « unaires » qui n’utilisent qu’un opérande

Les opérateurs « n-aires » qui utilisent plusieurs opérandes

Le modèle de référence permettant de présenter les opérateurs relationnels est le suivant :

Table Personne (nom, prénom, date de naissance, quotité, code établissement)

Table Etablissement (code établissement, nom établissement, adresse établissement)Les opérateurs unaires

Personne

nom prénom date de naissance

quotité code établissement

MARTIN ALBERT 1950-11-01 80 2

DUPOND MARCEL 1978-10-12 100 1

DURAND ADOLPHE 1968-08-13 100 1

DUPUY ELIANE 1965-12-12 80 2

DUPONT ARMELLE 1985-04-05 100 1

EPICURE DANTE 1985-12-25 50

Etablissement

Code établissement Nom établissement Adresse établissement

1 BEAU CAMPUS 12 rue de la recherche

2 CHEZ GERMAINE 33 rue des fayots

3 LE BON COIN 6 rue Cartier Bresson

Page 29: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 29 -

3.1. LES OPERATEURS UNAIRES

3.1.1. La projection Créé à partir d’une première table une deuxième table contenant les colonnes spécifiées de la première table.

Exemple

Projection Personne (nom, quotité)

nom quotité

MARTIN 80

DUPOND 100

DURAND 100

DUPUY 80

DUPONT 100

EPICURE 50

3.1.2. La restriction Créé à partir d’une première table une deuxième table contenant les lignes spécifiées par un prédicat (vérifiant une condition).

Exemple

Restriction Personne (quotité <100)

nom prénom date de naissance

quotité code établissement

MARTIN ALBERT 01/01/1950 80 2

DUPUY ELIANE 12/12/1965 80 2

EPICURE DANTE 25/12/1955 50

3.2. LES OPERATEURS N-AIRES

3.2.1. La jointure Création d’une table en associant deux tables sur une condition d’égalité de valeurs entre une colonne de la première table et une colonne de la deuxième table.

Page 30: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 30 -

Exemple

Join (Personne, Etablissement (Personne.code établissement = Etablissement.code établissement))

La jointure peut être :

Interne (ou naturelle) : la table résultat est composée des lignes de Personnes et des lignes de Etablissement pour lesquelles l’égalité est vérifiée.

Externe (gauche ou droite) : le résultat est celui de la jointure interne auquel sont ajoutées soit les lignes de la table Personne sans correspondance dans Etablissement, soit les lignes de la table Etablissement sans correspondance dans la table Personne.

Jointure interne

nom prénom date de naissance

quotité Code établissement

Code établissement.

Nom établissement

Adresse établisse

ment

MARTIN ALBERT 01/01/1950

80 2 2 CHEZ GERMAINE

33 rue des fayots

DUPOND MARCEL 12/10/1978

100 1 1 BEAU CAMPUS 12 rue de la recherche

DURAND ADOLPHE 13/08/1968

100 1 1 BEAU CAMPUS 12 rue de la recherche

DUPUY ELIANE 12/12/1965

80 2 2 CHEZ GERMAINE

33 rue des fayots

DUPONT ARMELLE 05/04/1985

100 1 1 BEAU CAMPUS 12 rue de la

recherche

3.2.2. L’union Création d’une table contenant les lignes présentes dans au moins une table parmi deux, les deux tables ayant même schéma.

Exemple

Soit la table Worker (last name, first name)

Last name First name

SMITH JOHN

DUPUY ELIANE

KRUGER HANS

EPICURE DANTE

Page 31: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 31 -

Personne(nom, prénom) UNION Worker (last name, first name)

nom prénom

MARTIN ALBERT

DUPOND MARCEL

DURAND ADOLPHE

DUPUY ELIANE

DUPONT ARMELLE

EPICURE DANTE

SMITH JOHN

KRUGER HANS

Le résultat est compose des colonnes nom et prénom et des lignes présentes dans au moins une des deux table.

En général, l’opération d’union s’effectue sur deux projections.

3.2.3. L’intersection Création d’une table contenant les lignes présentes dans deux tables ayant mêmesschéma.

Exemple

Soit la table Worker (last name, first name)

Personne(nom, prénom) INTERSECT Worker (last name, first name)

nom prénom

DUPUY ELIANE

EPICURE DANTE

Le résultat est compose des colonnes nom et prénom et des lignes présentes dans les deux tables (nom = last name et prénom = first name).

En général, l’opération d’intersection s’effectue sur deux projections.

3.2.4. La différence Création d’une table contenant les lignes présentes dans une table parmi deux mais pas dans la seconde, les deux tables ayant même schéma.

Page 32: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 32 -

Exemple

Soit la table Worker (last name, first name)

Personne(nom, prénom) MINUS Worker (last name, first name)

nom prénom

MARTIN ALBERT

DUPOND MARCEL

DURAND ADOLPHE

DUPONT ARMELLE

Le résultat est composé des colonnes nom et prénom et des lignes présentes dans la table Personne et pas dans la table Worker.

En général, l’opération différence s’effectue sur deux projections.

3.3. LES AGREGATS

Création d’une table par « agrégation » des lignes de la table sur les valeurs d’une colonne.

La fonction d’agrégat s’utilise généralement avec une fonction de synthèse : somme, compte, moyenne…

Exemple

Agrégat (Personne, quotité, nombre (personnes))

quotité Nombre personnes

50 1

80 2

100 3

4. Les contraintes

Cette question a été traitée en partie dans les chapitres consacrés aux modèles conceptuels des données.

La qualité des données stockées dans une base de données est étroitement liée au respect des règles de gestion par celles-ci représentées par des contraintes déclarées par le concepteur et prises en charge par le SGBD lui-même ou par des procédures ad hoc (triggers et procédures stockées).

Les contraintes présentées ci-dessous doivent être associées aux descriptions de table afin d’être prise en charge par le SGBD plutôt que par des programmes ad hoc.

Page 33: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 33 -

4.1. L’INTEGRITE DES BASES DE DONNEES

Une base de données est dite intègre si les données contenues respectent l’ensemble des règles de gestion régissant les valeurs de celles-ci ainsi que leurs associations.

Une opération de mise à jour doit prendre la base dans un état d’intégrité 1 et la rendre dans un état d’intégrité 2.

4.2. CONTRAINTES SUR UNE COLONNE

4.2.1. Contrainte d’existence La colonne doit posséder une valeur.

Cette contrainte s’implémente de la façon suivante :

Colonne NOT NULL

Cette contrainte est notamment utilisée sur les clefs étrangères implémentant une patte d’association dont la cardinalité minimum est de 1.

4.2.2. Contrainte d’unicité La colonne ne doit pas contenir deux fois la même valeur.

Cette contrainte s’implémente de la façon suivante :

UNIQUE (colonne1, colonne2…)

4.2.3. Contrainte de clef primaire Cette contrainte s’implémente de la façon suivante :

Colonne … PRIMARY KEY

Ou :

PRIMARY KEY (colonne)

Page 34: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 34 -

4.2.4. Contraintes de domaine La colonne obéit à certaines restrictions de valeurs : plage de valeurs….

Cette contrainte s’implémente avec la clause CHECK

Cette contrainte s’implémente de la façon suivante :

CHECK (condition de validité)

La clause CHECK peut indiquer par exemple une valeur numérique minimale et maximale

Colonne CHECK (Colonne > 0 AND Colonne <1000

Ou :

Colonne CHECK (VALUE > 0 AND VALUE <1000)

VALUE peut être utilisée à la place du nom de la colonne lorsqu’il n’y a pas d’ambiguïté (lorsque la contrainte ne porte que sur la colonne en cours de déclaration.

La clause CHECK peut indiquer par exemple un domaine

Colonne CHECK (VALUE IN(50,60,70,80,90,100))

Il est possible de déclarer une contrainte plus générale, portant sur plusieurs colonnes, avec la clause CHECK à condition de créer une contrainte nommée à l’aide de la déclaration CONSTRAINT.

CONSTRAINT nom contrainte CHECK (…)

La clause CHECK permet d’utiliser:

les opérateurs booléens AND, OR, NOT

les opérateurs arithmétiques +, -, *, /

les opérateurs de comparaison >, < >=, <=

le marqueur NULL

des expressions SQL : BETWEEN, IN…

Tous les SGBD n’implémentent pas la clause CHECK. En particulier, la version 5.1 de MySQL

permet de déclarer ce type de contraintes mais celles-ci ne sont pas opérationnelles.

4.2.5. Contrainte de stabilité La valeur affectée à une colonne ne peut être mise à jour.

Page 35: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 35 -

4.3. CONTRAINTES D’INTEGRITE REFERENTIELLE

Cette contrainte concerne la valeur des clefs étrangères qui doivent être présentes dans les colonnes clefs primaires qu’elles réfèrent.

Soit les deux relations :

Personne (idPersonne, nomPersonne, idUnité)

Unité (idUnité, codeUnité, titreUnité)

Par exemple : une personne ne peut être affectée à un service que dans la mesure où celui-ci existe.

Il existe une contrainte d’intégrité référentielle entre la clef étrangère idUnité dans la relation Personne et la clef primaire idUnité de la table Unité : toutes les valeurs de idUnité dans la relation Personne doivent exister dans idUnité de la table Unité.

Toutes les clefs étrangères sont concernées par cette contrainte.

La contrainte d’intégrité référentielle doit être examinée vis-à-vis des trois opération de mise à jour des données :

L’insertion

La modification

La suppression

La question est triviale vis-à-vis de l’insertion : l’intégrité référentielle est assimilée à une contrainte de domaine : la valeur d’une clef étrangère doit être prise dans la liste des valeurs d’une clef primaire référencée.

La syntaxe normalisée pour implémenter une contrainte d’intégrité référentielle entre une clef étrangère et une clef primaire est :

FOREIGN KEY(colonne clef étrangère)

REFERENCES Table(colonne clef primaire)

Vis-à-vis des opérations de modification et de suppression, deux options sont possibles :

Empêcher l’opération de modification ou de suppression d’une valeur de clef primaire si celle-ci est utilisée par une clef étrangère : interdiction de modifier le code d’un site ou de supprimer un site auquel sont affectés des personnes. La syntaxe normalisée est : ON UPDATE NO ACTION et ON DELETE NO ACTION.

Propager la modification ou la suppression d’une clef primaire dans la table contenant une clef étrangère référençant cette même clef primaire : si l’on modifie la clef primaire d’une table site (ce qui ne devrait jamais se produire), on modifie automatiquement les valeurs correspondantes de clefs étrangères utilisées pour décrire les affectations ; si l’on supprime un site, on supprime également toutes les affectations à ce site. La syntaxe normalisée est : ON UPDATE CASCADE et ON DELETE CASCADE.

Page 36: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 36 -

5. Les règles de normalisation

Les règles de normalisation sont des règles applicables à la structuration d’une base de données dans le but de se prémunir de certaines anomalies de lecture, d’écriture, de redondance de données et de garantir la cohérence des données et un bon niveau de performance.

La normalisation des bases de données correspond en partie aux règles de non redondance et de non multivaluation appliquées aux modèles conceptuels de données.

Ne sont examinées ci-dessous que les trois premières formes normales.

5.1. PREMIERE FORME NORMALE

Une base de données est en première forme normale si les colonnes contiennent toutes des valeurs :

Atomiques du point de vue des choix de gestion

Non répétitives

Par exemple, une colonne nomPersonne peut être considérée comme une propriété atomique si on ne s’intéresse pas au nom d’usage des femmes mariées ou non atomique sinon.

5.2. DEUXIEME FORME NORMALE

Une base de données est en deuxième forme normale si elle est en première forme normale et si toutes les colonnes non clefs dépendent de la totalité de la clef.

Cette règle ne s’applique qu’aux tables dont la clef primaire est une collection de plusieurs propriétés.

Exemple

Une table Classe (niveau, numéro, âge d’entrée) dont un exemple serait (6ème, A2, 11 ans) et dont la clef primaire serait (niveau, numéro) n’est pas en deuxième forme normale car l’âge d’entrée ne dépend que du niveau et pas du numéro de la classe.

Cette structure impliquerait que l’on répète le même âge d’entrée (11 ans) pour toutes les 6ème et impliquerait d’éventuelles anomalies de mise à jour si l’âge d’entrée des 6ème était modifié.

5.3. TROISIEME FORME NORMALE

Une base de données est en troisième forme normale si elle est en deuxième forme normale et si toutes les colonnes n’appartenant pas à la clef ne dépendent pas d’une colonne non clef.

Cette règle interdit les dépendances transitives sources de redondances de données.

Une table Site (code site, nom du site, ville, pays) et dont la clef primaire est code site n’est pas en troisième forme normale car pays est en dépendance de ville (ou en dépendance transitive de la clef code site).

Page 37: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 37 -

Cette structure impliquerait que l’on répète le même pays pour la même ville et impliquerait d’éventuelles anomalies de mise à jour si une ville changeait de pays.

6. Les règles de traduction

modèles conceptuels de

données -> schémas relationnels

6.1. TRADUCTION DES ENTITES

Les règles de traduction d’une entité sont plutôt triviales :

Une entité se traduit par une table

Une propriété se traduit par une colonne

Un identifiant se traduit par une clef primaire

6.2. TRADUCTION DES ASSOCIATIONS

Les règles de traduction des associations sont à peine moins triviales

Une association peut se traduire de deux façons différentes selon la situation.

6.2.1. Association binaire, cardinalité maximum de 1 Dans le cas d’une association binaire où une patte porte une cardinalité maximum de A, l’association se traduit par la création d’une clef étrangère dans la table « source », c'est-à-dire la table dont la patte d’association porte la cardinalité maximum de 1.

Exemple

Ce modèle se traduit par deux tables :

Personne (numéro agent, nom agent, code grade)

Grade (code grade, intitulé grade)

Page 38: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 38 -

Les clefs primaires sont soulignées.

6.2.2. Autres associations Dans tous les autres cas, l’association se traduit par une table contenant autant de clefs étrangères que d’entités participant à l’association.

Exemple

Ce modèle est traduit par trois tables :

Unité (code unité, titre unité)

Ville (code ville, nom ville)

Implantation (code unité, code ville)

7. Exemple récapitulatif

Il s’agit de modéliser les données correspondant au dictionnaire des données et au dictionnaire des règles présentées ci-dessous :

Domaine : affectation de personnes à des sites.

7.1. DICTIONNAIRE DES DONNEES

Nom de personne

Prénom de personne

Date d’entrée dans l’organisme (pas dans le site)

Statut : permanent ou non permanent

Quotité de travail

Nom du supérieur hiérarchique (n+1)

Prénom du supérieur hiérarchique

Nom du site d’affectation

Adresse du site

Page 39: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 39 -

Surface du site

Pays du site

7.2. DICTIONNAIRE DES REGLES

Une personne a aucun ou un supérieur hiérarchique

Une personne est le supérieur hiérarchique d’aucune, d’une ou de plusieurs personnes

Une personne est affectée à aucun site, un site ou plusieurs sites

Un site est entièrement situé dans un pays

7.3. ENONCE

Il est demandé :

1) De construire le modèle Entités / Associations

2) D’installer DBDesigner v 4

3) De construire le modèle avec DBDesigner

4) D’examiner la traduction modèle conceptuel -> schéma relationnel

5) De générer le script SQL de génération des tables avec les options : ranger les tables par FK, définir clé primaire, définir les préférences FK autorisées par l’éditeur de relations, option sortie de table, sortie d’insertion standard, sans les options créer indices et sortir commentaires.

7.4. SOLUTION

Sont présentées ci-dessous :

Un modèle conceptuel des données « pur » (WinDesign)

Un diagramme de classe UML limité aux données

Un modèle logique (ou schéma relationnel)

Le script de création de la base de données

7.4.1. Modèle Conceptuel des Données (Entités / Associations) complet

Ce modèle prévoit d’introduire une date d’affectation et de conserver l’historique de celles-ci.

Une personne pouvant être affectée successivement plusieurs fois à la même unité, date constitue une entité participant à l’association affecté.

Page 40: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 40 -

7.4.2. Diagramme de classe UML

7.4.3. Modèle logique des données

Page 41: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 41 -

7.4.4. Modèle de données avec DBDesigner

La présentation proposée par DBDesigner est intermédiaire entre les modèles conceptuels des

données (Entités / Association) qui ne font pas apparaitre les clefs étrangères et les modèles logiques. L’intérêt du produit est d’être open source et gratuit et de permettre la génération de code SQL de bonne qualité pour la création de la base de doonées.

.

Page 42: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 42 -

7.4.5. Script de création des tables

CREATE TABLE Personne (

idPersonne INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

Personne_idPersonne INTEGER UNSIGNED NOT NULL,

nomPersonne VARCHAR(255) NULL,

prenomPersonne VARCHAR(255) NULL,

dateEntree DATE NULL,

statutPersonne BOOL NULL,

quotitePersonne INTEGER UNSIGNED NULL,

PRIMARY KEY(idPersonne),

FOREIGN KEY(Personne_idPersonne)

REFERENCES Personne(idPersonne)

ON DELETE NO ACTION

ON UPDATE NO ACTION

);

CREATE TABLE Pays (

idPays INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

nomPays VARCHAR(255) NULL,

PRIMARY KEY(idPays)

);

CREATE TABLE Site (

idSite INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

Pays_idPays INTEGER UNSIGNED NOT NULL,

nomSite VARCHAR(255) NULL,

adresseSite VARCHAR(255) NULL,

surfaceSite INTEGER UNSIGNED NULL,

PRIMARY KEY(idSite),

FOREIGN KEY(Pays_idPays)

REFERENCES Pays(idPays)

ON DELETE NO ACTION

ON UPDATE NO ACTION

);

CREATE TABLE Affectations (

Personne_idPersonne INTEGER UNSIGNED NOT NULL,

Site_idSite INTEGER UNSIGNED NOT NULL,

PRIMARY KEY(Personne_idPersonne, Site_idSite),

FOREIGN KEY(Personne_idPersonne)

REFERENCES Personne(idPersonne)

ON DELETE NO ACTION

ON UPDATE NO ACTION,

FOREIGN KEY(Site_idSite)

REFERENCES Site(idSite)

ON DELETE NO ACTION

Page 43: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 43 -

ON UPDATE NO ACTION

);

Page 44: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 44 -

SQL

1. Préambule

1.1. OBJECTIFS DE SQL

L’objectif de SQL est d’implémenter les opérateurs relationnels dans un langage proche du langage naturel.

SQL = Structured Query Language

1.2. NORMES

Il existe trois normes successives de SQL :

1) SQL1 (ou SQL 89) représentant la norme de base sur laquelle s’alignent la quasi-totalité des SGBDR

2) SQL2 (ou SQL 92) divisé en trois ensemble : Entrée (équivalent à SQL1), Intermédiaire qui ajoute la possibilité de modifier des schémas et enrichit le langage de contraintes, Complet. La plupart des SGBDR récents implémentent SQL2 intermédiaire.

3) SQL3 qui étend SQL2 avec l’intégration d’instructions procédurales et une approche objet. Cette norme a fait l’objet de plusieurs révisions, n’est implémentée aujourd’hui par aucun SGBDR et demeure contestée.

1.3. UTILISATION DE SQL

SQL s’utilise soit en mode interactif, soit intégré dans un programme procédural ou objet.

Le langage SQL se divise en trois ensembles :

Le langage de description de schémas (LDD)

Le langage de manipulation des données (mise à jour et accès aux données)

Le langage de contrôle des données

Page 45: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 45 -

2. La création et la modification

de schémas

2.1. CREATION DE SCHEMA

CREATE DATABASE nom de base ;

Exemple

CREATE DATABASE Personnel ;

2.2. CREATION DE TABLE

CREATE TABLE nom de table (nom de colonne1 type, nom de colonne2 type, …, nom de colonnen type) ;

Des contraintes peuvent être associées à la table

Valeur obligatoire : colonne… NOT NULL

Clef primaire : PRIMARY KEY

Unicité : UNIQUE (colonne1, …)

Validation générale: CHECK prédicat

Clef étrangère et intégrité référentielle : FOREIGN KEY REFERENCES nom de table (nom de colonne)

Intégrité référentielle vis-à-vis des opération de mise à jour : ON DELETE ou ON UPDATE NO ACTION, CASCADE ou SET NULL

Autres contraintes sur une colonne : CHECK (prédicat)

Contraintes générales : CONSTRAINT nom contrainte CHECK (prédicat)

Exemple

Création de la Table Personne (voir modèle de référence plus haut)

CREATE TABLE Personne (

idPersonne INTEGER NOT NULL AUTO_INCREMENT,

nomPersonne VARCHAR(255) NULL,

prenomPersonne VARCHAR(255) NULL,

dateNaissance DATE NULL,

Page 46: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 46 -

quotitePersonne INTEGER UNSIGNED NULL CHECK (quotitePersonne

IN(50,60,70,80,90,100)),

Personne_idEtablissement INTEGER ,

PRIMARY KEY(idPersonne),

FOREIGN KEY(Personne_idEtablissement)

REFERENCES Etablissement(idEtablissement)

ON DELETE NO ACTION

ON UPDATE NO ACTION

);

La clause CHECK …. N’est pas opérationnelle avec les versions actuelles (juillet 2009) de MySQL

Une table peut être créée à partir d’une requête de sélection.

CREATE TABLE Travailleurs AS (SELECT nomPersonne, prenomPersonne,

dateEntree ,statutPersonne WHERE quotitePersonne>70)

WITH DATA

2.3. MODIFICATION DE TABLE

2.3.1. Ajouter une colonne ALTER TABLE nom de table ADD COLUMN nom colonne type ;

2.3.2. Modifier le nom d’une colonne ALTER TABLE nom de table CHANGE ancien nom colonne nouveau nom colonne type

2.3.3. Modifier le type d’une colonne ALTER TABLE nom de table MODIFY nom colonne nouveau type

Exemple

2.3.4. Supprimer une colonne ALTER TABLE nom de table DROP COLUMN nom colonne ;

Exemple

Ajout d’une colonne « indice » à la table Personne

ALTER TABLE Personne

Page 47: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 47 -

ADD COLUMN indice INTEGER ;

Renommer la table indice en indicePaie

ALTER TABLE Personne

CHANGE COLUMN indice indicePaie INTEGER ;

Modifier le type de la colonne indiciePaie en FLOAT

ALTER TABLE Personne

MODIFY COLUMN indicePaie FLOAT;

Supprimer la colonne » indice »

ALTER TABLE Personne

DROP COLUMN indice;

2.4. AJOUTER DES CONTRAINTES

ALTER TABLE nom table

ADD CONSTRAINT nom contrainte CHECK (…)

2.5. SUPPRESSION DE TABLE

DROP TABLE nom de table ;

2.6. CREATION DE VUES

CREATE VIEW nom vue AS (SELECT col1,… FROM Table WHERE prédicat)

Exemple

Création d’une vue « TP » des personnels (nom, prénom, quotité) pour les personnes travaillant à temps partiel.

Page 48: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 48 -

CREATE VIEW TP AS (SELECT nomPersonne AS nom, prenomPersonne AS prenom,

quotitePersonne AS quotite FROM personne WHERE quotitePersonne < 100)

3. La mise à jour des données

3.1. INSERTION DE LIGNES

INSERT INTO nom de table (col1, col2, …, coln)

VALUES

(val11, val12, …, val1n),

(val21, val22, …, val2n),

(val31, val32, …, val3n),

(val41, val42, …, val4n) ;

Ou

INSERT INTO nom de table (col1, col2, …, coln)

SELECT col1, col2,…, coln

FROM nom de table

Exemple

Insertion d’une nouvelle personne.

INSERT INTO personne

(nomPersonne,prenomPersonne,dateNaissancePersonne,quotitePersonne,idEtablis

sement)

VALUES

('JEANOT','FREDERIQUE','1970-10-20',100,2) ;

3.2. MODIFICATION

UPDATE nom de table SET col = val

Page 49: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 49 -

WHERE prédicat ;

Exemple

Ajouter à nouveau une colonne indice de type entier.

Mettre l’indice à 1000 pour ceux dont la quotité est supérieure ou égale à 80.

UPDATE Personne

SET indicePersonne = 1000 WHERE quotitePersonne >=80

Modification utilisant une sous-requête

On veut augmenter de 50% l’indice des personnes dont la quotité est la plus élevée.

UPDATE Personne

SET indicePersonne = indice*1.5

WHERE quotitePersonne = (SELECT MAX(quotitePersonne) FROM personne)

Suivant les SGBD, il n’est pas toujours possible d’exécuter une requête de modification en

utilisant une sous-requête portant sur cette même table.

On veut augmenter de 100% l’indice des personnes travaillant dans un établissement dont le nom contient l’expression ‘CAMPUS’.

UPDATE personne

SET `indicePersonne`=`indicePersonne`*2

WHERE `idEtablissement` IN (SELECT idEtablissement FROM etablissement WHERE

nomEtablissement LIKE '%CAMPUS%')

On veut modifier remplacer l’indice d’une personne par l’indice de la même personne que l’on trouve dans la table promus

UPDATE personne, promus

SET personne.indicePaie = promus.indicePaie

WHERE personne.nomPersonne = promus.nomPromu

Page 50: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 50 -

3.3. SUPPRESSION DE LIGNES

DELETE FROM nom table

WHERE prédicat ;

4. La consultation des données

4.1. FORME CANONIQUE DES REQUETES SELECT

SELECT [DISTINCT ou ALL] * ou liste de colonnes

FROM nom de table ou de la vue

[WHERE prédicats]

[GROUP BY ordre des groupes]

[HAVING condition]

[ORDER BY ] liste de colonnes

Le délimiteur de chaîne est l’apostrophe (simple quote).

Exemple

Afficher toutes les colonnes de la table personne triées par ordre décroissant des quotités.

SELECT * FROM personne ORDER BY quotitePersonne DESC;

4.2. LES OPÉRATEURS : BOOLÉENS, BETWEEN, LIKE…

4.2.1. Opérateurs booléens AND, OR, NOT

Utilisation de parenthèses

Exemple

Afficher les personnes née savant 1970 et dont la quotité est 50 ou 100.

Page 51: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 51 -

SELECT * FROM personne WHERE dateNaissancePersonne <'1970-01-01' AND

(quotitePersonne = 50 OR quotitePersonne = 100)

4.2.2. BETWEEN Recherche entre deux valeurs

SELECT * FROM Table1 WHERE colonne BETWEEN valeur1 AND valeur2

Exemple

Afficher le nom et la date de naissance des personnes nées en 1985.

SELECT * FROM `personne` WHERE dateNaissancePersonne BETWEEN '1985-01-01'

AND '1985-12-31'

4.2.3. La “valeur” NULL NULL représente l’absence de valeur.

SELECT * FROM Table WHERE col IS NULL ;

Exemple

Afficher les personnes n’étant pas affectées à un établissement

SELECT * FROM personne WHERE idEtablissement IS NULL

4.2.4. LIKE Recherche par troncature (caractère ‘%’)

SELECT * FROM nom de table WHERE colonne LIKE ‘valeur%’

Exemple

Afficher le nom des personnes dont le nom commence par la lettre « D »

Page 52: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 52 -

SELECT * FROM `personne` WHERE nomPersonne LIKE 'D%'

4.2.5. Utilisation d’Alias Une colonne peut être associée à un “alias” :

SELECT col AS nouvelleCol

Exemple

Afficher le nom et le prénom des personnes (en utilisant « NOM » et « PRENOM » comme titre de colonne).

SELECT nomPersonne as NOM, prenomPersonne AS PRENOM FROM personne

4.3. UTILISATION DE FONCTIONS SQL

SQL permet d’utiliser un grand nombre de fonctions de type chaine de caractères, numérique et date.

4.3.1. Fonctions chaînes de caractères

4.3.1.1. Concaténation

CONCAT(c1, c2, …)

Exemple

SELECT CONCAT (nomPersonne,’ ‘,prenomPersonne) AS identite FROM personne

4.3.1.2. Extractions de chaînes de caractères

SUBSTR(c, position de début, nombre de caratères)

Exemple

Afficher les 3 premières lettres du nom de chacune des personnes.

Page 53: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 53 -

SELECT SUBSTR(nomPersonne, 1, 3) as Code FROM personne

Peuvent être également utilisées les fonctions LEFT, RIGHT, MID,

4.3.1.3. Longueur de caractères

CHAR_LENGTH

4.3.1.4. Minuscules et majuscules

LOWER(c) : transforme les majuscules en minuscules

UPPER(c) : transforme les minuscules en majuscules

4.3.1.5. Suppression des espaces inutiles

TRIM() : supprime les espaces à gauche et à droire

RTRIM() : supprime les espaces à droite

LTRIM() : supprime les espaces à gauche

4.3.2. Fonctions numériques Les principales fonctions numériques sont les suivantes :

ABS() : valeur absolue

CEILING() : arrondit à l’entier supérieur

FLOOR() : retourne l’entier inférieur

MOD() : modulo

POW() : puissance

ROUND() : arrondit à l’entier supérieur ou inférieur

SQRT() : racine carré

4.3.3. Fonctions date CURDATE() : date courante

CURTIME() : heure courante

NOW() : date et heure courantes

ADDDate(d, n) : ajoute n jours à la date d

ADDATE(…) : ajoute un intervalle à la date initiale

DATEDIFF(d1, d2) : nombre de jours entre d1 et d2

Page 54: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 54 -

DATE_FORMAT(d, format) : formate la date

DAYNAME(d) : nom (anglais) du jour

DAYOFMONTH(d)

DAYOFWEEK()

DAYOFYEAR()

MONTH()

MONTHNAME()

TIMESTAMP()

WEEK()

WEEKDAY()

YEAR()

Exemple

On veut ajouter 3 mois à une date donnée

SELECT ADDDATE('2008-12-31', INTERVAL 3 MONTH)

4.3.4. Formats de date et d’heure d% : numéro du jour sur 2 chiffres

D% : nom du jour avec suffixe anglais

W% : nom du jour de la semaine (anglais)

m% : numéro du mois sur 2 chiffres

M% : nom du mois (anglais)

y% : année sur 2 chiffres

Y% : année sur 4 chiffres

Exemple

SELECT DATE_FORMAT('2008-12-31', '%d/%m/%Y')

4.4. LES AGREGATS

SELECT col, fonction(s) de synthèse FROM Table

GROUP BY col

HAVING prédicat

Page 55: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 55 -

Les fonctions de synthèse sont : SUM, COUNT, AVG, MIN, MAX…

Exemple

Compter le nombre de personnes travaillent à temps partiel par quotités

SELECT quotitePersonne AS Quotite, COUNT(*) AS Effectifs FROM personne

GROUP BY quotitePersonne HAVING quotitePersonne < 100

4.5. LES JOINTURES

4.5.1. Jointure naturelle SELECT col1, col2… FROM Table1 INNER JOIN Table2 ON FK = PK

FK désigne une clef étrangère, PK une clef primaire.

Exemple

Afficher le nom des personnes et le nom du site auquel elles sont affectées.

SELECT nomPersonne, nomEtablissement FROM personne INNER JOIN etablissement

ON Personne.idEtablissement = etablissement.idEtablissement

Autre syntaxe

L’ancienne syntaxe SQL est toujours utilisable

SELECT nomPersonne, nomEtablissement FROM personne, etablissement

WHERE personne.idEtablissement = etablissement.idEtablissement

4.5.2. Jointures externes SELECT col1, col2… FROM Table1 LEFT (RIGHT) OUTER JOIN Table2 ON FK = PK

FK désigne une clef étrangère, PK une clef primaire.

Exemple

Page 56: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 56 -

Afficher le nom des personnes (y compris les personnes n’étant affectées nulle part) et le nom du site auquel elles sont affectées.

SELECT nomPersonne, nomEtablissement FROM personne LEFT OUTER JOIN

etablissement

ON Personne.idEtablissement = etablissement.idEtablissement

4.6. LES OPERATEURS ENSEMBLISTES

4.6.1. L’union SELECT col1, col2 FROM Table1 UNION SELECT col1, col2 FROM Table2;

Exemple

Afficher le nom des personnes présentes dans la table personne ou (inclusif) dans la table workers.

SELECT nomPersonne, prenomPersonne FROM personne

UNION

SELECT lastNameWorker, firstNameWorker FROM worker

4.6.2. L’intersection SELECT col1, col2 FROM Table1 INTERSECT SELECT col1, col2 FROM Table2;

Exemple

Afficher le nom des personnes présentes dans la table personne et aussi dans la table workers.

SELECT nomPersonne, prenomPersonne FROM personne

WHERE nomPersonne IN (SELECT lastNameWorker FROM workers)

AND prenomPersonne IN (SELECT firstNameWorker FROM workers)

4.6.3. La différence SELECT col1, col2 FROM Table1 MINUS SELECT col1, col2 FROM Table2;

Exemple

Page 57: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 57 -

Afficher le nom des personnes présentes dans la table personne et pas dans la table workers

SELECT nomPersonne, prenomPersonne FROM personne

WHERE nomPersonne NOT IN (SELECT lastNameWorker FROM workers)

4.7. LES SOUS-REQUETES

Les requêtes contenant des sous-requêtes doivent être distinguées suivant que celle-ci est susceptible de ne renvoyer qu’une seule ligne de résultat ou plusieurs lignes de résultat.

Si la sous-requête ne renvoie à coup sur (structurellement) qu’une seule ligne, la sous-requête peut être introduite par les opérateurs : = , >, >= …

Exemple

Afficher les noms dont la quotité est inférieure à la moyenne des quotités.

SELECT nomPersonne FROM personne WHERE quotitePersonne < (SELECT

AVG(quotitePersonne) FROM personne)

Les opérateurs ANY et ALL permettent d’introduire une sous-requête avec les opérateurs : = , >, >= …

Exemple

Afficher les noms des personnes présentes dans la table personne et dans la table workers (intersection)

SELECT nomPersonne FROM personne WHERE nomPersonne = ANY (SELECT

lastNameWorker FROM workers)

Si la requête est susceptible de renvoyer plusieurs valeurs, la sous-requête doit être introduite par les opérateurs : IN, NOT IN, EXISTS

SELECT * FROM Table1 WHERE col IN (SELECT col FROM Table2 WHERE prédicat)

Afficher le nom et la quotité des personnes ayant la même quotité qu’une personne du site « BEAU CAMPUS »

Page 58: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 58 -

SELECT `nomPersonne`,`quotitePersonne` FROM `personne` WHERE

quotitePersonne IN (SELECT `quotitePersonne` FROM personne INNER JOIN

etablissement ON personne.idEtablissement = etablissement.idEtablissement

WHERE nomEtablissement = 'BEAU CAMPUS')

5. Le contrôle des autorisations

5.1. ACCORDER UNE AUTORISATION

GRANT privilèges TO utilisateur ON …

WITH GRANT OPTIONS

Privilèges : INSERT, UPDATE, DELETE, ALL

La clause WITH GRANT OPTIONS optionnelle permet à l’utilisateur de transmettre les privilèges reçus.

5.2. REVOQUER UNE AUTORISATION

REVOKE privilèges TO utilisateur ON …

Page 59: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 59 -

MYSQL ET PHP

1. MySQL – brève présentation

MySQL est un Système de Gestion de Base de Données Relationnelles multithreads et multiutilisateurs.

MySQL est fortement couplé au serveur web Apache et à PHP via notamment les quatuors LAMP, WAMP et MAMP (Macintosh).

MySQL est supporté par la grande majorité des hébergeurs Web.

Depuis le rachat de MySQL par Sun puis par Oracle, MySQL est présenté comme le SGBD devant être utilisé conjointement à Java.

MySQL est un SGBD qui suivant son usage est en licence libre ou propriétaire.

MySQL est un SGBD orienté davantage « fournisseur de données » (efficacité en consultation) que gestion de grandes quantités de transactions simultanées.

MySQL supporte la norme SQL2.

MySQL peut gérer les transactions et les contraintes d’intégrité référentielles.

2. Utilisation de MySQL

Une base de données peut être manipulée avec MySQL :

En mode commande

Via l’utilitaire PHPMYADMIN

Via un programme (par exemple un programme PHP)

2.1. L’UTILISATION EN MODE COMMANDE

Page 60: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 60 -

2.1.1. Connexion au serveur et manipulation des données Après avoir éventuellement modifié la variable d’environnement, il faut exécuter la commande de connexion au serveur de la façon suivante (le serveur ayant été préalablement lancé).

La syntaxe générale est :

mysql –u nom utilisateur –pmot de passe

(pas d’espace entre le –p et le mot de passe éventuel).

Une autre syntaxe est possible :

mysql –u nom utilisateur –p

Le serveur MySQL demandera alors un mot de passe.

Il est alors possible de :

Créer une base de données

Créer, modifier, supprimer des tables

Créer, modifier, supprimer des données

Sélectionner des données

Créer de nouveaux utilisateurs et leur accorder des privilèges

Il est aussi possible, plutôt que d’exécuter des commandes au clavier, d’exécuter un script SQL.

La syntaxe est la suivante :

mysql –u nom utilisateur –pmot de passe <fichier de script

Page 61: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 61 -

2.1.2. Exercices en mode commande

Pour traiter les exercices qui suivent, il est indispensable de posséder les autorisations

nécessaires sur la base de données.

Première partie création d’une base de données

1) Examiner le script généré par DBDesigner sur le modèle Annuaire

2) Exécuter ce script

3) Afficher la liste des bases de données sur le serveur MySQL

4) Afficher la liste des tables de la base annuaire

5) Examiner le script fourni et interpréter les différences (IF EXISTS, nouvelle colonne dans Personne…)

6) Exécuter le script

Deuxième partie écriture de requêtes SQL

Modifications du schéma

1) Ajouter la colonne indicePersonne de type entier dans la table Personne

2) Ajouter la colonne dateAffectation de type date dans la table Affectations

3) Modifier le nom de la colonne Personne_idPersonne par Personne_idChef

4) Ajouter une table worker (lastName, firstName, indicePaie)

Mises à jour

5) Attribuer un indice à chacune des personnes

6) Renseigner la table worker en y plaçant deux personnes figurant dans la table personne mais avec un indice supérieur

7) Modifier le nom du site « Guten Tag Schule » par « Wunderbar Schule »

8) Augmenter tous les indices de 15%

9) Modifier l’indice des deux personnes présents dans les deux tables en changeant l’indice de la table personne par celui de la table worker

10) Remplacer le grand chef par SMITH. L’ancien grand chef devient le subordonné de SMITH

Sélections

11) Afficher le contenu de la table personne trié par ordre alphabétique des noms

Page 62: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 62 -

12) Afficher le nom et le prénom dont la quotité est inférieur à 100

13) Afficher le nom et le prénom des personnes entrées avant 2004 et dont la quotité est inférieure à 100

14) Afficher le nom et le prénom des personnes entrées en 2005

15) Afficher les noms de personnes commençant par la lettre ‘D’

16) Afficher les noms de personnes ne contenant pas la lettre ‘e’

17) Afficher le nom et le prénom du grand chef

18) Afficher le nombre de jour passés dans l’entreprise pour chacune des personnes

19) Afficher la date du 20ème anniversaire de présence dans l’entreprise pour chacune des personnes

20) Afficher la concaténation du nom et du prénom de chacune des personnes, le nom et le prénom commençant par une majuscule, les autres caractères en minuscules, un espace de séparation

21) Afficher le nom des personnes et l’adresse de leur site

22) Afficher le nom des personnes et l’adresse de leur site pour les sites dont la surface est inférieure à 5000

23) Afficher le nom et la quotité des personnes en regard du nom et de la quotité de leur supérieur

24) Afficher le nombre de personnes par quotité, le titre de la colonne de comptage est ‘Effectifs’ (utiliser un alias)

25) Calculer le nombre d’ETP par pays (jointure et regroupement)

26) Afficher le nom des personnes se trouvant soit dans la table personne, soit dans le table worker

27) Afficher le nom des personnes se trouvant dans la table personne et dans le table worker

28) Afficher le nom des personnes se trouvant dans la table personne et pas dans la table worker

29) Afficher le nom des personnes travaillant sur un site sur lequel travaillent au moins 3 personnes (sous-requête)

30) Afficher le nom et la quotité des personnes dont la quotité est inférieure ou égale à toutes les quotités des personnes affectées au site « BEAU CAMPUS »

31) Afficher le nom des personnes travaillant dans le même site que leur supérieur hiérarchique

32) Créer une vue affichant toutes les colonnes des personnes travaillant en France

33) Afficher le nom de toutes les personnes travaillant en France à temps partiel (à partir de la vue précédente)

Solution de la requête 31.

Il s’agit d’une requête corrélée

Une colonne de la sous requête est associée à une colonne de la requête extérieure

Chaque ligne de la requête extérieure est évaluée par rapport à chacune des lignes de la requête intérieure (double boucle).

SELECT E.nomPersonne FROM personne E INNER JOIN affectations ON

E.idPersonne= affectations.Personne_idpersonne WHERE

affectations.Site_idsite NOT IN (SELECT affectations.Site_idsite FROM

affectations INNER JOIN personne C ON affectations.Personne_idpersonne =

C.idPersonne WHERE E.Personne_idchef=C.idPersonne)

Page 63: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 63 -

Solution pour la première partie

1) Voir les bases

2) Afficher les tables de la base annuaire

3) Exécuter le script

2.2. UTILISATION VIA L’UTILITAIRE PHPMYADMIN

L’utilitaire PHPMYADMIN permet d’effectuer les mêmes opérations en mode moins austère.

Voir le chapitre ci-dessous

2.3. UTILISATION VIA UN PROGRAMME PHP

La manipulation des données d’une base de données hébergée par un serveur MySQL se fait en plusieurs étapes :

1) Obtention d’une connexion au serveur MySQL

2) Accès à la base de données

3) Préparation de la requête

4) Exécution de la requête

Page 64: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 64 -

2.3.1. La connexion au serveur La connexion au serveur MySQL est obtenue en utilisant la fonction suivante :

mysql_connect (hostname, utilisateur, mot de passe)

La fonction renvoie un identifiant de connexion en cas de succès, FALSE accompagnée d’un message d’alerte en cas d’échec.

La déconnexion s’exécute en utilisant la fonction :

mysql_close(identifiant de connexion)

La fonction renvoie True en cas de succès, False autrement

2.3.2. L’accès à la base de données L’accès à une base de données est obtenu en utilisant la fonction suivante :

Mysql_select_db (identifiant connexion, nom de la base)

La fonction renvoie True en cas de succès, False autrement

2.3.3. Préparation et exécution d’une requête La requête (du texte SQL) est tout d’abord placée dans une variable.

La requête est exécutée par la fonction suivante :

mysql_query (texte de la requête, identifiant de connexion)

La fonction renvoie un identifiant de résultat de requête en cas de succès, FALSE en cas d’échec lorsque la requête est prévue pour renvoyer un résultat (SELECT…).

La fonction renvoie True en cas de succès, FALSE en cas d’échec lorsque la requête est prévue pour ne pas renvoyer de résultat (requête de mise à jour).

La fonction mysql_query() ne renvoie pas de donnée.

Exemple

Ecrire un script qui :

1. Etablisse une connexion le serveur MySQL

2. Accède à la base annuaire

3. Exécute une requête de type SELECT sur la table Personne (on ne demande pas de renvoyer le résultat)

4. Ajoute une ligne à la table Pays (Mali)

5. Ferme la connexion au serveur

Le script devra tester le succès de chacune des opérations.

Page 65: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 65 -

<?php

$nom_hote='localhost';

$user='infotique';

$password='agathe';

//connexion au serveur MySQL

$connexion=mysql_connect($nom_hote,$user,$password);

//0 = false, autres valeurs = true

if($connexion)

{

echo "Connexion au serveur $nom_hote établie<br>";

}

else

{

echo "La tentative de connexion au serveur $nom_hote a

échoué<br>";

}

//Accès à la base de données

$db='annuaire';

$ok=mysql_select_db($db,$connexion);

if($ok)

{

echo "Accès à la base $db établi<br>";

}

else

{

echo "La tentative d'Accès àla base $db a échoué";

}

//préparation et exécution d'une requête

$requete = "INSERT INTO Pays(nomPays) VALUES ('Mali')";

$resultat_requete = mysql_query($requete,$connexion);

if($resultat_requete)

{

echo "Requête exécutée<br>";

}

else

{

echo "La requête a echoué<br>";

}

Page 66: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 66 -

//déconnexion

$ok=mysql_close($connexion);

if($ok)

{

echo "Déconnexion réussie<br>";

}

else

{

echo "La tentative de déconnexion a échoué";

}

//déconnexion

$ok=mysql_close($connexion);

if($ok)

{

echo "Déconnexion réussie<br>";

}

else

{

echo "La tentative de déconnexion a échoué";

}

?>

Résultat

Connexion au serveur localhost établie

Accès à la base annuaire établi

Requête exécutée

Déconnexion réussie

Suite

Modifier la requête afin que le pays soit donné en paramètre.

$nouveau_pays='Belgique';

//préparation et exécution d'une requête

$requete = "INSERT INTO Pays(nomPays) VALUES ('".$nouveau_pays."')";

Suite

Tenter la même opération avec la ‘république d’Abkhazie’

Page 67: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 67 -

$nouveau_pays=mysql_escape_string("Rébublique d'Abkhazie");

//préparation et exécution d'une requête

$requete = "INSERT INTO Pays(nomPays) VALUES ('".$nouveau_pays."')";

$resultat_requete = mysql_query($requete,$connexion);

On constate que l’apostrophe figurant dans le nom du pays doit être échappée.

L’échappement des caractères pour MySQL est réalisé par la fonction : mysql_escape_string()

2.3.4. Affichage du résultat d’une requête renvoyant un résultat (SELECT)

Le principe d’affichage des résultats d’une requête est le suivant :

1) La requête SQL renvoie, en cas de succès, un identifiant de résultat

2) Le résultat est extrait ligne à ligne jusqu’à la dernière ligne

Les données renvoyées par la requête sont extraites ligne à ligne en exécutant une des fonctions suivantes :

mysql_fetch_assoc(résultat de la requête)

mysql_fetch_row(résultat de la requête)

mysql_fetch_array(résultat de la requête, type)

Ces fonctions retournent la ligne courante du curseur sous la forme d’un tableau, chaque ligne du tableau correspondant à une colonne du curseur.

Lorsque le curseur a été entièrement parcouru, la fonction renvoie NULL.

La fonction Mysql_fetch_assoc (résultat de la requête) renvoie un tableau associatif dont la clef est les nom des colonnes renvoyées par la requête.

Mysql_fetch_row (résultat de la requête) renvoie un tableau à indices entiers

Mysql_fetch_array (résultat de la requête) renvoie un tableau dont le type est déterminé par un paramètre : MYSQL_NUM, MYSQL_ASSOC, MYSQL_BOTH.

Exemple

Afficher le nom de chaque personne, sa date d’entrée, le nom du site et le pays dans lequel il travaille.

Page 68: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 68 -

3. Eléments d’administration de

MySQL

L’administration de MySQL peut s’opérer par l’utilitaire PHPMYADMIN

3.1. ADMINISTRER COMPTES UTILISATEURS ET AUTORISATION

3.1.1. Création d’un nouvel utilisateur Pour accéder à la gestion des comptes utilisateurs, il faut sélectionner l’onglet « Privilèges »

Puis sélectionner la fonction « Ajouter un utilisateur », renseigner les rubriques et valider (exécuter).

Page 69: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 69 -

L’utilisateur concerné a alors le privilège « USAGE », c'est-à-dire qu’il peut obtenir une connexion au serveur MySQL.

Il est possible d’attribuer des privilèges globaux explicites pour l’ensemble des bases de données ou de créer une base de données pour l’utilisateur.

L’attribution de privilèges globaux à ce niveau est inutile.

3.1.2. Attribuer des autorisations pour une base de données

Après l’ajout d’un utilisateur, il est possible de lui attribuer des autorisations sur une base existante.

Un premier écran permet de sélectionner la base.

L’écran suivant permet de spécifier d’une part les autorisations accordées et d’autre part leur étendue, soit la base entière

Page 70: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 70 -

Soit une table de la base

Il est vivement conseillé de ne pas attribuer le privilège « GRANT » (possibilité de transmettre les privilèges que l’on possède) sans discernement.

Il est possible de modifier les autorisations d’un utilisateur.

Il est possible de supprimer un utilisateur.

3.2. CREER UNE BASE DE DONNEES

Nous allons créer une base de données « Personnel » composé de deux tables

Personne (idPersonne, nomPersonne, salaire, codeEtablissement)

Etablissement (idEtablissement, nomEtablissement, adresseEtablissement, surfaceEtablissement)

Page 71: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 71 -

L’utilitaire PHPMYADMIN permet de créer une base de données.

L’opération de création s’effectue en deux temps :

Création de la base de données

Création du schéma (c'est-à-dire des tab les)

3.2.1. Création de la base de données

3.2.2. Création des tables

Page 72: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 72 -

La colonne idPersonne est de type « auto incrément » et constitue la clef primaire.

Le résultat est le suivant :

Pour la seconde table, le résultat est le suivant :

Il est bien sur possible de modifier ou de supprimer des tables.

3.2.3. Créer une contrainte de clef étrangère (contrainte d’intégrité référentielle)

Page 73: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 73 -

Pour créer une contrainte de clef étrangère avec MySQL, il est nécessaire que les données

soient stockées au format « inno DB ». Si cela n’est pas le cas, il faut sélectionner la table, cliquer sur « Structure » puis sur l’onglet « Opérations » puis changer le moteur de stockage. La colonne clef étrangère doit d’autre part être indexée.

Après avoir sélectionné la table contenant la clef étrangère concernée, cliquez sur le lien « Gestion des relations ».

Vous pouvez désigner la clef primaire associée à la clef étrangère et décider de l’action à entreprendre en cas de suppression ou de modification de celle-ci.

Le choix NO ACTION garantit qu’il sera impossible de supprimer ou de modifier la clef primaire associé.

La colonne clef étrangère doit impérativement être indexée.

Le résultat de l’action est le suivant :

Page 74: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 74 -

3.3. AFFICHER, INSERER, MODIFIER, SUPPRIMER DES DONNEES

Dès qu’une table contient une ligne, il est possible d’insérer de nouvelles lignes, d’en supprimer, d’en modifier en passant par la fonction d’affichage de la table.

3.4. EXECUTER DES REQUETES SQL

L’éditeur SQL permet de saisir du code SQL :

Le résultat est présenté de la façon suivante :

Page 75: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 75 -

3.5. SAUVEGARDER, IMPORTER ET EXPORTER

Il est possible de sauvegarder, d’importer ou d’exporter des bases de données ou des tables

3.5.1. Sauvegarder une base de données Après avoir sélectionné la base à sauvegarder, il faut cliquer sur l’onglet « Exporter » pour obtenir l’écran suivant :

Dans cet écran, l’exportation SQL est sélectionnée par défaut, elle est à conserver pour l’opération de sauvegarde de la base de données.

La sauvegarde concerne (c’est heureux) à la fois la structure et à la fois les données.

Le résultat (partiel) est le suivant :

-- phpMyAdmin SQL Dump

-- version 3.1.1

-- http://www.phpmyadmin.net

--

-- Serveur: localhost

-- Généré le : Mer 17 Juin 2009 à 12:30

-- Version du serveur: 5.1.30

-- Version de PHP: 5.2.8

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--

-- Base de données: `annuaire`

--

Page 76: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 76 -

-- --------------------------------------------------------

--

-- Structure de la table `pays`

--

CREATE TABLE IF NOT EXISTS `pays` (

`idPays` int(10) unsigned NOT NULL AUTO_INCREMENT,

`nomPays` varchar(255) DEFAULT NULL,

PRIMARY KEY (`idPays`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

--

-- Contenu de la table `pays`

--

INSERT INTO `pays` (`idPays`, `nomPays`) VALUES

(1, 'France'),

(2, 'Allemagne'),

(3, 'Italie');

-- --------------------------------------------------------

Il s’agit d’un code SQL constitué principalement de requêtes CREATE TABLE et INSERT INTO qui pourra être exécutée sur la même machine ou une autre machine pour recréer la base de données (structure et données).

4. Exemple récapitulatif

4.1. PREMIER EXEMPLE – RECHERCHE DANS UNE BASE DE DONNEES ET

AFFICHAGE DU RESULTAT DANS UN FORMULAIRE

Enoncé

Page 77: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 77 -

On souhaite construire un formulaire permettant d’afficher les personnes (nom, prénom, date d’entrée et quotité) travaillant dans un pays donné (c'est-à-dire dans un site implanté dans un pays donné).

1. Construire un formulaire qui affiche les pays dans une liste.

Solution

<?php

$nom_hote='localhost';

$user='infotique';

$password='agathe';

//connexion au serveur MySQL

$connexion=mysql_connect($nom_hote,$user,$password);

//0 = false, autres valeurs = true

if(!$connexion)

{

exit( "La tentative de connexion au serveur $nom_hote a

échoué");

}

//Accès à la base de données

$db='annuaire';

$ok=mysql_select_db($db,$connexion);

if(!$ok)

{

exit( "La tentative d'Accès àla base $db a échoué");

}

//préparation et exécution d'une requête sélectionnant les pays

$requete = "SELECT * FROM Pays";

$resultat_requete = mysql_query($requete,$connexion);

if(!$resultat_requete)

{

exit("La requête a echoué<br>");

}

//déconnexion

$ok=mysql_close($connexion);

if(!$ok)

{

exit("La tentative de déconnexion a échoué");

}

Page 78: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 78 -

?>

<html>

<head><title>Recherche par pays</title></head>

<body>

<form action="RechercheParPays.php" method="post">

<select name="liste_pays">

<!--affichage du contenu de la liste - utilisation de htmlentities pour

obtenir un affichage correct dans

n'importe quel navigateur-->

<?php

while ($row = mysql_fetch_row($resultat_requete)) {

echo "<OPTION>".htmlentities($row[1])."</OPTION>";

}

?>

</select>

</form>

</body>

</html>

1) Modifier le script pour que si un pays est choisi, il soit affiché.

Solution

if (sizeof($_POST)>0)

{

echo "Le pays sélectionné est : $_POST[liste_pays]";

}

2) Modifier le script de façon à afficher les personnes (nom, prénom, date d’entrée et quotité) travaillant dans le pays sélectionné (c'est-à-dire dans un site implanté dans le pays sélectionné).

Solution

<?php

Page 79: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 79 -

$nom_hote='localhost';

$user='infotique';

$password='agathe';

//connexion au serveur MySQL

$connexion=mysql_connect($nom_hote,$user,$password);

//0 = false, autres valeurs = true

if(!$connexion)

{

exit( "La tentative de connexion au serveur $nom_hote a

échoué");

}

//Accès à la base de données

$db='annuaire';

$ok=mysql_select_db($db,$connexion);

if(!$ok)

{

exit( "La tentative d'Accès àla base $db a échoué");

}

//préparation et exécution d'une requête sélectionnant les pays

$requete = "SELECT * FROM Pays";

$resultat_requete = mysql_query($requete,$connexion);

if(!$resultat_requete)

{

exit("La requête a echoué<br>");

}

if (sizeof($_POST)>0)

{

//on recherche les personnes travaillant dans le pays

$pays=$_POST["liste_pays"];

$requete="SELECT nomPersonne, prenomPersonne,

dateEntreePersonne,quotitePersonne

FROM (personne INNER JOIN site ON personne.Site_idSite =

site.idSite)

INNER JOIN Pays ON site.Pays_idPays = Pays.idPays WHERE nomPays

= '".$pays."'";

$resultat_recherche_personne=mysql_query($requete,$connexion);

if(!$resultat_recherche_personne)

{

exit("La recherche a echoué<br>");

Page 80: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 80 -

}

}

//déconnexion

$ok=mysql_close($connexion);

if(!$ok)

{

exit("La tentative de déconnexion a échoué");

}

?>

<html>

<head><title>Recherche par pays</title></head>

<body>

<form action="RechercheParPays.php" method="post">

<select name="liste_pays">

<!--affichage du contenu de la liste - utilisation de htmlentities pour

obtenir un affichage correct dans

n'importe quel navigateur-->

<?php

while ($row = mysql_fetch_row($resultat_requete)) {

echo "<OPTION>".htmlentities($row[1])."</OPTION>";

}

?>

</select>

<input type="submit" name="ok" value="Ok">

</form>

<?php

//affichage des résultats

if (sizeof($_POST)>0 and $resultat_recherche_personne)

{

//on construit un tableau

echo "<TABLE BORDER>";

while ($row = mysql_fetch_row($resultat_recherche_personne))

{

echo "<TR>";

echo "<TD>$row[0]</TD>";

echo "<TD>$row[1]</TD>";

echo "<TD>$row[2]</TD>";

echo "<TD>$row[3]</TD>";

echo "</TR>";

}

Page 81: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 81 -

echo "</TABLE BORDER>";

}

?>

</body>

</html>

Résultat

4.2. IDENTIFICATION, AUTHENTIFICATION ET OUVERTURE D’UNE SESSION

Enoncé

1) Créer dans la base annuaire une table ‘Utilisateurs’ définie par la relation (id_utilisateur, login, mot_de_passe).

2) Ecrire un script qui permette d’ajouter des utilisateurs dans la table

3) Insérer quelques lignes

4) Ecrire un script PHP qui :

5) Initialise un formulaire de demande de connexion

6) Recherche dans la base la présence du couple (login mot de passe) saisi par l’utilisateur

Page 82: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 82 -

7) Accepte ou refuse la connexion

8) Démarre une session en cas de succès en stockant le login de l’utilisateur dans la variable de session

Vérifier la bonne gestion de la session en faisant afficher le login de l’utilisateur dans une autre page.

Script d’ajout d’utilisateurs

<?php

$nom_hote='localhost';

$user='infotique';

$password='agathe';

//connexion au serveur MySQL

$connexion=mysql_connect($nom_hote,$user,$password);

//0 = false, autres valeurs = true

if(!$connexion)

{

exit( "La tentative de connexion au serveur $nom_hote a

échoué");

}

//Accès à la base de données

$db='annuaire';

$ok=mysql_select_db($db,$connexion);

if(!$ok)

{

exit( "La tentative d'Accès à la base $db a échoué");

}

if(!empty($_POST))

{

if (!empty($_POST['login'])and !empty($_POST['mot_de_passe']))

{

//on recherche le login dans la base

$login=$_POST["login"];

Page 83: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 83 -

$requete="SELECT * FROM utilisateur WHERE nom_utilisateur

= '".$login."'";

$resultat_recherche_personne=mysql_query($requete,$connexion);

if(!$resultat_recherche_personne)

{

exit("La requête a échoué<br>");

}

if(mysql_num_rows($resultat_recherche_personne)>0)

{

exit ("Utilisateur déjà enregistré");

}

$heure_connexion=time();

$requete="INSERT INTO

utilisateur(nom_utilisateur,mot_de_passe,heure_connexion)

VALUES('".$login."','".$pwd."',".$heure_connexion.")";

$resultat_recherche_personne=mysql_query($requete,$connexion);

if(!$resultat_recherche_personne)

{

exit("L' enregistrement a échoué <br>");

}

else

{

echo "l'enregistrement a réussi";

}

}

else

{

$erreur=array();

$msg=array();

if(empty($_POST['login']))

{

$erreur['login']=true;

$msg['login']="Nom utilisateur obligatoire";

}

if(empty($_POST['mot_de_passe']))

{

$erreur['pwd']=true;

$msg['pwd']="Mot de passe obligatoire";

}

}

Page 84: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 84 -

}

//déconnexion

$ok=mysql_close($connexion);

if(!$ok)

{

exit("La tentative de déconnexion a échoué");

}

?>

<html>

<head><title>Ajout utilisateur</title></head>

<body>

<form action="SaisieUtilisateur.php" method="post">

<br>

Nom utilisateur :

<input type="text" name="login"> * <?php if(isset($erreur['login']))echo

$msg['login'];?>

<br>

Mot de passe :

<input type="password" name="mot_de_passe"> * <?php

if(isset($erreur['pwd']))echo $msg['pwd'];?>

<br>

<input type="submit" name="ok" value="Ok">

</form>

</body>

</html>

Script de connexion

<?php

$nom_hote='localhost';

$user='infotique';

$password='agathe';

//connexion au serveur MySQL

$connexion=mysql_connect($nom_hote,$user,$password);

//0 = false, autres valeurs = true

Page 85: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 85 -

if(!$connexion)

{

exit( "La tentative de connexion au serveur $nom_hote a

échoué");

}

//Accès à la base de données

$db='annuaire';

$ok=mysql_select_db($db,$connexion);

if(!$ok)

{

exit( "La tentative d'Accès à la base $db a échoué");

}

if(!empty($_POST))

{

if (!empty($_POST['login'])and !empty($_POST['mot_de_passe']))

{

//on recherche le login et le mot de passe

$login=$_POST["login"];

$pwd=$_POST["mot_de_passe"];

$requete="SELECT * FROM utilisateurs WHERE

nom_utilisateur = '".$login."' AND mot_de_passe = '".$pwd."'";

$resultat_recherche_personne=mysql_query($requete,$connexion);

if(!$resultat_recherche_personne)

{

exit("La connexion ne peut être établie

avec la base <br>");

}

if(mysql_num_rows($resultat_recherche_personne)==0)

{

echo "Erreur de connexion";

}

else

{

session_start();

$_SESSION['login']=$login;

//redirection vers une page de bienvenue

header('location:Bienvenue.php');

}

Page 86: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 86 -

}

else

{

$erreur=array();

$msg=array();

if(empty($_POST['login']))

{

$erreur['login']=true;

$msg['login']="Nom utilisateur obligatoire";

}

if(empty($_POST['mot_de_passe']))

{

$erreur['pwd']=true;

$msg['pwd']="Mot de passe obligatoire";

}

}

}

//déconnexion

$ok=mysql_close($connexion);

if(!$ok)

{

exit("La tentative de déconnexion a échoué");

}

?>

<html>

<head><title>Connexion</title></head>

<body>

<form action="SaisieConnexion.php" method="post">

<br>

Nom utilisateur :

<input type="text" name="login"> * <?php if(isset($erreur['login']))echo

$msg['login'];?>

<br>

Mot de passe :

<input type="password" name="mot_de_passe"> * <?php

if(isset($erreur['pwd']))echo $msg['pwd'];?>

<br>

<input type="submit" name="ok" value="Ok">

</form>

Page 87: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 87 -

</body>

</html>

Script de création de la page de bienvenue

<?php

session_start();

echo "Bienvenue $_SESSION[login]";

?>

Résultat

Après validation :

Page 88: Bases de données relationnelles & SQL - EPHE

Bases de données relationnelles & SQL

Infotique - 88 -