Академический Документы
Профессиональный Документы
Культура Документы
st
CHAP 5-4
I/ Requtes imbriques
Une requte imbrique consiste inclure une requte comme valeur dune condition dans une clause
WHERE. On utilise loprateur IN (dans)
Principe :
SELECT attribut1, attribut2
WHERE attributx in (select FROM WHERE)
Lutilisation de requtes imbriques permet de runir plusieurs requtes en une seule
Attention : le rsultat de la requte ne doit comporter quun seul champ
Exemple : Le bibliothcaire dAubencheul au Bac souhaite connatre les liens de parent pouvant exister
au sein des adhrents.
Soit le MCD suivant
0,n
parent
ADHERENT
NAdh
Lien_affiliation
NomAdh
PrenAdh
0,1
Enfant
RueAdh
VilleAdh
Le schma de la relation est le suivant
ADHERENT(NAdh, NomAdh, PrenAdh, RueAdh, VilleAdh, #NAdhParent)
Rdigez la requte SQL permettant de connatre le prnom et le nom des parents ayant des enfants
SELECT PrenAdh, nomAdh
FROM ADHERENT
WHERE NAdh in (select NumAdhParent from ADHERENT)
Rsultat :
PrenAdh
NomAdh
NAdh
Myriam
CROFT-LARA
Virginie
GINOLA
14
Mylne
JULIANA
18
Alexandre KILOURIEN
21
Grand
22
MANITOU
F. REDONNET
Page 1/8
http://www.brikoboutikstt.fr.st
EMPRUNT
quijointure
Champ de
jointure : NLivre
X
X
X
Rsultat
X
X
X
Seules les lignes de la table livre pour lesquels NLivre a une valeur identique dans EMPRUNT et
LIVRES seront repris
La solution est donc de faire une jointure externe :
En QBE :
F. REDONNET
Page 2/8
http://www.brikoboutikstt.fr.st
La table LIVRE est la table pre et constitue ainsi la table de gauche alors que la table emprunt et la
table Fils et est donc considre comme table de droite
On parlera donc ici de jointure externe gauche
En SQL la syntaxe est la suivante :
SELECT DISTINCT TitreLivre, NAdh
FROM LIVRES LEFT JOIN EMPRUNT ON LIVRES.NLivre = EMPRUNT.NLivre;
Table pre
( gauche )
Table fils
( droite )
A
B
X
Y
Z
Produit cartsien :
XA
XB
YA
YB
ZA
ZB
F. REDONNET
Page 3/8
http://www.brikoboutikstt.fr.st
Le nombre de n-uplets obtenus sobtient en multipliant le nombre de n-uplets des diffrentes relations
sources.
Pour raliser un produit cartsien, il suffit de faire une projection avec au moins deux tables mais sans
dfinir de jointure.
Exemple ( partir de la base GESNOTES.MDB)
Le SLD relationnel est le suivant :
SLD Relationnel de lapplication GESNOTES
EPREUVE(Code preuve, Dsignpreuve, coeff)
ZONE(CodeZone, libellZone)
CANDIDAT(Num candidat, Non candidat, #CodeEtab)
ETABLISSEMENT(Codetab, Nomtab, #CodeZone)
NOTATION(#Codepreuve+#NumCandidat, note)
Afin de prparer des bordereaux de saisie de notes, on souhaiterait disposer de la liste des candidats (n et
nom) et de toutes les preuves (code et nom dpreuve) quils sont susceptibles de passer :
SELECT NumCandidat, NomCandidat, Codepreuve, Dsignpreuve
FROM CANDIDAT, EPREUVE;
REMARQUE : le produit cartsien est trs utilis pour prparer la saisie dune table (comme dans
lexemple, chaque anne le service de lacadmie peut prparer de cette manire la table notation. Il ne
restera alors plus qu saisir les notes obtenues par les candidats)
B/ Lunion
Lunion consiste crer une relation C en fusionnant le contenu de deux relations A et B
Les relations A et B doivent avoir une structure identique
Union
a1
a4
a2
a3
a5
Relation A
xy
z
b1 b2
b3
b4
Relation B
Notation en SQL :
Slection A UNION Selection B
Remarque : ACCESS ne gre pas lunion en QBE.
Exemple :
On souhaite avoir la liste des candidats (numcandidat, nom candidat et code tab) provenant des
tablissements scolaires 330 et 350 :
F. REDONNET
Page 4/8
http://www.brikoboutikstt.fr.st
En SQL
SELECT numcandidat, nomcandidat, codetab
FROM CANDIDAT
Where codetab=330
UNION
SELECT numcandidat, nomcandidat, codetab
FROM CANDIDAT
Where codetab=350;
Proposer une autre solution plus rapide :
SELECT numcandidat, nomcandidat, codetab
FROM CANDIDAT
Where codetab=330 OR Codetab=350
C/ Lintersection
Elle consiste retenir les enregistrements figurant la fois dans la relation A et dans la relation B. Les
relations doivent avoir une structure identique
INTERSECTION
a1
a4
a2
a3
a5
Relation A
xy
z
b1 b2
b3
b4
Relation B
Notation SQL :
Slection A INTERSECT Slection B
Exemple : On veut obtenir le nom des candidats ayant eu moins de 10 lpreuve 3 et lpreuve 6
En SQL :
SELECT Nomcandidat, codepreuve
FROM CANDIDAT, NOTATION
WHERE codepreuve=3 and note<10
and CANDIDAT.numcandidat=NOTATION.Numcandidat
INTERSECT
SELECT Nomcandidat, codepreuve
FROM CANDIDAT, NOTATION
WHERE codepreuve=6 and note<10
and CANDIDAT.numcandidat=NOTATION.Numcandidat;
Sachant quAccess ne connat pas la clause INTERSECT, la solution est la suivante en QBE :
F. REDONNET
Page 5/8
http://www.brikoboutikstt.fr.st
ROSI
F. REDONNET
Page 6/8
http://www.brikoboutikstt.fr.st
D/ La diffrence
Elle consiste slectionner les lignes figurant dans une relation A mais pas dans une relation B.
La structure des relations doit tre identiques
DIFFERENCE
a1
a4
a2
a3
a5
Relation A
xy
z
b1 b2
b3
b4
Relation B
Notation SQL :
Selection A MINUS Selection B
Les relations doivent avoir la mme structure. Cet oprateur nest pas reconnu dans ACCESS
Exemple :
A partir de la base de donnes gesnotes.MDB, on veut connatre la liste des lves (nom) nayant pas eu
de notes une preuve
1) On slectionne tous les
SELECT Nomcandidat
candidats
FROM CANDIDAT
MINUS
SELECT DISTINCT NomCandidat
FROM CANDIDAT
WHERE CANDIDAT.NumCandidat=NOTATION.NumCandidat
2)On slectionne tous les candidats ayant
pass au moins une preuve
F. REDONNET
Page 7/8
http://www.brikoboutikstt.fr.st
APPLICATION :
A partir de la base de donnes BIBLIOTHEQUE.MDB et du modle relationnel correspondant, formulez
sur papier puis dans access les requtes SQL permettant dobtenir les rponses suivantes :
R1
R2
R3
F. REDONNET
Page 8/8