Une jointure sert à fusionner deux tables sur base d'une colonne commune.
On les utilises lorsqu'il faut obtenir un résultat combinant les données de plusieurs tables.
Ces deux tables seront utilisées lors des exemples et explications:
Cinema
| id_film | nom_film | date_sortie | note_imdb |
|---|---|---|---|
| 1 | Jaws | 1975 | 8.0 |
| 2 | Star Wars | 1977 | 8.6 |
| 3 | Don't Look Up | 2021 | 7.2 |
| 4 | Titanic | 1997 | 7.8 |
| 5 | Le dernier samouraï | 2003 | 7.7 |
Acteur
| nom_acteur | date_naissance | id_film |
|---|---|---|
| Roy Scheider | 10/11/1932 | 1 |
| Mark Hamill | 25/09/1951 | 2 |
| Meryl Streep | 22/09/1949 | 3 |
| Tom Cruise | 03/07/1962 | 5 |
| Tom Hanks | 15/09/1977 | NULL |
| Timothée Chalamet | 27/12/1995 | 3 |
NULL.NULL.NULL.NULL.INNER JOIN ne garde que les lignes qui ont une correspondance dans les deux tables.

SELECT * FROM tableA ta JOIN tableB tb ON ta.colonne = tb.colonne
Il n'est pas obligatoire de préciser INNER.
SELECT * FROM Cinema c JOIN Acteur a ON c.id_film = a.id_film
| id_film | nom_film | date_sortie | note_imdb | nom_acteur | date_naissance |
|---|---|---|---|---|---|
| 1 | Jaws | 1975 | 8.0 | Roy Scheider | 10/11/1932 |
| 2 | Star Wars | 1977 | 8.6 | Mark Hamill | 25/09/1951 |
| 3 | Don't Look Up | 2021 | 7.2 | Meryl Streep | 22/09/1949 |
| 5 | Le dernier samouraï | 2003 | 7.7 | Tom Cruise | 03/07/1962 |
| 3 | Don't Look Up | 2021 | 7.2 | Timothée Chalamet | 27/12/1995 |
Le film ayant l'id_film 4 de la table Cinema (table de gauche) n'apparait pas, car il n'existe pas de correspondance entre cet id_film et la table Acteur. Idem pour l'acteur Tom Hanks, il n'apparait pas car il n'est lié à aucun film.
Enfin, le film Don't Look Up apparait deux fois, car il y a une correspondance avec deux acteurs.
LEFT JOIN garde toutes les lignes de la table de gauche, même celles qui n'ont pas de correspondance dans la table de droite. Dans ce cas, les colonnes de la table de droite sont remplies avec NULL.
Contrairement à un INNER JOIN, LEFT JOIN préserve les données de la table de gauche, même en l'absence de correspondance.

SELECT * FROM tableA ta LEFT JOIN tableB tb ON ta.colonne = tb.colonne
SELECT * FROM Cinema c LEFT JOIN Acteur a ON c.id_film = a.id_film
| id_film | nom_film | date_sortie | note_imdb | nom_acteur | date_naissance |
|---|---|---|---|---|---|
| 1 | Jaws | 1975 | 8.0 | Roy Scheider | 10/11/1932 |
| 2 | Star Wars | 1977 | 8.6 | Mark Hamill | 25/09/1951 |
| 3 | Don't Look Up | 2021 | 7.2 | Meryl Streep | 22/09/1949 |
| 3 | Don't Look Up | 2021 | 7.2 | Timothée Chalamet | 27/12/1995 |
| 4 | Titanic | 1997 | 7.8 | NULL | NULL |
| 5 | Le dernier samouraï | 2003 | 7.7 | Tom Cruise | 03/07/1962 |
Ici, tous les enregistrements de la table Cinema sont présents. Comme aucun acteur n'est associé à l'id_film 4 (Titanic), on trouve des valeurs NULL. Tom Hanks n'apparait pas dans les résultats, car la table de référence est la table de gauche Cinema.
Il est possible de ne garder que les données de la table de gauche qui n'ont aucune correspondance avec la table de droite en utilisant une clause WHERE comme ceci:
SELECT c.id_film, c.nom_film, c.date_sortie, c.note_imdb, a.nom_acteur, a.date_naissance FROM Cinema c LEFT JOIN Acteur a ON c.id_film
| id_film | nom_film | date_sortie | note_imdb | nom_acteur | date_naissance |
|---|---|---|---|---|---|
| 4 | Titanic | 1997 | 7.8 | NULL | NULL |
Ici, on ne garde donc que les données n'ayant pas de correspondance avec la table Acteur.
RIGHT JOIN garde toutes les lignes de la table de droite, même celles qui n'ont pas de correspondance dans la table de gauche. Dans ce cas, les colonnes de la table de gauche sont remplies avec NULL.

