C'est une opération fondamentale
lorsque l'on manipule des bases de données et qui permet
de réunir, 2 par 2, des tables. Il faut préciser, après la clause
FROM, le nom des tables qui vont intervenir et, après la clause
WHERE, les conditions qui vont permettre de réaliser la jointure.
Notions
d'alias
Un alias permet de renommer une colonne
ou une table. Cette opération est utile lorsque l'on veut qu'une
colonne ait un nom plus "parlant" ou qu'une table puisse
être manipulée plus facilement notamment quand il existe différentes
conditions de jointure. Donner un nom d'alias à une table est indispensable
en cas d'auto-jointure.
-Alias de colonne
Syntaxe : Col1 AS "Nom de la
colonne".
Dans le résultat de la requête correspondante, Col1
sera remplacée par "Nom de la colonne". Les guillemets
ne sont obligatoires que si le nom d'alias comporte des espaces.
Alias de table
Syntaxe : Table1 Alias1
Dans une requête, Alias1 sera identique à Table1
Equi-jointure
Cette opération permet de relier,
avec une relation d'égalité, des tables qui ont au moins un attribut
commun. On doit avoir n-1 conditions de jointure, n étant le nombre
de tables qui interviennent dans la requête.
Si aucune condition de jointure est précisée, la requête
correspondante réalisera le produit cartésien
des tables impliquées.
- Nom et libellé du sexe de
chaque étudiant
SELECT Nometu AS
"Nom étudiant", Lbsexe AS Sexe FROM ETUDIANT E, SEXE S WHERE E.Cdsexe=S.Cdsexe;
Dans cette requête, la
jointure s'effectue sur l'attribut commun (Cdsexe) entre les tables
ETUDIANT et SEXE qui ont pour alias respectifs E et S. L'attribut
de jointure (Cdsexe) ayant le même nom dans les 2 tables, il est
nécessaire de le préfixer par le nom de la table auquel il se rattache.
C'est la jointure d'une
table avec elle-même. Cette opération est utile lorsque l'on souhaite
relier des attributs qui se trouvent à l'intérieur d'une même table.
- Afficher le numéro
des étudiants qui ont une note dans la matière numéro 1 inférieure
à la note qu'ils ont obtenue dans la matière numéro 2.
SELECT N1.Numetu FROM NOTES N1, NOTES N2 WHERE N1.Numetu=N2.Numetu AND N1.Numat=1 AND N2.Numat=2 AND N1.Note<N2.Note;
Q06
: Afficher le Nom des étudiants
qui ont une note dans la matière numéro 1 inférieure à la note qu'ils
ont obtenue dans la matière numéro 2.
Cette opération, qui doit être utilisée
avec précaution, permet de relier deux tables lorsque la
colonne de jointure d'une table n'est pas reliée à
la colonne de jointure de l'autre table par le signe égal.
L'opérateur de comparaison peut être : supérieur(>),
inférieur(<), supérieur ou égal(>=),
inférieur ou égal(<=), différent(<>).
- Afficher pour chaque étudiant,
combien se trouvent avant lui sur la liste alphabétique des
noms.
SELECT E1.Nometu, COUNT(*) FROM ETUDIANT E1, ETUDIANT E2 WHERE E1.Nometu>E2.Nometu GROUP BY E1.Nometu ORDER BY E1.Nometu;
Cette requête donne un résultat
correct pour tous les étudiants, sauf pour le premier de
la liste alphabétique qui n'apparaît pas. Cette erreur
peut être évitée en utilisant, entre autre,
une jointure externe.
Jointures
externes
Une jointure "classique" entre
2 tables, ou jointure interne, ne renvoie des lignes que
si la colonne de jointure d'une table est égal à la
colonne de jointure de l'autre table. Il peut être utile,
dans certaines circonstances, d'afficher toutes les lignes d'une
table particulière qu'il y ait ou non correspondance avec
l'autre table de jointure. Les colonnes pour lesquelles il n'y a
pas de correspondance sont remplies avec la valeur NULL.Cette
opération s'appelle une jointure externe.
Il existe 3 types de jointures externes
et la façon dont est réalisée une jointure
externe dépend de la position des tables par rapport à
l'instruction de jointure.
La syntaxe, en SQL-92, est la suivante :
a) Jointure externe gauche
SELECT ... FROMtable1 [alias] LEFTOUTERJOINtable2 [alias] ON<Conditions de jointure>
...
Toutes les lignes de table1 seront
affichées que <Conditions de jointure> soit réalisée
ou non dans table2.
La requête suivante affiche tous les étudiants, qu'ils
aient ou non une note. Si un étudiant n'a pas de note, le
champ Numetu de la table correspondante (NOTES) aura la valeur NULL.
SELECTDISTINCT(E.Nometu),
N.Numetu FROM ETUDIANT E LEFT OUTER JOIN NOTES N ON E.Numetu=N.Numetu;
b) Jointure externe droite
SELECT ... FROMtable1 [alias] RIGHT OUTER JOINtable2 [alias] ON<Conditions de jointure>
...
Toutes les lignes de table2 seront
affichées que <Conditions de jointure> soit réalisée
ou non dans table1.
La requête suivante affiche tous les
étudiants qui ont au moins une note.
SELECTDISTINCT(E.Nometu),
N.Numetu FROM ETUDIANT E RIGHT OUTER JOIN NOTES N ON E.Numetu=N.Numetu;
c) Jointure externe complète
SELECT ... FROMtable1 [alias] FULLOUTERJOINtable2 [alias] ON<Conditions de jointure>
...
Toutes les lignes de table1 et de
table2 seront affichées et les colonnes pour lesquelles
il n'y a pas de correspondance sont remplies avec la valeur NULL.
Voici, ci-dessous, deux utilisations possibles
des jointures externes.
- Afficher le nom des étudiants
qui n'ont aucune note.
SELECTDISTINCT(E.Nometu),
N.Numetu FROM ETUDIANT E LEFT OUTER JOIN NOTES N ON E.Numetu=N.Numetu WHERE N.Numetu is NULL;
- Afficher pour chaque étudiant,
combien se trouvent avant lui sur la liste alphabétique des
noms.
SELECT E1.Nometu, COUNT(E2.Numetu) FROM ETUDIANT E1 LEFT OUTER JOIN ETUDIANT E2 ON E1.Nometu>E2.Nometu GROUP BY E1.Nometu ORDER BY E1.Nometu;