Jointure
Il s'agit d'une opération fondamentale lorsque l'on manipule des bases de données et qui permet de réunir, 2 par 2, les tables d'une base de données. 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 d'une table ou un nom de 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'autojointure.
-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
Equijointure
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.
Tester les exemples
Q05 : Afficher la note obtenue par l'étudiante "Gros, Sophie" dans la matière numéro 2.
Autojointure
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.
Thêta jointure
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 autres, 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 égale à 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 ...
FROM table1 [alias]
LEFT OUTER JOIN table2 [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.
SELECT DISTINCT(E.Nometu), N.Numetu FROM ETUDIANT E LEFT OUTER JOIN NOTES N ON E.Numetu=N.Numetu;
b) Jointure externe droite
SELECT ...
FROM table1 [alias]
RIGHT OUTER JOIN table2 [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.
SELECT DISTINCT(E.Nometu), N.Numetu FROM ETUDIANT E RIGHT OUTER JOIN NOTES N ON E.Numetu=N.Numetu;
c) Jointure externe complète
SELECT ...
FROM table1 [alias]
FULL OUTER JOIN table2 [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.
SELECT DISTINCT(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;
Tester les exemples