3 Introduction au modèle relationnel
3.1 Concepts de base
Domaine : ensemble de valeurs
Relation : ensemble de tuples
SQL : multi-ensemble
noClient nomClient noTéléphone 10 Luc Sansom (999)999-9999 20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777
40 Jean Leconte (666)666-6666 50 Hafedh Alaoui (555)555-5555 60 Marie Leconte (666)666-6666 70 Simon Lecoq (444)444-4419 80 Dollard Tremblay (333)333-3333
l i g n e / t u p l e
c o l o n n e / a t t r i b u t
t a b l e /
r e l a t i o n
suite
Deux facettes du concept de table
– Schéma d'une table (table schema)
définition de son type (intention)
ex: Client(noClient, nomClient, noTéléphone)
– Instance ou extension d'une table
état de la table
~ variable qui contient un ensemble de lignes
modifications d ’état
Schéma relationnel
– ensemble de schémas de tables
Instance de BD VentesPleinDeFoin
Table Commande
noCommande dateCommande noClient
1 01/ 06/ 2000 10
2 02/ 06/ 2000 20
3 02/ 06/ 2000 10
4 05/ 07/ 2000 10
5 09/ 07/ 2000 30
6 09/ 07/ 2000 20
7 15/ 07/ 2000 40
8 15/ 07/ 2000 40
Table LigneCommande noCommande noArticle quantité
1 10 10
1 70 5
1 90 1
2 40 2
2 95 3
3 20 1
4 40 1
4 50 1
5 70 3
5 10 5
5 20 5
6 10 5
6 40 1
7 50 1
7 95 2
8 20 3
Table Article
noArticle description prixUnitaire quantitéEnStock 10 Cèdre en boule 10.99 10
20 Sapin 12.99 10
40 Epinette bleue 25.99 10
50 Chêne 22.99 10
60 Erable argenté 15.99 10
70 Herbe à puce 10.99 10
80 Poirier 26.99 10
Table DétailLivraison
noLivraison noCommande noArticle quantitéLivrée
100 1 10 7
100 1 70 5
101 1 10 3
102 2 40 2
102 2 95 1
100 3 20 1
103 1 90 1
104 4 40 1
105 5 70 2
Table Livraison noLivraison dateLivraison 100 3/ 06/ 2000 101 4/ 06/ 2000 102 4/ 06/ 2000 103 5/ 06/ 2000 104 7/ 07/ 2000 105 9/ 07/ 2000 Table Client
noClient nomClient noTéléphone 10 Luc Sansom (999)999-9999 20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777
40 Jean Leconte (666)666-6666
50 Hafedh Alaoui (555)555-5555
60 Marie Leconte (666)666-6666
70 Simon Lecoq (444)444-4419
80 Dollard Tremblay (333)333-3333
3.2 Contraintes d'intégrité du modèle relationnel 3.2.1 Contrainte de domaine et de valeur non nulle
T(A 1 : D 1, A 2 : D 2 , …, A n : D n )
– D i : domaine de A i
Valeur nulle
– Comportement particulier
– Valeur inconnue
– Valeur non applicable
– ...
3.2.2 Clé primaire et contrainte d'entité
Clé unique (unique key)
– ou superclé (superkey )
– identifiant
Clé candidate (candidate key)
– clé unique minimale
Clé primaire (primary key)
– sert de mécanisme de référence aux lignes de la table
Contrainte d'entité (entity constraint)
clé primaire
– non nulle
3.2.3 Contrainte
d'intégrité référentielle
Clé étrangère non nulle clé primaire
noClient nomClient noTéléphone
10 Luc Sansom (999)999-9999
20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777
40 Jean Leconte (666)666-6666 50 Hafedh Alaoui (555)555-5555 60 Marie Leconte (666)666-6666 70 Simon Lecoq (444)444-4419 80 Dollard Tremblay (333)333-3333 noCommande dateCommande noClient
1 01/ 06/ 2000 10
2 02/ 06/ 2000 20
3 02/ 06/ 2000 10
4 05/ 07/ 2000 10
5 09/ 07/ 2000 30
6 09/ 07/ 2000 20
7 15/ 07/ 2000 40
8 15/ 07/ 2000 40
T a b l e C o m m a n d e T a b l e C l ie n t
C lé é t r a n g è r e C lé p r im a ir e
Représentation UML
Commande
{Clé primaire : noCommande}
noCommande : INTEGER dateCommande : DATE noClient : INTEGER
<<Table>>
Client
{Clé primaire : noClient}
noClient : INTEGER nomClient : VARCHAR noTéléphone : VARCHAR
<<Table>>
LigneCommande
{Clé primaire : noCommande, noArticle}
noCommande : INTEGER noArticle : INTEGER quantité : INTEGER
<<Table>>
Article
{Clé primaire : noArticle}
noArticle : INTEGER description : VARCHAR prixUnitaire : DECIMAL quantitéEnStock : INTEGER
<<Table>>
Livraison
{Clé primaire : noLivraison}
noLivraison : INTEGER dateLivraison : DATE
<<Table>> DétailLivraison
{Clé primaire : noLivraison, noCommande, noArticle}
noLivraison : INTEGER noCommande : INTEGER noArticle : INTEGER quantitéLivrée : INTEGER
<<Table>>
Nom clé étrangère nom clé primaire
Étiquette de la relation de dépendance
numéroClient Client
{Clé primaire : noClient}
noClient : INTEGER nomClient : VARCHAR noTéléphone : VARCHAR
<<Table>>
Commande
{Clé primaire : noCommande}
noCommande : INTEGER dateCommande : DATE numéroClient : INTEGER
<<Table>>
3.3 Conception logique : traduction du modèle conceptuel de données en schéma conceptuel relationnel
Output : schéma relationnel (niveau conceptuel)
– tables
– colonnes
types, domaines, ...
– contraintes d ’intégrité
clés primaires, étrangères, ...
Input à la conception
– modèle conceptuel des données
3.3.1 Première ébauche du
schéma : une table par classe
Personne
<<table>>
Membre
<<table>> PrêtEnCours
<<table>>
PrêtArchivé
<<table>>
Employé
<<table>>
<<table>>
Auteur
<<table>>
Editeur
<<table>>
Livre
<<table>> Exemplaire
<<table>>
Prêt
<<table>>
Utilisateur
<<table>>
3.3.2 Traduction des attributs
Attribut de la classe -> colonne de la table
Livre {Clé candidate: ISBN}
ISBN : CHAR(13) titre : VARCHAR(50)
annéeParution : DomaineAnnée
<<table>>
Livre {UNIQUE: ISBN}
ISBN : String titre : String
annéeParution : TypeDonnéesAnnée
3.3.2.1 TRADUCTION DES CONTRAINTES D'IDENTIFICATION (UNIQUE)
Contrainte UNIQUE -> clé candidate relationnelle
– clé primaire ?
Livre {Clé candidate: ISBN}
ISBN : CHAR(13) titre : VARCHAR(50)
annéeParution : DomaineAnnée
<<table>>
Livre {UNIQUE: ISBN}
ISBN : String titre : String
annéeParution : TypeDonnéesAnnée
3.3.2.2 TRADUCTION DES TYPES DE DONNÉES
Type OCL Type SQL2 Oracle 8
Boolean BIT(1) Non supporté (utiliser CHAR(1) + CHECK)
Integer INTEGER ou SMALLINT NUMBER(n)
String CHARACTER (CHAR) (n), CHARACTER
VARYING (VARCHAR) (n) VARCHAR2(n), LONG ou LONG VARCHAR (chaîne jusqu'à 2G), CLOB (chaîne jusqu'à 4G), NCLOB (chaîne pour caractères encodés sur plusieurs octets)
Real NUMERIC(p,s) (précision exacte),
DECIMAL(p,s), REAL, DOUBLE PRECISION, FLOAT(p)
NUMBER(p,s)
Enum{v1,…vn} CHARACTER (CHAR) ou VARCHER + CHECK … IN (v1,…,vn) (possibilité de création de domaine)
Domaine non supporté
DATE DATE inclut TIME
TIME
TIMESTAMP
BIT(n), BIT VARYING(n) RAW(n : max = 255), LONG RAW (binaire jusqu'à 2G), BLOB (binaire jusqu'à 4G)
BFILE (pointeur à un fichier externe)
Types de données déclarés
Domaine pas toujours supporté par le dialecte SQL
Livre {UNIQUE: ISBN}
ISBN : String titre : String
annéeParution : TypeDonnéesAnnée
TypeDonnéesAnnée {Integer > 0 }
<<datatype>>
Livre {Clé candidate: ISBN}
ISBN : CHAR(13) titre : VARCHAR(50)
annéeParution : DomaineAnnée
<<table>>
DomaineAnnée {INTEGER CHECK value > 0 }
<<domain>>
3.3.2.3 TYPES ÉNUMÉRÉS
Petit domaine invariant
– création d ’un domaine VARCHAR + CHECK
Exemplaire
{Clé candidate : idExemplaire}
idExemplaire : VARCHAR(10) dateAchat : Date
statut : DomaineStatut
<<table>>
DomaineStatut
{VARCHAR(15) CHECK value IN ('prêté','disponible','retiré')}
<<domain>>
Exemplaire {UNIQUE: idExemplaire}
idExemplaire : String dateAchat : Date
statut : enum(prêté, disponible, retiré)
Création d ’une table
Gros domaine ou extensible
– création d ’une table à part
– utilisé comme liste de valeurs (LOV Designer)
– introduction d ’une clé primaire artificielle ?
Exemplaire
{Clé candidate : idExemplaire}
idExemplaire : VARCHAR(10) dateAchat : Date
statut : VARCHAR(15)
<<table>>
DomaineStatut {Clé primaire : statut}
statut : VARCHAR(15)
<<table>>
3.3.2.4 TYPES COMPLEXES
1. Représentation explicite des attributs du type complexe
Membre
adresse : typeDonnéesAdresse
typeDonnéesAdresse numéroCivique
numéroAppartement nomRue
nomVille nomProvince nomPays codePostal
<<datatype>>
Membre numéroCivique
numéroAppartement nomRue
nomVille nomProvince nomPays codePostal
<<table>>
2. Création d'une nouvelle table
N.B. Pas de partage de la même adresse !
Membre
{Clé primaire : idMembre}
idMembre
<<table>>
Adresse
{Clé primaire : idMembre}
idMembre numéroCivique numéroAppartement nomRue
nomVille nomProvince nomPays codePostal
<<table>>
Membre
adresse : typeDonnéesAdresse
typeDonnéesAdresse numéroCivique
numéroAppartement nomRue
nomVille nomProvince nomPays codePostal
<<datatype>>
3.3.2.5 QUALIFICATEUR
Colonne dans la table du rôle opposé
– voir 3.3.3.2
Groupe nbMaximumInscrits Cours
{UNIQUE:sigle}
sigle titre
nbCrédits 1 0..1
numéro session numéro
session
1 0..1
Groupe
{Clé primaire : sigle, numéro, session}
sigle numéro session
nbMaximumInscrits
<<table>>
Cours {Clé primaire :sigle}
sigle titre nbCrédits
<<table>>
3.3.2.6 DISCRIMINANT
Redondant ? Utilisateur
{UNIQUE :idUtilisateur}
idUtilisateur : String motPasse : String catégorieUtilisateur
Membre
téléphoneRésidence : String
$ nbMaxPrêts : Integer = 5
$ duréeMaxPrêts : Integer = 7 Employé
{UNIQUE : codeMatricule}
codeMatricule : String
catégorieEmployé : enum(bibliothécaire, commis)
{disjointe, complète}
Utilisateur {Clé candidate : idUtilisateur}
idUtilisateur : VARCHAR(10) motPasse : VARCHAR(10)
catégorieUtilisateur : DomaineCatégorieUtilisateur
<<table>>
DomaineCatégorieUtilisateur
{VARCHAR(14) CHECK value IN ('employé, 'membre')}
<<domain>>
3.3.2.7 ATTRIBUT MULTIVALUÉ
Table à part
– clé étrangère + colonne pour l ’attribut
Petit tableau de taille fixe
– n colonnes (valeurs nulles)
Encodage
– invisible au SGBD
Oracle8
– VARRAY, NESTED TABLE
3.3.2.8 COMPRESSION DES VALEURS DES ATTRIBUTS DE GRANDE TAILLE
Supporté par le SGBD ?
Multimédia
3.3.2.9 CRÉATION DE TABLES SUPPLÉMENTAIRES POUR LES ATTRIBUTS DE CLASSE
MembreGénéral nbMaxPrêts : INTEGER = 5 duréeMaxPrêts : INTEGER = 7
<<table>>
Membre
téléphoneRésidence : String
$ nbMaxPrêts : Integer = 5
$ duréeMaxPrêts : Integer = 7
Membre
téléphoneRésidence : VARCHAR(15)
<<table>>
3.3.3 Réalisation de l'identité par les clés primaires
MembreGénéral {Clé primaire : noSequence}
noSequence
<<table>>
Personne
{Clé primaire : noSequence}
noSequence : INTEGER nom : VARCHAR2(20) prénom : VARCHAR2(20)
<<table>>
Membre {Clé primaire : noSequence}
noSequence : INTEGER
téléphoneRésidence : VARCHAR(15)
<<table>>
PrêtEnCours {Clé primaire : noSequence}
noSequence : INTEGER
<<table>>
PrêtArchivé
{Clé primaire : noSequence}
noSequence : INTEGER dateRetour : DATE
<<table>>
Employé {Clé primaire : noSequence}
noSequence : INTEGER {Clé candidate : codeMatricule}
codeMatricule : CHAR(6)
catégorieEmployé : DomaineCatégorieEmployé
<<table>>
Catégorie
<<table>>
Auteur
{Clé primaire : noSequence}
noSequence
<<table>>
Editeur
<<table>>
Livre {Clé primaire : ISBN}
ISBN : CHAR(13) titre : VARCHAR(50)
annéeParution : DomaineAnnée
<<table>> Exemplaire
{Clé primaire : idExemplaire}
idExemplaire : VARCHAR(10) dateAchat : Date
statut : DomaineStatut
<<table>>
Prêt
{Clé primaire : noSequence}
noSequence : INTEGER datePrêt : DATE
<<table>>
Utilisateur {Clé primaire : noSequence}
noSequence
{Clé candidate : idUtilisateur}
idUtilisateur : VARCHAR(10) motPasse : VARCHAR(10)
catégorieUtilisateur : DomaineCatégorieUtilisateur
<<table>>
AuteurLivre
{Clé primaire : noSequence, ISBN}
noSequence ISBN
3.3.3.1 CRÉATION D'UNE CLÉ PRIMAIRE ARTIFICIELLE
De manière systématique ?
Mécanisme de SEQUENCE Oracle
PrêtArchivé
{Clé primaire : noSequence}
noSequence : INTEGER dateRetour : DATE
<<table>>
PrêtEnCours
{Clé primaire : noSequence}
noSequence : INTEGER
<<table>>
Prêt
{Clé primaire : noSequence}
noSequence : INTEGER datePrêt : DATE
<<table>>
Prêt
datePrêt : Date
PrêtArchivé dateRetour : Date
PrêtEnCours
3.3.3.2 UTILISATION D'UN IDENTIFIANT NATUREL COMME CLÉ PRIMAIRE
1. Utilisation d'un identifiant naturel (UNIQUE)
Si identifiant naturel trop lourd
– introduire clé primaire artificielle Livre
{Clé candidate: ISBN}
ISBN : CHAR(13) titre : VARCHAR(50)
annéeParution : DomaineAnnée
<<table>>
Livre {Clé primaire: ISBN}
ISBN : CHAR(13) titre : VARCHAR(50)
annéeParution : DomaineAnnée
<<table>>
2. Utilisation du qualificateur
Groupe nbMaximumInscrits Cours
{UNIQUE:sigle}
sigle titre
nbCrédits 1 0..1
numéro session numéro
session
1 0..1
Groupe
{Clé primaire : sigle, numéro, session}
sigle numéro session
nbMaximumInscrits
<<table>>
Cours
{Clé primaire :sigle}
sigle titre
nbCrédits
<<table>>
3.3.3.3 IDENTIFIANT NATUREL POUR UNE SPÉCIALISATION
Éviter de changer de clé primaire dans le contexte d ’une hiérarchie de généralisation
Si la table du parent est omise
– considérer identifiant naturel de la
spécialisation
3.3.4 Traduction des associations
Prêt
{Clé primaire : noSequence}
noSequence : INTEGER datePrêt : DATE
noSequenceUtilisateur : INTEGER idExemplaire : VARCHAR(10)
<<table>>
Personne
{Clé primaire : noSequence}
noSequence : INTEGER nom : VARCHAR2(20) prénom : VARCHAR2(20)
<<table>>
Membre {Clé primaire : noSequence}
noSequence : INTEGER
téléphoneRésidence : VARCHAR(15)
<<table>>
PrêtEnCours {Clé primaire : noSequence}
noSequence : INTEGER
<<table>>
PrêtArchivé {Clé primaire : noSequence}
noSequence : INTEGER dateRetour : DATE
<<table>>
Employé {Clé primaire : noSequence}
noSequence : INTEGER {Clé candidate : codeMatricule}
codeMatricule : CHAR(6)
catégorieEmployé : DomaineCatégorieEmployé
<<table>>
Catégorie {Clé primaire : code}
code : VARCHAR(10) descripteur : VARCHAR(20) codeParent : VARCHAR(10)
<<table>>
Auteur
{Clé primaire : noSequence}
noSequence : INTEGER
<<table>>
Editeur
{Clé primaire : nomEditeur}
<<table>>
Livre {Clé primaire : ISBN}
ISBN : CHAR(13) titre : VARCHAR(50)
annéeParution : DomaineAnnée nomEditeur : VARCHAR(20) code : VARCHAR(10)
<<table>> Exemplaire
{Clé primaire : idExemplaire}
idExemplaire : VARCHAR(10) dateAchat : Date
statut : DomaineStatut ISBN : CHAR(13)
<<table>>
Utilisateur {Clé primaire : noSequence}
noSequence
{Clé candidate : idUtilisateur}
idUtilisateur : VARCHAR(10) motPasse : VARCHAR(10)
catégorieUtilisateur : DomaineCatégorieUtilisateur
<<table>>
MembreGénéral
<<table>>
AuteurLivre
{Clé primaire : noSequence, ISBN}
noSequence : INTEGER
{Clé candidate : ISBN, ordreAuteur}
ISBN : CHAR(13) ordreAuteur : INTEGER
<<table>>
{Un Auteur ne peut exister sans AuteurLivre}
{Un Livre ne peut exister sans AuteurLivre}
noSequenceUtilisateur
{Un Livre ne peut exister sans Exemplaire}
3.3.4.1 CAS GÉNÉRAL : TRADUCTION D'UNE ASSOCIATION PAR UNE TABLE
Auteur
{Clé primaire : noSequence}
noSequence : INTEGER
<<table>> Livre
{Clé primaire : ISBN}
ISBN : CHAR(13) titre : VARCHAR(50)
annéeParution : DomaineAnnée
<<table>>
AuteurLivre
{Clé primaire : noSequence, ISBN}
noSequence : INTEGER ISBN : CHAR(13)
<<table>>
{Un Auteur ne peut exister
sans AuteurLivre} {Un Livre ne peut exister
sans AuteurLivre}
Auteur
1..* 1..*
1..* 1..*
Livre {UNIQUE: ISBN}
ISBN : String titre : String
annéeParution : TypeDonnéesAnnée
3.3.4.2 TRADUCTION D'UN RÔLE
ORDONNÉ POUR UNE ASSOCIATION
Auteur
1..* 1..*
1..* 1..*
Livre {UNIQUE: ISBN}
ISBN : String titre : String
annéeParution : TypeDonnéesAnnée {ordonné}
A u teu r
{C lé p rim a ire : n o S e q u e n c e } n o S eq u e n c e : IN T E G E R
< < ta ble > >
A u te u rL iv re
{C lé p rim a ire : n o S e q u en c e , IS B N } n o S e q u e n c e : IN T E G E R
{ C lé c a n d id a te : IS B N , o rd re A u te u r } IS B N : C H A R (1 3 )
o rd re A u te u r : IN T E G E R
< < ta b le > >
L ivre {C lé p rim a ire : IS B N } IS B N : C H A R (1 3 ) titre : V A R C H A R (5 0 )
a n n é e P a ru tio n : D o m a in e A n n é e
< < ta b le > >
3.3.4.3 CLASSE ASSOCIATIVE
Cours {UNIQUE : sigle}
sigle titre nbCrédits Etudiant
{UNIQUE : codePermanent}
codePermanent nom
prénom * * * *
NoteObtenue note
session
Cours
{Clé primaire : sigle}
sigle titre nbCrédits
<<table>>
Etudiant
{Clé primaire : codePermanent}
codePermanent nom
prénom
<<table>>
NoteObtenue
{Clé primaire : codePermament, sigle}
codePermament sigle
note session
<<table>>
3.3.4.4 CAS UN À PLUSIEURS
1. Traduction par une table ?
Catégorie {UNIQUE: code}
code : String
descripteur : String 1 1 **
Livre {UNIQUE: ISBN}
ISBN : String titre : String
annéeParution : TypeDonnéesAnnée
Livre {C lé prim aire : IS B N } IS B N : C H A R(13) titre : V A R C H A R (50 )
annéeP arution : D om aineA nné e
< < table> >
C atégorie {C lé prim aire : code}
code : V A R C H A R(10) descripteu r : V A R C H A R (20)
< < table> >
C atég orieLivre {C lé prim aire : IS B N } IS B N : C H A R(13) code : V A R C H A R(10 )
< < table> >
2. Traduction par l'ajout d'une clé étrangère à privilégier
Navigation plus performante
Catégorie {UNIQUE: code}
code : String
descripteur : String 1 1 **
Livre {UNIQUE: ISBN}
ISBN : String titre : String
annéeParution : TypeDonnéesAnnée
Livre {Clé primaire : ISBN}
ISBN : CHAR(13) titre : VARCHAR(50)
annéeParution : DomaineAnnée code : VARCHAR(10)
<<table>>
Catégorie {Clé primaire : code}
code : VARCHAR(10)
descripteur : VARCHAR(20)
<<table>>
Renommer la clé
étrangère au besoin
Utilisateur {Clé primaire : noSequence}
noSequence
{Clé candidate : idUtilisateur}
idUtilisateur : VARCHAR(10) motPasse : VARCHAR(10)
catégorieUtilisateur : DomaineCatégorieUtilisateur
<<table>>
noSequenceUtilisateur
Prêt {Clé primaire : noSequence}
noSequence : INTEGER datePrêt : DATE
noSequenceUtilisateur : INTEGER idExemplaire : VARCHAR(10)
<<table>>
3.3.4.5 CAS UN À UN
1. Une clé étrangère (du côté obligatoire)
Passeport
{UNIQUE : noPasseport}
noPasseport dateExpiration Citoyen
{UNIQUE : noAssurranceSociale}
noAssurranceSociale nom
prénom
0..1
1 0..1
1
Passeport {Clé primaire : noPasseport}
noPasseport dateExpiration
{Clé candidate : noAssurranceSociale}
noAssurranceSociale
<<table>>
Citoyen
{Clé primaire : noAssurranceSociale}
noAssurranceSociale nom
prénom
<<table>>
2. Une nouvelle table
Homme
{UNIQUE : noAssurranceSociale}
noAssurranceSociale nom
prénom
Femme
{UNIQUE : noAssurranceSociale}
noAssurranceSociale nom
prénom 0..1
0..1
0..1 0..1
grasAVie vieAGras
Mariage
Homme
{Clé primaire : noAssurranceSociale}
noAssurranceSociale nom
prénom
<<table>>
Femme
{Clé primaire : noAssurranceSociale}
noAssurranceSociale nom
prénom
<<table>>
Mariage
{Clé candidate : noAssSocFemme}
noAssSocFemme
{Clé candidate : noAssSocHomme}
noAssSocHomme
<<table>>
3. Fusion
Cas 1-1 obligatoire
3.3.4.6 CAS DE L'AGRÉGATION
Comme une association normale
Catégorie {UNIQUE: code}
code : String
descripteur : String
enfant
0..1
* parent 0..1
*
Catégorie {Clé primaire : code}
code : VARCHAR(10)
descripteur : VARCHAR(20) codeParent : VARCHAR(10)
<<table>>
codeParent
Composition
Cas 1-1
– ~ attribut complexe
Mode SQL CASCADE
Oracle8
– VARRAY, NESTED TABLE
3.3.5 Traduction des relations de généralisation/spécialisation
Délégation
Fusion
Concaténation
3.3.5.1 DÉLÉGATION
Personne
{Clé primaire : noSequence}
noSequence : INTEGER nom : VARCHAR2(20) prénom : VARCHAR2(20)
<<table>>
Membre {Clé primaire : noSequence}
noSequence : INTEGER
téléphoneRésidence : VARCHAR(15)
<<table>>
Employé {Clé primaire : noSequence}
noSequence : INTEGER {Clé candidate : codeMatricule}
codeMatricule : CHAR(6)
catégorieEmployé : DomaineCatégorieEmployé
<<table>>
Auteur
{Clé primaire : noSequence}
noSequence : INTEGER
<<table>>
Utilisateur {Clé primaire : noSequence}
noSequence : INTEGER {Clé candidate : idUtilisateur}
idUtilisateur : VARCHAR(10) motPasse : VARCHAR(10)
/ catégorieUtilisateur : DomaineCatégorieUtilisateur
<<table>>
{catégorieUtilisateur doit être
cohérent avec la table
d'appartenance de l'objet}
Changement de clé primaire ?
Extraire le téléphone résidence d'un Membre possédant l'idUtilisateur
12345
Personne
{Clé primaire : noSequence}
noSequence : INTEGER nom : VARCHAR2(20) prénom : VARCHAR2(20)
<<table>> Utilisateur
{Clé candidate : noSequence}
noSequence
{Clé primaire : idUtilisateur}
idUtilisateur : VARCHAR(10) motPasse : VARCHAR(10)
catégorieUtilisateur : DomaineCatégorieUtilisateur
<<table>>
Employé {Clé primaire : idUtilisateur}
idUtilisateur : VARCHAR(10) {Clé candidate : codeMatricule}
codeMatricule : CHAR(6)
catégorieEmployé : DomaineCatégorieEmployé
<<table>>
Membre {Clé primaire : idUtilisateur}
idUtilisateur : VARCHAR(10)
téléphoneRésidence : VARCHAR(15)
<<table>>
Traduction de la contrainte {disjointe, complète}
Prêt
{Clé primaire : noSequence}
noSequence : INTEGER datePrêt : DATE
noSequenceUtilisateur : INTEGER idExemplaire : VARCHAR(10)
<<table>>
{Exclusives et une des deux est nécessaire}
PrêtArchivé
{Clé primaire : noSequence}
noSequence : INTEGER dateRetour : DATE
<<table>>
PrêtEnCours
{Clé primaire : noSequence}
noSequence : INTEGER
<<table>>
Prêt datePrêt : Date {disjointe, complète}
PrêtArchivé dateRetour : Date
PrêtEnCours
3.3.5.1.1 Cas de la multi-classification et de l'héritage multiple
Auteur
{Clé prim aire : noS equence}
noS equence
<<table>>
Utilisateur {Clé prim aire : noS equenc e}
noS equenc e
{Clé c andidate : idUtilisateur}
idUtilis ateur : VARC HAR(10) m otP asse : VAR CHAR(10)
catégorieUtilisateur : D om aineC atégorieUtilis ateur
<<table>>
Em ployé {Clé prim aire : noS equenc e}
noS equenc e : INTEG ER {Clé c andidate : c odeM atricule}
codeM atric ule : CH AR(6)
catégorieE m ployé : D om aineC atégorieEm ployé
<<table>>
M em bre {Clé prim aire : noS equenc e}
noS equenc e : INT EG ER
téléphoneR ésidenc e : VARCH AR(15)
<<table>>
AuteurM em bre {Clé prim aire : noS equenc e}
noS equenc e
1. Créer une table de jointure
Alternatives
2. Identité commune sans table de jointure
3. Identité séparée et redondance
de données
3.3.5.2 ANALOGIE AVEC UNE ASSOCIATION UN À UN
Clé étrangère
– dans l ’enfant
– dans le parent ???
Approche Arc de Designer
Fusion
– vers le parent (approche par fusion)
– vers l ’enfant (approche par concaténation)
Nouvelle table ???
3.3.5.3 FUSION
Prêt {Clé primaire : noSequence}
noSequence : INTEGER datePrêt : DATE
noSequenceUtilisateur : INTEGER idExemplaire : VARCHAR(10)
{catégoriePrêt = 'prêtEnCours' ssi dateRetour nulle}
dateRetour[0..1] : DATE
catégoriePrêt : DomaineCatégoriePrêt
<<table>>
DomaineCatégoriePrêt
{VARCHAR(15) CHECK valeur IN ('prêtEnCours', 'prêtArchivé')}
<<domain>>
Prêt
{Clé primaire : noSequence}
noSequence : INTEGER datePrêt : DATE
noSequenceUtilisateur : INTEGER idExemplaire : VARCHAR(10)
<<table>>
{Exclusives et une des deux est nécessaire}
PrêtArchivé
{Clé primaire : noSequence}
noSequence : INTEGER dateRetour : DATE
<<table>>
PrêtEnCours
{Clé primaire : noSequence}
noSequence : INTEGER
<<table>>
3.3.5.4 CONCATÉNATION
{La contrainte de clé primaire est globale pour les deux tables}
PrêtEnCours {Clé primaire : noSequence}
noSequence : INTEGER datePrêt : DATE
noSequenceUtilisateur : INTEGER idExemplaire : VARCHAR(10)
<<table>>
PrêtArchivé {Clé primaire : noSequence}
noSequence : INTEGER dateRetour : DATE datePrêt : DATE
noSequenceUtilisateur : INTEGER idExemplaire : VARCHAR(10)
<<table>>
Exemplaire
{Clé primaire : idExemplaire}
idExemplaire : VARCHAR(10) dateAchat : Date
statut : DomaineStatut ISBN : CHAR(13)
<<table>>
Utilisateur {Clé candidate : noSequence}
noSequence
{Clé primaire : idUtilisateur}
idUtilisateur : VARCHAR(10) motPasse : VARCHAR(10)
catégorieUtilisateur : DomaineCatégorieUtilisateur
<<table>>
noSequenceUtilisateur noSequenceUtilisateur
Prêt
{Clé primaire : noSequence}
noSequence : INTEGER datePrêt : DATE
noSequenceUtilisateur : INTEGER idExemplaire : VARCHAR(10)
<<table>>
{Exclusives et une des deux est nécessaire}
PrêtArchivé
{Clé primaire : noSequence}
noSequence : INTEGER dateRetour : DATE
<<table>>
PrêtEnCours
{Clé primaire : noSequence}
noSequence : INTEGER
<<table>>
Conserver une table
pour le parent ?
Cas d ’une référence au parent
Membre {Clé primaire : noSequence}
noSequence : INTEGER nom : VARCHAR2(20) prénom : VARCHAR2(20) {Clé candidate : idUtilisateur}
idUtilisatuer : VARCHAR(10) motPasse : VARCHAR(10)
<<table>>
Employé {Clé primaire : noSequence}
noSequence : INTEGER nom : VARCHAR2(20) prénom : VARCHAR2(20) {Clé candidate : idUtilisateur}
idUtilisateur : VARCHAR(10) motPasse : VARCHAR(10)
catégorieEmployé : DomaineCatégorieEmployé {Clé candidate : codeMatricule}
codeMatricule : CHAR(6)
<<table>>
{exclusives}
noSequenceEmployé
noSequenceMembre
Prêt
{Clé primaire : noSequence}
noSequence : INTEGER datePrêt : DATE
noSequenceEmployé : INTEGER noSequenceMembre : INTEGER idExemplaire : VARCHAR(10)
<<table>>
3.3.5.5 TRADUCTION DES GÉNÉRALISATIONS POUR SYLERAT
Membre {Clé primaire : idUtilisateur}
idUtilisateur : VARCHAR(10)
téléphoneRésidence : VARCHAR(15)
<<table>>
PrêtEnCours {Clé primaire : noSequence}
noSequence : INTEGER datePrêt : DATE
idUtilisateur : VARCHAR(10) idExemplaire : VARCHAR(10)
<<table>>
PrêtArchivé {Clé primaire : noSequence}
noSequence : INTEGER dateRetour : DATE datePrêt : DATE
idUtilisateur : VARCHAR(10) idExemplaire : VARCHAR(10)
<<table>>
Employé {Clé primaire : idUtilisateur}
idUtilisateur : VARCHAR(10) {Clé candidate : codeMatricule}
codeMatricule : CHAR(6)
catégorieEmployé : DomaineCatégorieEmployé
<<table>>
Catégorie {Clé primaire : code}
code : VARCHAR(10) descripteur : VARCHAR(20) codeParent : VARCHAR(10)
<<table>>
Auteur
{Clé primaire : noSequence}
noSequence : INTEGER nom : VARCHAR2(20) prénom : VARCHAR2(20)
<<table>>
Editeur
{Clé primaire : nomEditeur}
<<table>>
Livre {Clé primaire : ISBN}
ISBN : CHAR(13) titre : VARCHAR(50)
annéeParution : DomaineAnnée nomEditeur : VARCHAR(20) code : VARCHAR(10)
<<table>> Exemplaire
{Clé primaire : idExemplaire}
idExemplaire : VARCHAR(10) dateAchat : Date
statut : DomaineStatut ISBN : CHAR(13)
<<table>>
Utilisateur {Clé primaire : idUtilisateur}
idUtilisateur : VARCHAR(10) motPasse : VARCHAR(10) nom : VARCHAR2(20) prénom : VARCHAR2(20)
/ catégorieUtilisateur : DomaineCatégorieUtilisateur
<<table>>
MembreGénéral {Clé primaire : noSequence}
<<table>>
AuteurLivre
{Clé primaire : noSequence, ISBN}
noSequence : INTEGER
{Clé candidate : ISBN, ordreAuteur}
ISBN : CHAR(13) ordreAuteur : INTEGER
<<table>>
{Un Auteur ne peut exister sans AuteurLivre}
{Un Livre ne peut exister sans AuteurLivre}
{Un Livre ne peut exister sans Exemplaire}
{Exclusives et une des deux est nécessaire}
{CatégorieUtilisateur doit être cohérente avec la table d'appartenance}
{Lors d'un retour le PrêtArchivé est généré à partir du PrêtEn Cours en réutilisant le même noSequence}
3.3.6 Traduction des autres contraintes
PrêtEnCours
{Clé primaire : idExemplaire}
idExemplaire : VARCHAR(10) datePrêt : DATE
idUtilisateur : VARCHAR(10)
<<table>>
PrêtArchivé
{Clé primaire : noSequence}
noSequence : INTEGER {dateRetour >= datePrêt}
dateRetour : DATE datePrêt : DATE
idUtilisateur : VARCHAR(10) idExemplaire : VARCHAR(10)
<<table>>
Exemplaire
{Clé primaire : idExemplaire}
idExemplaire : VARCHAR(10) dateAchat : Date
<<table>>
MembreGénéral {Clé primaire : noSequence}
noSequence
nbMaxPrêts : INTEGER = 5 duréeMaxPrêts : INTEGER = 7
<<table>>
{statut = 'prêté' si et seulement si un Prêt EnCours fait référence à l'Exemplaire}
{Le nombre de PrêtEnCours d'un Membre <= nbMaxPrêts}
Utilisateur {Clé primaire : idUtilisateur}
idUtilisateur : VARCHAR(10) motPasse : VARCHAR(10) nom : VARCHAR2(20) prénom : VARCHAR2(20)
/ catégorieUtilisateur : DomaineCatégorieUtilisateur
<<table>>
Membre {Clé primaire : idUtilisateur}
idUtilisateur : VARCHAR(10)
téléphoneRésidence : VARCHAR(15)
<<table>>
3.4 Algèbre relationnelle
Opérations de manipulation de données
Entrée
– une table : opération unaire
– deux tables : opération binaire
Sortie
– une table
– permet la composition
Origine de SQL (« SQUARE de IBM, San Jose »)
3.4.1 Sélection ()
Table Article
noArticle description prixUnitaire quantitéEnStock
10 Cèdre en boule 10.99 10
20 Sapin 12.99 10
40 Epinette bleue 25.99 10
50 Chêne 22.99 10
60 Erable argenté 15.99 10
70 Herbe à puce 10.99 10
80 Poirier 26.99 10
81 Catalpa 25.99 10
90 Pommier 25.99 10
95 Génévrier 15.99 10
noArticle description prixUnitaire quantitéEnStock
60 Erable argenté 15.99 10
70 Herbe à puce 10.99 10
95 Génévrier 15.99 10
prixUnitaire < 20.00 ET noArticle > 30 (Article)
3.4.2 Projection ()
noClient, dateCommande (Commande)
Table Commande
noCommande dateCommande noClient
1 01/ 06/ 2000 10
2 02/ 06/ 2000 20
3 02/ 06/ 2000 10
4 05/ 07/ 2000 10
5 09/ 07/ 2000 30
6 09/ 07/ 2000 20
7 15/ 07/ 2000 40
8 15/ 07/ 2000 40
noClient dateCommande
10 01/ 06/ 2000
20 02/ 06/ 2000
10 02/ 06/ 2000
10 05/ 07/ 2000
30 09/ 07/ 2000
20 09/ 07/ 2000
40 15/ 07/ 2000
3.4.3 Expressions complexes
noClient, dateCommande ( dateCommande > 05/07/2000 Commande)
Table Commande
noCommande dateCommande noClient
1 01/ 06/ 2000 10
2 02/ 06/ 2000 20
3 02/ 06/ 2000 10
4 05/ 07/ 2000 10
5 09/ 07/ 2000 30
6 09/ 07/ 2000 20
7 15/ 07/ 2000 40
8 15/ 07/ 2000 40
noCommande dateCommande noClient
5 09/ 07/ 2000 30
6 09/ 07/ 2000 20
7 15/ 07/ 2000 40
8 15/ 07/ 2000 40
dateCommande > 05/07/2000 Commande
noClient dateCommande
30 09/ 07/ 2000
20 09/ 07/ 2000
3.4.4 Produit cartésien ()
Table Commande
noCommande dateCommande noClient
1 01/ 06/ 2000 10
2 02/ 06/ 2000 20
3 02/ 06/ 2000 10
4 05/ 07/ 2000 10
5 09/ 07/ 2000 30
6 09/ 07/ 2000 20
7 15/ 07/ 2000 40
8 15/ 07/ 2000 40
Client Commande
Client.noClient nomClient noTéléphone noCommande dateCommande Commande. noClient
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000 10
10 Luc Sansom (999)999-9999 2 02/ 06/ 2000 20
10 Luc Sansom (999)999-9999 3 02/ 06/ 2000 10
10 Luc Sansom (999)999-9999 4 05/ 07/ 2000 10
10 Luc Sansom (999)999-9999 5 09/ 07/ 2000 30
10 Luc Sansom (999)999-9999 6 09/ 07/ 2000 20
10 Luc Sansom (999)999-9999 7 15/ 07/ 2000 40
10 Luc Sansom (999)999-9999 8 15/ 07/ 2000 40
20 Dollard Tremblay (888)888-8888 1 01/ 06/ 2000 10
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000 20
...
Table Client
noClient nomClient noTéléphone 10 Luc Sansom (999)999-9999 20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777
40 Jean Leconte (666)666-6666
50 Hafedh Alaoui (555)555-5555
60 Marie Leconte (666)666-6666
70 Simon Lecoq (444)444-4419
80 Dollard Tremblay (333)333-3333
Exemple. Produire les
informations au sujet des
Clients et de leurs Commandes Client Commande
Client.noClient nomClient noTéléphone noCommande dateCommande Commande. noClient
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000 10
10 Luc Sansom (999)999-9999 2 02/ 06/ 2000 20
10 Luc Sansom (999)999-9999 3 02/ 06/ 2000 10
10 Luc Sansom (999)999-9999 4 05/ 07/ 2000 10
10 Luc Sansom (999)999-9999 5 09/ 07/ 2000 30
10 Luc Sansom (999)999-9999 6 09/ 07/ 2000 20
10 Luc Sansom (999)999-9999 7 15/ 07/ 2000 40
10 Luc Sansom (999)999-9999 8 15/ 07/ 2000 40
20 Dollard Tremblay (888)888-8888 1 01/ 06/ 2000 10
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000 20
20 Dollard Tremblay (888)888-8888 3 02/ 06/ 2000 10
… … … … … …
Client.noClient nomClient noTéléphone noCommande dateCommande Commande. noClient
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000 10
10 Luc Sansom (999)999-9999 3 02/ 06/ 2000 10
10 Luc Sansom (999)999-9999 4 05/ 07/ 2000 10
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000 20
20 Dollard Tremblay (888)888-8888 6 09/ 07/ 2000 20
30 Lin Bô (777)777-7777 5 09/ 07/ 2000 30
40 Jean Leconte (666)666-6666 7 15/ 07/ 2000 40
40 Jean Leconte (666)666-6666 8 15/ 07/ 2000 40
clé primaire = clé étrangère
Client.noClient = Commande.noClient (Client Commande)
Exemple. Produire les
informations au sujet des
Clients et de leurs Commandes
Client.noClient = Commande . noClient ( Client Commande )
Client.noClient nomClient noTéléphone noCommande dateCommande Commande. noClient
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000 10
10 Luc Sansom (999)999-9999 3 02/ 06/ 2000 10
10 Luc Sansom (999)999-9999 4 05/ 07/ 2000 10
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000 20
20 Dollard Tremblay (888)888-8888 6 09/ 07/ 2000 20
30 Ye San Le Sou (777)777-7777 5 09/ 07/ 2000 30
40 Jean Leconte (666)666-6666 7 15/ 07/ 2000 40
40 Jean Leconte (666)666-6666 8 15/ 07/ 2000 40
Client.noClient, nomClient, noTéléphone, noCommande, dateCommande (…))
Colonne redondante
Client.noClient nomClient noTéléphone noCommande dateCommande
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000
10 Luc Sansom (999)999-9999 3 02/ 06/ 2000
10 Luc Sansom (999)999-9999 4 05/ 07/ 2000
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000
20 Dollard Tremblay (888)888-8888 6 09/ 07/ 2000
30 Ye San Le Sou (777)777-7777 5 09/ 07/ 2000
40 Jean Leconte (666)666-6666 7 15/ 07/ 2000
3.4.5 Jointure naturelle ( )
noClient nomClient noTéléphone noCommande dateCommande
10 Luc Sansom (999)999-9999 1 01/ 06/ 2000
10 Luc Sansom (999)999-9999 3 02/ 06/ 2000
10 Luc Sansom (999)999-9999 4 05/ 07/ 2000
20 Dollard Tremblay (888)888-8888 2 02/ 06/ 2000
20 Dollard Tremblay (888)888-8888 6 09/ 07/ 2000
30 Lin Bô (777)777-7777 5 09/ 07/ 2000
40 Jean Leconte (666)666-6666 7 15/ 07/ 2000
Table Commande
noCommande dateCommande noClient
1 01/ 06/ 2000 10
2 02/ 06/ 2000 20
3 02/ 06/ 2000 10
4 05/ 07/ 2000 10
5 09/ 07/ 2000 30
6 09/ 07/ 2000 20
7 15/ 07/ 2000 40
8 15/ 07/ 2000 40
Client
Commande
Colonnes communes : colonnes de jointure ou clé de jointure
Schéma : union des colonnes
Table Client
noClient nomClient noTéléphone 10 Luc Sansom (999)999-9999 20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777
40 Jean Leconte (666)666-6666
50 Hafedh Alaoui (555)555-5555
60 Marie Leconte (666)666-6666
70 Simon Lecoq (444)444-4419
80 Dollard Tremblay (333)333-3333
Sélectionner les nomClient qui ont commandé au moins un plant d'herbe à puce
Commande
{Clé primaire : noCommande}
noCommande : INTEGER dateCommande : DATE noClient : INTEGER
<<Table>>
Client
{Clé primaire : noClient}
noClient : INTEGER nomClient : VARCHAR noTéléphone : VARCHAR
<<Table>>
LigneCommande
{Clé primaire : noCommande, noArticle}
noCommande : INTEGER noArticle : INTEGER quantité : INTEGER
<<Table>>
Article
{Clé primaire : noArticle}
noArticle : INTEGER description : VARCHAR prixUnitaire : DECIMAL quantitéEnStock : INTEGER
<<Table>>
Livraison
{Clé primaire : noLivraison}
noLivraison : INTEGER dateLivraison : DATE
<<Table>> DétailLivraison
{Clé primaire : noLivraison, noCommande, noArticle}
noLivraison : INTEGER noCommande : INTEGER noArticle : INTEGER quantitéLivrée : INTEGER
<<Table>>
Sélectionner les nomClient qui ont commandé au moins un plant
d'herbe à puce
Commande {Clé primaire : noCommande}
noCommande : INTEGER dateCommande : DATE noClient : INTEGER
<<Table>>
Client {Clé primaire : noClient}
noClient : INTEGER nomClient : VARCHAR noTéléphone : VARCHAR
<<Table>>
LigneCommande
{Clé primaire : noCommande, noArticle}
noCommande : INTEGER noArticle : INTEGER quantité : INTEGER
<<Table>>
Article {Clé primaire : noArticle}
noArticle : INTEGER description : VARCHAR prixUnitaire : DECIMAL quantitéEnStock : INTEGER
<<Table>>
Livraison {Clé primaire : noLivraison}
noLivraison : INTEGER dateLivraison : DATE
<<Table>> DétailLivraison
{Clé primaire : noLivraison, noCommande, noArticle}
noLivraison : INTEGER noCommande : INTEGER noArticle : INTEGER quantitéLivrée : INTEGER
<<Table>>
nomClient ( description = “Herbe à puce ”
(Client Commande LigneCommande
Formulations équivalentes
nomClient ( description = “Herbe à puce ” (Client
Commande LigneCommande Article))
nomClient ( description = “Herbe à puce ” (((Client Commande) LigneCommande) Article))
nomClient ( description = “Herbe à puce ” (((Client
LigneCommande) Commande) Article))
…
Quelques règles d ’équivalence
Eclatement d'une sélection conjonctive (SE)
–
e1 ET e2(T) =
e1(
e2(T))
Commutativité de la sélection (SC)
e1(
e2(T)) =
e2(
e1(T))
Elimination des projections en cascades (PE)
liste1(
liste2(T)) =
liste1(T)
Commutativité de la jointure (JC)
– T
1 T
2= T
1 T
2 Associativité de la jointure (JA)
– T
1 (T
2 T
3) = (T
1 T
2) T
3 Voir évaluation des requêtes
Représentation sous forme d ’arbre de l ’expression algébrique
nomClient(
description = “Herbe à puce ”(((Client Commande) LigneCommande) Article))
C li e n t C o m m a n d e
L ig n e C o m m a n d e A r t i c l e
d e s c r i p t i o n = « H e r b e à p u c e »
n o m C l ie n t
Cas d ’une clé de jointure composée
LigneCommande DétailLivraison
Table LigneCommande noCommande noArticle quantité
1 10 10
1 70 5
1 90 1
2 40 2
2 95 3
3 20 1
4 40 1
4 50 1
5 70 3
5 10 5
5 20 5
6 10 5
6 40 1
7 50 1
7 95 2
8 20 3
Table DétailLivraison
noLivraison noCommande noArticle quantitéLivrée
100 1 10 7
100 1 70 5
101 1 10 3
102 2 40 2
102 2 95 1
100 3 20 1
103 1 90 1
104 4 40 1
105 5 70 2
noCommande noArticle quantité noLivraison quantitéLivrée
1 10 10 100 7
1 10 10 101 3
1 70 5 100 5
1 90 1 103 1
2 40 2 102 2
2 95 3 102 1
3 20 1 100 1
4 40 1 104 1
3.4.6 Opération renommer ()
Quels sont les Clients qui ont le même numéro de téléphone?
Client2 (Client)
Client.noClient, Client2.noClient, ( Client.noTéléphone = Client2.noTéléphone (Client
Client2 (Client)))
Table Client
noClient nomClient noTéléphone 10 Luc Sansom (999)999-9999 20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777
40 Jean Leconte (666)666-6666 50 Hafedh Alaoui (555)555-5555 60 Marie Leconte (666)666-6666 70 Simon Lecoq (444)444-4419 80 Dollard Tremblay (333)333-3333
Table Client2
noClient nomClient noTéléphone 10 Luc Sansom (999)999-9999 20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777
40 Jean Leconte (666)666-6666 50 Hafedh Alaoui (555)555-5555 60 Marie Leconte (666)666-6666 70 Simon Lecoq (444)444-4419 80 Dollard Tremblay (333)333-3333
Client. noClient Client2.noClient
40 60
60 40
10 10
20 20
30 30
40 40
50 50
Renommer les colonnes
Quels sont les Clients qui ont le même numéro de téléphone?
Client2(noClient2, nomClient2, noTéléphone) (Client)
noClient, noClient2 (Client Client2(noClient2, nomClient2, noTéléphone) (Client))
Table Client
noClient nomClient noTéléphone 10 Luc Sansom (999)999-9999 20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777
40 Jean Leconte (666)666-6666 50 Hafedh Alaoui (555)555-5555 60 Marie Leconte (666)666-6666 70 Simon Lecoq (444)444-4419 80 Dollard Tremblay (333)333-3333
Table Client2
noClient2 nomClient2 noTéléphone 10 Luc Sansom (999)999-9999 20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777
40 Jean Leconte (666)666-6666 50 Hafedh Alaoui (555)555-5555 60 Marie Leconte (666)666-6666 70 Simon Lecoq (444)444-4419 80 Dollard Tremblay (333)333-3333
noClient noClient2
40 60
60 40
10 10
3.4.7 Jointure-
Table Commande altérée
noCommande dateCommande numéroClient
1 01/ 06/ 2000 10
2 02/ 06/ 2000 20
3 02/ 06/ 2000 10
4 05/ 07/ 2000 10
5 09/ 07/ 2000 30
6 09/ 07/ 2000 20
7 15/ 07/ 2000 40
8 15/ 07/ 2000 40
noClient nomClient noTéléphone noCommande dateCommande numéroClient
10 Luc Sansom (999)999-9999 1 01/06/ 2000 10
10 Luc Sansom (999)999-9999 3 02/06/ 2000 10
10 Luc Sansom (999)999-9999 4 05/07/ 2000 10
20 Dollard Tremblay (888)888-8888 2 02/06/ 2000 20 20 Dollard Tremblay (888)888-8888 6 09/07/ 2000 20
30 Ye San Le Sou (777)777-7777 5 09/07/ 2000 30
40 Jean Leconte (666)666-6666 7 15/07/ 2000 40
Client noClient = numéroClient Commande altérée =
noClient = numéroClient (Client Commande altérée)
Table Client
noClient nomClient noTéléphone 10 Luc Sansom (999)999-9999 20 Dollard Tremblay (888)888-8888
30 Lin Bô (777)777-7777
40 Jean Leconte (666)666-6666
50 Hafedh Alaoui (555)555-5555
60 Marie Leconte (666)666-6666
70 Simon Lecoq (444)444-4419
80 Dollard Tremblay (333)333-3333
Cherchez les
LigneCommandes qui ont été livrées en une seule livraison
LigneCommande.noCommande,
LigneCommande.noArtilce, quantité, noLivraison, quantitéLivrée (LigneCommande
LigneCommande.noCommande = DétailLivraison.noCommande ET
LigneCommande.noArticle = DétailLivraison.noArticle ET
DétailLivraison)
Table LigneCommande noCommande noArticle quantité
1 10 10
1 70 5
1 90 1
2 40 2
2 95 3
3 20 1
4 40 1
4 50 1
5 70 3
5 10 5
5 20 5
6 10 5
6 40 1
7 50 1
7 95 2
8 20 3
Table DétailLivraison
noLivraison noCommande noArticle quantitéLivrée
100 1 10 7
100 1 70 5
101 1 10 3
102 2 40 2
102 2 95 1
100 3 20 1
103 1 90 1
104 4 40 1
105 5 70 2
noCommande noArticle quantité noLivraison quantitéLivrée
1 70 5 100 5
1 90 1 103 1
2 40 2 102 2
3 20 1 100 1
3.4.8 Jointure externe
Inclure les « célibataires »
La jointure externe à gauche
T 1 = T 2 (célibataires de T 1 )
La jointure externe à droite
T 1 = T 2
La jointure externe pleine
T 1 == T 2
Produire les informations au sujet des Clients et de leurs Commandes incluant les informations sur les
Clients qui n’ont pas placé de
Commande noCommande dateCommande noClient Table Commande
1 01/ 06/ 2000 10
2 02/ 06/ 2000 20
3 02/ 06/ 2000 10
4 05/ 07/ 2000 10
5 09/ 07/ 2000 30
6 09/ 07/ 2000 20
7 15/ 07/ 2000 40
8 15/ 07/ 2000 40
Client =
Commande
noClient nomClient noTéléphone noCommande dateCommande