Tu connais sûrement LEFT JOIN, RIGHT JOIN, INNER JOIN et FULL OUTER JOIN, non ?
LE RAPPEL
Les 4 joins que tout le monde connaît
Ce visuel les résume très bien :

En deux mots :
INNER JOIN : retourne uniquement les lignes qui ont une correspondance dans les deux tables.
LEFT JOIN : retourne toutes les lignes de la table de gauche et les lignes correspondantes de la table de droite. Les lignes de gauche sans correspondance ont des valeurs nulles côté droit.
RIGHT JOIN : retourne toutes les lignes de la table de droite et les lignes correspondantes de la table de gauche. Les lignes de droite sans correspondance ont des valeurs nulles côté gauche.
FULL OUTER JOIN : retourne toutes les lignes dès qu'il y a une correspondance d'un côté ou de l'autre. Les lignes sans correspondance contiennent des valeurs nulles.
Ces quatre-là sont les types de joins SQL les plus courants.
Mais il y en a d'autres.
Aujourd'hui, je te présente trois d'entre eux, que je trouve bien pratiques à l'occasion :
SEMI JOIN
ANTI JOIN
NATURAL JOIN
On y va !
SEMI JOIN
Semi Join : vérifier qu'une correspondance existe
Le SEMI JOIN ressemble beaucoup à un LEFT JOIN, mais avec trois différences notables :
1. Si la condition de jointure entre deux lignes est vraie (TRUE), seules les colonnes de la table de gauche sont retournées. Le LEFT JOIN, lui, retourne les colonnes des deux tables.

2. Si une ligne de la table de gauche n'a aucune correspondance, elle n'est pas retournée. Avec un LEFT JOIN, toutes les lignes de gauche sont retournées, qu'elles aient une correspondance ou non.

3. Si une ligne de la table de gauche a plusieurs correspondances, une seule entrée est retournée. Avec un LEFT JOIN, chaque correspondance est retournée, donc la ligne apparaît autant de fois qu'il y a de correspondances.
Par exemple, imaginons qu'on a les deux tables suivantes :

En exécutant un SEMI JOIN, on obtient ce résultat :

Comme on le voit, contrairement au LEFT JOIN :
il ne retourne que les colonnes de la table de gauche ;
il ne retourne que les lignes de gauche qui ont une correspondance.
Si un enregistrement a plusieurs correspondances, comme ici :

…on remarque que le SEMI JOIN ne retourne qu'un seul enregistrement de la table de gauche :

Je trouve le SEMI JOIN particulièrement utile quand je veux seulement savoir si des enregistrements existent dans une autre table. Le LEFT JOIN renvoie des doublons qui n'ont aucun intérêt à ce stade.
ANTI JOIN
Anti Join : ce que le semi join écarte
Les lignes de la table de gauche écartées par le SEMI JOIN sont justement le résultat d'un ANTI JOIN.
Autrement dit :
![Équation « [SEMI JOIN] + [ANTI JOIN] = [TABLE DE GAUCHE] » : le semi join et l'anti join réunis redonnent toutes les lignes de la table de gauche.](https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,quality=80,format=auto,onerror=redirect/uploads/asset/file/f83d92aa-6dda-4bf1-aacf-95208c0a258c/344-anti-join-definition-gauche-moins-semi.png?t=1793915263)
Reprenons les tables orders et users de tout à l'heure (celles où il n'y avait pas de correspondances multiples) :

En exécutant un ANTI JOIN, on obtient ce résultat :

Les résultats du SEMI JOIN et de l'ANTI JOIN montrent bien que :
![Illustration de « [SEMI JOIN] + [ANTI JOIN] = [TABLE DE GAUCHE] » : le résultat du semi join (123 Noah et 125 Manon) plus celui de l'anti join (124 Elio) redonne la table users complète (Noah, Elio, Manon).](https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,quality=80,format=auto,onerror=redirect/uploads/asset/file/7706f9d6-2649-4e84-9edd-2b4232998ee5/344-semi-anti-join-somme-table-gauche.png?t=1793915266)
Bien sûr, l'ordre peut être différent. Quand je dis « [SEMI JOIN] + [ANTI JOIN] = [TABLE DE GAUCHE] », je parle de l'ensemble des enregistrements.
Je trouve l'ANTI JOIN particulièrement utile quand je veux savoir quels enregistrements n'existent pas dans une autre table.
NATURAL JOIN
Natural Join : une jointure sans condition explicite
Celui-ci ressemble à l'INNER JOIN, mais il n'y a pas besoin de spécifier la condition de jointure.
À la place, il considère automatiquement une condition de jointure sur TOUTES les colonnes qui portent le même nom dans les deux tables.
Reprenons les tables users et orders :

Ici, la colonne User_ID est présente dans les deux tables.
En exécutant un NATURAL JOIN, on obtient ce résultat :

Comme on le voit, le résultat est semblable à celui d'un INNER JOIN. En revanche, on n'a pas eu besoin de spécifier explicitement la condition de jointure, ce qui peut, il faut l'admettre, être une bonne ou une mauvaise chose :
C'est bien, parce que ça permet d'écrire des requêtes plus concises.
C'est moins bien, parce qu'on n'est pas explicite sur les colonnes utilisées pour la jointure.
⚠️ Attention : si les deux tables avaient aussi une autre colonne de même nom (par exemple created_at), le NATURAL JOIN l'ajouterait à la condition de jointure sans te prévenir, et le résultat pourrait changer, voire devenir vide.
Dans le doute, mieux vaut écrire la condition explicitement.
SYNTAXE
Selon ton moteur SQL
SEMI JOIN et ANTI JOIN s'écrivent tels quels dans DuckDB, que j'utilise dans le notebook. Spark SQL les écrit LEFT SEMI JOIN et LEFT ANTI JOIN. PostgreSQL, MySQL et SQL Server n'ont pas ces mots-clés : on obtient le même résultat avec WHERE EXISTS (SEMI JOIN) et WHERE NOT EXISTS (ANTI JOIN).
Quant au NATURAL JOIN, il existe dans PostgreSQL et MySQL, mais pas dans SQL Server.
Au passage, l'ANTI JOIN évite aussi le piège des valeurs NULL du NOT IN, dont je parle dans ce shot :
EN RÉSUMÉ
Trois joins pour des requêtes plus élégantes
Voilà trois types de joins SQL supplémentaires, que j'utilise de temps en temps pour écrire des requêtes concises et élégantes.
J'espère que tu as appris quelque chose de nouveau.
Le visuel ci-dessous résume bien ce qu'on a vu aujourd'hui :

À retenir : SEMI JOIN = vérifier qu'une correspondance existe, ANTI JOIN = trouver celles qui n'existent pas, NATURAL JOIN = se passer de la condition de jointure.
💻 Le code de ce shot : notebook Semi, Anti et Natural Join
Envie d'aller plus loin ? DataXp t'attend : formations et parcours pour progresser en data science, machine learning et IA.
👉 Et maintenant, à toi de jouer : Quel autre join SQL méconnu aurais-tu ajouté à cette liste ?