SELECT * FROM tableA ta RIGHT JOIN tableB tb ON ta.colonne = tb.colonne
SELECT * FROM Cinema c RIGHT JOIN Acteur a ON c.id_film = a.id_film
| id_film | nom_film | date_sortie | note_imdb | nom_acteur | date_naissance |
|---|---|---|---|---|---|
| 1 | Jaws | 1975 | 8.0 | Roy Scheider | 10/11/1932 |
| 2 | Star Wars | 1977 | 8.6 | Mark Hamill | 25/09/1951 |
| 3 | Don't Look Up | 2021 | 7.2 | Meryl Streep | 22/09/1949 |
| 5 | Le dernier samouraï | 2003 | 7.7 | Tom Cruise | 03/07/1962 |
| NULL | NULL | NULL | NULL | Tom Hanks | 15/09/1977 |
| 3 | Don't Look Up | 2021 | 7.2 | Timothée Chalamet | 27/12/1995 |
Ici, tous les enregistrements de la table Acteur sont présents. Comme aucun film n'est associé à l'acteur Tom Hanks, on y trouve des valeurs NULL. Le film Titanic n'apparait pas dans les résultats, car la table de référence est la table de droite Acteur.
Il est possible de ne garder que les données de la table de droite qui n'ont aucune correspondance avec la table de gauche en utilisant une clause WHERE comme ceci:
SELECT c.id_film, c.nom_film, c.date_sortie, c.note_imdb, a.nom_acteur, a.date_naissance FROM Cinema c RIGHT JOIN Acteur a ON c.id_film
| id_film | nom_film | date_sortie | note_imdb | nom_acteur | date_naissance |
|---|---|---|---|---|---|
| NULL | NULL | NULL | NULL | Tom Hanks | 15/09/1977 |
Ici, on ne garde donc que les données n'ayant pas de correspondance avec la table Cinema.
FULL JOIN garde toutes les lignes des deux tables. Les colonnes n'ayant pas de correspondance sont remplies avec NULL. Cette jointure n'exclut aucune donnée.

SELECT * FROM tableA ta FULL JOIN tableB tb ON ta.colonne = tb.colonne
SELECT * FROM Cinema c FULL JOIN Acteur a ON c.id_film = a.id_film
| id_film | nom_film | date_sortie | note_imdb | nom_acteur | date_naissance |
|---|---|---|---|---|---|
| 1 | Jaws | 1975 | 8.0 | Roy Scheider | 10/11/1932 |
| 2 | Star Wars | 1977 | 8.6 | Mark Hamill | 25/09/1951 |
| 3 | Don't Look Up | 2021 | 7.2 | Meryl Streep | 22/09/1949 |
| 5 | Le dernier samouraï | 2003 | 7.7 | Tom Cruise | 03/07/1962 |
| NULL | NULL | NULL | NULL | Tom Hanks | 15/09/1977 |
| 3 | Don't Look Up | 2021 | 7.2 | Timothée Chalamet | 27/12/1995 |
| 4 | Titanic | 1997 | 7.8 | NULL | NULL |
Ici, tous les enregistrements sont présents, qu'il y ait une correspondance ou non. Les endroits où il n'y a pas de correspondance ont la valeur NULL.
CROSSE JOIN associe chaque ligne de la table de gauche avec chaque ligne de la table de droite. Les colonnes n'ayant pas de correspondance sont remplies avec NULL. Si la table de gauche possède 10 lignes et que la table de droite en possède 8, alors le résultat affichera 80 lignes.
SELECT * FROM tableA ta CROSS JOIN tableB tb
SELECT * FROM Cinema c CROSS JOIN Acteur a
| id_film | nom_film | date_sortie | note_imdb | nom_acteur | date_naissance |
|---|---|---|---|---|---|
| 1 | Jaws | 1975 | 8.0 | Roy Scheider | 10/11/1932 |
| 2 | Star Wars | 1977 | 8.6 | Roy Scheider | 10/11/1932 |
| 3 | Don't Look Up | 2021 | 7.2 | Roy Scheider | 10/11/1932 |
| 4 | Titanic | 1997 | 7.8 | Roy Scheider | 10/11/1932 |
| 5 | Le dernier samouraï | 2003 | 7.7 | Roy Scheider | 10/11/1932 |
| 1 | Jaws | 1975 | 8.0 | Mark Hamill | 25/09/1951 |
| 2 | Star Wars | 1977 | 8.6 | Mark Hamill | 25/09/1951 |
| 3 | Don't Look Up | 2021 | 7.2 | Mark Hamill | 25/09/1951 |
| 4 | Titanic | 1997 | 7.8 | Mark Hamill | 25/09/1951 |
| 5 | Le dernier samouraï | 2003 | 7.7 | Mark Hamill | 25/09/1951 |
Le résultat dans cet exemple n'est pas complet. En effet, il y a normalement 30 lignes (5 enregistrements dans la table Cinema multiplié par les 6 enregistrements de la table Acteur).
SELF JOIN permet une jointure d'une table avec elle-même. Elle est utilisée lorsqu'une table possède une clé primaire et une clé étrangère à la fois. Cela permet de mettre en évidence les relations entre les enregistrements d'une même table.
SELECT * FROM tableA as a1 JOIN tableA as a2 ON a1.colonne = a2.colonne_associee
ou bien
SELECT * FROM tableA a1, tableA a2 WHERE condition
Prenons la table suivante:
Employee
| id_employee | nom | id_manager |
|---|---|---|
| 1 | Antoine | NULL |
| 2 | Yves | 1 |
| 3 | Marc | 2 |
Où Antoine est le manager d'Yves, et Yves et le manager de Marc.
SELECT e.id_employee, e.nom AS employee_nom, m.nom AS manager_nom FROM Employee e LEFT JOIN Employee m ON e.manager_id = m.employee_id
| id_employee | employee_nom | manager_nom |
|---|---|---|
| 1 | Antoine | NULL |
| 2 | Yves | Antoine |
| 3 | Marc | Yves |
Le résultat permet de mettre en évidence la manager de chaque employé.
Ici, la jointure SELF JOIN a été réalisée par le biais d'une jointure LEFT JOIN, mais il est tout à fait possible de réaliser la même opération avec d'autres types de jointures.
Please sign in to leave a comment.
No comments yet. Be the first to comment!