Le guide de survie de la jointure SQL


Dans le monde relationnel, la jointure est une opération usuelle.
Et pourtant les choses deviennent compliquées si l’on n’y prête pas un peu d’attention, on coule rapidement...
Nous allons prendre un cas simple pour que tout le monde puisse embarquer : Tous sur le bateau !




Voici le modèle des données : une table des départements qui regroupe de 0 à N employés :

select * from DEPT order by DEPTNO;





select * from EMP order by EMPNO;


Q1 : je souhaite la liste des employés et le nom du département auquel ils appartiennent. La liste sera ordonnée par le numéro d’employé.
1 2 3 4 5 SELECT E.EMPNO, E.ENAME, D.DNAME FROM EMP E JOIN DEPT D ON (E.DEPTNO=D.DEPTNO) ORDER BY E.EMPNO;
  1. j'indique d’abord la table des employés, puis le mot JOIN suivi de la table des départements.
  2. Dans la clause ON ( …. ), je mentionne les colonnes de la 1ere table qui doivent joindre la 2eme table
La jointure suit la ou les colonnes correspondant à la relation Foreign Key entre les 2 tables.
On ne mentionne SURTOUT PAS la jointure dans une clause WHERE, sinon, on fait du SQL des années 1980 !
Voici le résultat :
La jointure ramène des lignes SEULEMENT lorsque un employé est attaché à un département.
D’où la 2eme question…

Q2 : je souhaite la liste des employés et le nom du département auquel ils appartiennent, même si il n’y a pas de département défini :

1 2 3 4 5 SELECT E.EMPNO, E.ENAME, D.DNAME FROM EMP E LEFT OUTER JOIN DEPT D ON (E.DEPTNO=D.DEPTNO) ORDER BY E.EMPNO;
On voit apparaître le mot LEFT OUTER JOIN : traduisons simplement par “ la liste des employés ET PEUT ETRE leur département.
Voici le résultat : FORD n’a pas de département, et il apparait maintenant dans la liste


Nous venons de réaliser une jointure externe.

Q3 : Je souhaite la liste des employés ET PEUT ETRE leur département. Je voudrais filtrer les employés dont le nom commence par J :

1 2 3 4 5 6 SELECT E.EMPNO, E.ENAME, D.DNAME FROM EMP E LEFT OUTER JOIN DEPT D ON (E.DEPTNO=D.DEPTNO) where E.ENAME like 'J%' ORDER BY E.EMPNO;
la clause WHERE contient les instructions de filtrage des résultats et peut porter sur n’importe quelle table.

Q4 : Et si nous devions joindre une 3eme table ?

Une 3ème table pourra être jointe sur la première ou la 2ème table, et ainsi de suite. Cela signifie que lors de l'écriture de la requête, on suivra un ordre d'écriture, en commençant généralement par la table principale de notre requête.

Q5 : Suis-je limité par le nombre de jointures ? Pourquoi les jointures sont réputées lentes ?

Non, pas vraiment limité, mais ne pas dépasser 10 tables est une bonne règle.
Le nombre de lignes ramenées par la jointure peut schématiquement s’exprimer ainsi :
  • (N lignes de table_1) x (M lignes de table_2) x (X lignes de table_3)
Si le nombre ramené de chaque table est faible et que chaque table dispose de la bonne indexation, le résultat est rapide, de l’ordre de quelques ms.
La réputation de lenteur est souvent due à une écriture incomplète (clause de jointure), et/ou une indexation défaillante.
Après avoir écrit les jointures et obtenu le résultat, il faut apprendre à les optimiser, mais ça, c'est dans le guide de survie de l’optimisation !
Frédéric Bamiere





Aucun commentaire:

Enregistrer un commentaire