Beruflich Dokumente
Kultur Dokumente
relationnelles
& SQL
Durée 3 jours
SOMMAIRE
Infotique -2-
Bases de données relationnelles & SQL
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
Infotique -3-
Bases de données relationnelles & SQL
Infotique -4-
Bases de données relationnelles & SQL
CONCEPTION DES
BASES DE DONNEES
RELATIONNELLES
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
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 ».
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.
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).
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
Un modèle de données vise la plus grande neutralité de point de vue sur le domaine considéré.
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.
Infotique -8-
Bases de données relationnelles & SQL
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).
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.
Infotique -9-
Bases de données relationnelles & SQL
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.
Infotique - 10 -
Bases de données relationnelles & SQL
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
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
Infotique - 12 -
Bases de données relationnelles & SQL
Peuvent être traitées de cette façon les associations exprimant une hiérarchie entre occurrences
d’une entité.
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
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
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é.
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
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.
Infotique - 17 -
Bases de données relationnelles & SQL
Si le domaine contient plus de quelques valeurs (une dizaine), on préfèrera construire une
entité.
Infotique - 18 -
Bases de données relationnelles & SQL
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.
)
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…).
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.
Infotique - 22 -
Bases de données relationnelles & SQL
Infotique - 23 -
Bases de données relationnelles & SQL
LE MODELE
RELATIONNEL
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
Infotique - 24 -
Bases de données relationnelles & SQL
Relation Personne : {(DUPONT, Emile, 1923), (DUPOND, Berthe, 1920), (DURAND, Joseph, 1937),
(DURANT, Amélie, 2005)}
2.3. ATTRIBUT
2.4. CLEFS
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é).
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é).
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.
Infotique - 26 -
Bases de données relationnelles & SQL
Infotique - 27 -
Bases de données relationnelles & SQL
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.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)
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))
Jointure interne
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)
Infotique - 30 -
Bases de données relationnelles & SQL
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.
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
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.
Cette contrainte est notamment utilisée sur les clefs étrangères implémentant une patte
d’association dont la cardinalité minimum est de 1.
Ou :
Infotique - 33 -
Bases de données relationnelles & SQL
La clause CHECK peut indiquer par exemple une valeur numérique minimale et maximale
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.
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.
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.
Infotique - 34 -
Bases de données relationnelles & SQL
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é.
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 :
Infotique - 35 -
Bases de données relationnelles & SQL
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.
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é.
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.
Exemple
Infotique - 37 -
Bases de données relationnelles & SQL
Exemple
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 :
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.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
Infotique - 39 -
Bases de données relationnelles & SQL
Infotique - 40 -
Bases de données relationnelles & SQL
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
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
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
Exemple
CREATE TABLE nom de table (nom de colonne1 type, nom de colonne2 type, …, nom de colonnen
type) ;
Exemple
Création de la Table Personne (voir modèle de référence plus haut)
Infotique - 45 -
Bases de données relationnelles & SQL
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.
Exemple
Ajout d’une colonne « indice » à la table Personne
Infotique - 46 -
Bases de données relationnelles & SQL
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
Ou
Exemple
3.2. MODIFICATION
Infotique - 48 -
Bases de données relationnelles & SQL
WHERE prédicat ;
Exemple
UPDATE Personne
SET indicePersonne = 1000 WHERE quotitePersonne >=80
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
Infotique - 49 -
Bases de données relationnelles & SQL
Exemple
Afficher toutes les colonnes de la table personne triées par ordre décroissant des quotités.
Exemple
Afficher les personnes née savant 1970 et dont la quotité est 50 ou 100.
Infotique - 50 -
Bases de données relationnelles & SQL
4.2.2. BETWEEN
Recherche entre deux valeurs
SELECT * FROM Table1 WHERE colonne BETWEEN valeur1 AND valeur2
Exemple
Exemple
4.2.4. LIKE
Recherche par troncature (caractère ‘%’)
SELECT * FROM nom de table WHERE colonne LIKE ‘valeur%’
Exemple
Infotique - 51 -
Bases de données relationnelles & SQL
Exemple
Afficher le nom et le prénom des personnes (en utilisant « NOM » et « PRENOM » comme titre de
colonne).
SQL permet d’utiliser un grand nombre de fonctions de type chaine de caractères, numérique et
date.
Exemple
Exemple
Afficher les 3 premières lettres du nom de chacune des personnes.
Infotique - 52 -
Bases de données relationnelles & SQL
CHAR_LENGTH
Infotique - 53 -
Bases de données relationnelles & SQL
Exemple
On veut ajouter 3 mois à une date donnée
Exemple
Infotique - 54 -
Bases de données relationnelles & SQL
Exemple
Exemple
Afficher le nom des personnes et le nom du site auquel elles sont affectées.
Autre syntaxe
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.
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.
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.
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
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.
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)
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
Infotique - 58 -
Bases de données relationnelles & SQL
MYSQL ET PHP
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.
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)
Infotique - 59 -
Bases de données relationnelles & SQL
Il est aussi possible, plutôt que d’exécuter des commandes au clavier, d’exécuter un script SQL.
Infotique - 60 -
Bases de données relationnelles & SQL
Pour traiter les exercices qui suivent, il est indispensable de posséder les autorisations
nécessaires sur la base de données.
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
Infotique - 62 -
Bases de données relationnelles & SQL
L’utilitaire PHPMYADMIN permet d’effectuer les mêmes opérations en mode moins austère.
Voir le chapitre ci-dessous
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
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).
Infotique - 64 -
Bases de données relationnelles & SQL
<?php
$nom_hote='localhost';
$user='infotique';
$password='agathe';
if($connexion)
{
echo "Connexion au serveur $nom_hote établie<br>";
}
else
{
echo "La tentative de connexion au serveur $nom_hote a
échoué<br>";
}
$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é";
}
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
Suite
$nouveau_pays='Belgique';
//préparation et exécution d'une requête
$requete = "INSERT INTO Pays(nomPays) VALUES ('".$nouveau_pays."')";
Suite
Infotique - 66 -
Bases de données relationnelles & SQL
$nouveau_pays=mysql_escape_string("Rébublique d'Abkhazie");
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()
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
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.
Après l’ajout d’un utilisateur, il est possible de lui attribuer des autorisations sur une base existante.
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
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.
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
Infotique - 71 -
Bases de données relationnelles & SQL
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é.
Infotique - 73 -
Bases de données relationnelles & SQL
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.
Infotique - 74 -
Bases de données relationnelles & SQL
Il est possible de sauvegarder, d’importer ou d’exporter des bases de données ou des tables
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.
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`
--
--
-- Contenu de la table `pays`
--
-- --------------------------------------------------------
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
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é).
Solution
<?php
$nom_hote='localhost';
$user='infotique';
$password='agathe';
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>
</body>
</html>
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';
if(!$connexion)
{
exit( "La tentative de connexion au serveur $nom_hote a
échoué");
}
$ok=mysql_select_db($db,$connexion);
if(!$ok)
{
exit( "La tentative d'Accès àla base $db a échoué");
}
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"];
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>
<?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
?>
</body>
</html>
Résultat
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
Vérifier la bonne gestion de la session en faisant afficher le login de l’utilisateur dans une autre page.
<?php
$nom_hote='localhost';
$user='infotique';
$password='agathe';
if(!$connexion)
{
exit( "La tentative de connexion au serveur $nom_hote a
échoué");
}
$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']))
{
Infotique - 82 -
Bases de données relationnelles & SQL
$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>
</body>
</html>
Script de connexion
<?php
$nom_hote='localhost';
$user='infotique';
$password='agathe';
Infotique - 84 -
Bases de données relationnelles & SQL
if(!$connexion)
{
exit( "La tentative de connexion au serveur $nom_hote a
échoué");
}
$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']))
{
$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>
Infotique - 86 -
Bases de données relationnelles & SQL
</body>
</html>
<?php
session_start();
echo "Bienvenue $_SESSION[login]";
?>
Résultat
Après validation :
Infotique - 87 -
Bases de données relationnelles & SQL
Infotique - 88 -