Sie sind auf Seite 1von 88

Bases de données

relationnelles
& SQL

Appréhender les concepts du modèle relationnel.


Etre capable de concevoir un schéma relationnel.
Objectifs
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


Bases de données relationnelles & SQL

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

Infotique -2-
Bases de données relationnelles & SQL

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

Infotique -3-
Bases de données relationnelles & SQL

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

Infotique -4-
Bases de données relationnelles & SQL

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 ».

Infotique -5-
Bases de données relationnelles & SQL

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

Infotique -6-
Bases de données relationnelles & SQL

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.

Infotique -7-
Bases de données relationnelles & SQL

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

Infotique -8-
Bases de données relationnelles & SQL

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

Infotique -9-
Bases de données relationnelles & SQL

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).

Infotique - 10 -
Bases de données relationnelles & SQL

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 :

Infotique - 11 -
Bases de données relationnelles & SQL

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).

Infotique - 12 -
Bases de données relationnelles & SQL

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.

Infotique - 13 -
Bases de données relationnelles & SQL

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).

Infotique - 14 -
Bases de données relationnelles & SQL

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).

Infotique - 15 -
Bases de données relationnelles & SQL

 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) :

Infotique - 16 -
Bases de données relationnelles & SQL

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.

Infotique - 17 -
Bases de données relationnelles & SQL

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.

Infotique - 18 -
Bases de données relationnelles & SQL

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é.

Infotique - 19 -
Bases de données relationnelles & SQL

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.

Infotique - 20 -
Bases de données relationnelles & SQL

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,

Infotique - 21 -
Bases de données relationnelles & SQL

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).

Infotique - 22 -
Bases de données relationnelles & SQL

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é

Infotique - 23 -
Bases de données relationnelles & SQL

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 :

Infotique - 24 -
Bases de données relationnelles & SQL

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.

Infotique - 25 -
Bases de données relationnelles & SQL

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

Infotique - 26 -
Bases de données relationnelles & SQL

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)

Infotique - 27 -
Bases de données relationnelles & SQL

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 quotité code
naissance é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

Infotique - 28 -
Bases de données relationnelles & SQL

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 quotité code


naissance é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.

Infotique - 29 -
Bases de données relationnelles & SQL

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 quotité Code Code Nom Adresse


naissance établiss établiss établissement établisse
ement ement. ment
MARTIN ALBERT 01/01/195 80 2 2 CHEZ 33 rue
0 GERMAINE des fayots
DUPOND MARCEL 12/10/197 100 1 1 BEAU CAMPUS 12 rue de
8 la
recherche
DURAND ADOLPHE 13/08/196 100 1 1 BEAU CAMPUS 12 rue de
8 la
recherche
DUPUY ELIANE 12/12/196 80 2 2 CHEZ 33 rue
5 GERMAINE des fayots
DUPONT ARMELLE 05/04/198 100 1 1 BEAU CAMPUS 12 rue de
5 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

Infotique - 30 -
Bases de données relationnelles & SQL

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.

Infotique - 31 -
Bases de données relationnelles & SQL

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.

Infotique - 32 -
Bases de données relationnelles & SQL

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)

Infotique - 33 -
Bases de données relationnelles & SQL

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.

Infotique - 34 -
Bases de données relationnelles & SQL

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.

Infotique - 35 -
Bases de données relationnelles & SQL

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).

Infotique - 36 -
Bases de données relationnelles & SQL

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)

Infotique - 37 -
Bases de données relationnelles & SQL

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

Infotique - 38 -
Bases de données relationnelles & SQL

 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é.

Infotique - 39 -
Bases de données relationnelles & SQL

7.4.2. Diagramme de classe UML

7.4.3. Modèle logique des données

Infotique - 40 -
Bases de données relationnelles & SQL

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.

Infotique - 41 -
Bases de données relationnelles & SQL

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

Infotique - 42 -
Bases de données relationnelles & SQL

ON UPDATE NO ACTION
);

Infotique - 43 -
Bases de données relationnelles & SQL

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

Infotique - 44 -
Bases de données relationnelles & SQL

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,

Infotique - 45 -
Bases de données relationnelles & SQL

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

Infotique - 46 -
Bases de données relationnelles & SQL

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.

Infotique - 47 -
Bases de données relationnelles & SQL

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

Infotique - 48 -
Bases de données relationnelles & SQL

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

Infotique - 49 -
Bases de données relationnelles & SQL

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.

Infotique - 50 -
Bases de données relationnelles & SQL

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 »

Infotique - 51 -
Bases de données relationnelles & SQL

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.

Infotique - 52 -
Bases de données relationnelles & SQL

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

Infotique - 53 -
Bases de données relationnelles & SQL

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

Infotique - 54 -
Bases de données relationnelles & SQL

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

Infotique - 55 -
Bases de données relationnelles & SQL

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

Infotique - 56 -
Bases de données relationnelles & SQL

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 »

Infotique - 57 -
Bases de données relationnelles & SQL

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 …

Infotique - 58 -
Bases de données relationnelles & SQL

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

Infotique - 59 -
Bases de données relationnelles & SQL

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

Infotique - 60 -
Bases de données relationnelles & SQL

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

Infotique - 61 -
Bases de données relationnelles & SQL

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)

Infotique - 62 -
Bases de données relationnelles & SQL

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

Infotique - 63 -
Bases de données relationnelles & SQL

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.

Infotique - 64 -
Bases de données relationnelles & SQL

<?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>";
}

Infotique - 65 -
Bases de données relationnelles & SQL

//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’

Infotique - 66 -
Bases de données relationnelles & SQL

$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.

Infotique - 67 -
Bases de données relationnelles & SQL

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).

Infotique - 68 -
Bases de données relationnelles & SQL

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

Infotique - 69 -
Bases de données relationnelles & SQL

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)

Infotique - 70 -
Bases de données relationnelles & SQL

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

Infotique - 71 -
Bases de données relationnelles & SQL

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)

Infotique - 72 -
Bases de données relationnelles & SQL

 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 :

Infotique - 73 -
Bases de données relationnelles & SQL

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 :

Infotique - 74 -
Bases de données relationnelles & SQL

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`
--

Infotique - 75 -
Bases de données relationnelles & SQL

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

--
-- 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é

Infotique - 76 -
Bases de données relationnelles & SQL

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é");
}

Infotique - 77 -
Bases de données relationnelles & SQL

?>

<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

Infotique - 78 -
Bases de données relationnelles & SQL

$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>");

Infotique - 79 -
Bases de données relationnelles & SQL

}
}

//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>";
}

Infotique - 80 -
Bases de données relationnelles & SQL

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

Infotique - 81 -
Bases de données relationnelles & SQL

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"];

Infotique - 82 -
Bases de données relationnelles & SQL

$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";
}

Infotique - 83 -
Bases de données relationnelles & SQL

//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

Infotique - 84 -
Bases de données relationnelles & SQL

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');
}

Infotique - 85 -
Bases de données relationnelles & SQL

}
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>

Infotique - 86 -
Bases de données relationnelles & SQL

</body>

</html>

Script de création de la page de bienvenue

<?php
session_start();
echo "Bienvenue $_SESSION[login]";

?>

Résultat

Après validation :

Infotique - 87 -
Bases de données relationnelles & SQL

Infotique - 88 -

Das könnte Ihnen auch gefallen