C'est une question très courante, donc cette réponse est basée sur cet article que j'ai écrit.
Relation de table
Considérant que nous avons les tableaux post
et post_comment
tableaux suivants:
Le post
a les enregistrements suivants:
| id | title |
|----|-----------|
| 1 | Java |
| 2 | Hibernate |
| 3 | JPA |
et post_comment
a les trois lignes suivantes:
| id | review | post_id |
|----|-----------|---------|
| 1 | Good | 1 |
| 2 | Excellent | 1 |
| 3 | Awesome | 2 |
SQL INNER JOIN
La clause SQL JOIN vous permet d'associer des lignes appartenant à différentes tables. Par exemple, un CROSS JOIN créera un produit cartésien contenant toutes les combinaisons possibles de lignes entre les deux tables de jonction.
Bien que CROSS JOIN soit utile dans certains scénarios, la plupart du temps, vous souhaitez joindre des tables en fonction d'une condition spécifique. Et c'est là que INNER JOIN entre en jeu.
Le SQL INNER JOIN nous permet de filtrer le produit cartésien de joindre deux tables en fonction d'une condition qui est spécifiée via la clause ON.
SQL INNER JOIN - ON condition "toujours vrai"
Si vous fournissez une condition "toujours vrai", l'INNER JOIN ne filtrera pas les enregistrements joints et le jeu de résultats contiendra le produit cartésien des deux tables de jointure.
Par exemple, si nous exécutons la requête SQL INNER JOIN suivante:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
INNER JOIN post_comment pc ON 1 = 1
Nous obtiendrons toutes les combinaisons post
et post_comment
enregistrements:
| p.id | pc.id |
|---------|------------|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
Donc, si la condition de la clause ON est "toujours vraie", l'INNER JOIN est simplement équivalent à une requête CROSS JOIN:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
CROSS JOIN post_comment
WHERE 1 = 1
ORDER BY p.id, pc.id
SQL INNER JOIN - ON "toujours faux" condition
D'un autre côté, si la condition de la clause ON est "toujours fausse", alors tous les enregistrements joints vont être filtrés et le jeu de résultats sera vide.
Donc, si nous exécutons la requête SQL INNER JOIN suivante:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
INNER JOIN post_comment pc ON 1 = 0
ORDER BY p.id, pc.id
Nous n'obtiendrons aucun résultat:
| p.id | pc.id |
|---------|------------|
En effet, la requête ci-dessus est équivalente à la requête CROSS JOIN suivante:
SELECT
p.id AS "p.id",
pc.id AS "pc.id"
FROM post p
CROSS JOIN post_comment
WHERE 1 = 0
ORDER BY p.id, pc.id
Clause SQL INNER JOIN - ON utilisant les colonnes Clé étrangère et Clé primaire
La condition de clause ON la plus courante est celle qui fait correspondre la colonne Clé étrangère de la table enfant à la colonne Clé primaire de la table parent, comme illustré par la requête suivante:
SELECT
p.id AS "p.id",
pc.post_id AS "pc.post_id",
pc.id AS "pc.id",
p.title AS "p.title",
pc.review AS "pc.review"
FROM post p
INNER JOIN post_comment pc ON pc.post_id = p.id
ORDER BY p.id, pc.id
Lors de l'exécution de la requête SQL INNER JOIN ci-dessus, nous obtenons le jeu de résultats suivant:
| p.id | pc.post_id | pc.id | p.title | pc.review |
|---------|------------|------------|------------|-----------|
| 1 | 1 | 1 | Java | Good |
| 1 | 1 | 2 | Java | Excellent |
| 2 | 2 | 3 | Hibernate | Awesome |
Ainsi, seuls les enregistrements qui correspondent à la condition de la clause ON sont inclus dans le jeu de résultats de la requête. Dans notre cas, le jeu de résultats contient tout le post
long avec leurs post_comment
enregistrements. Les post
lignes qui n'ont aucun associé post_comment
sont exclues car elles ne peuvent pas satisfaire à la condition de clause ON.
Encore une fois, la requête SQL INNER JOIN ci-dessus est équivalente à la requête CROSS JOIN suivante:
SELECT
p.id AS "p.id",
pc.post_id AS "pc.post_id",
pc.id AS "pc.id",
p.title AS "p.title",
pc.review AS "pc.review"
FROM post p, post_comment pc
WHERE pc.post_id = p.id
Les lignes non frappées sont celles qui satisfont la clause WHERE, et seuls ces enregistrements vont être inclus dans le jeu de résultats. C'est le meilleur moyen de visualiser le fonctionnement de la clause INNER JOIN.
| p.id | pc.post_id | pc.id | p.title | pc.review |
| ------ | ------------ | ------- | ----------- | --------- - |
| 1 | 1 | 1 | Java | Bon |
| 1 | 1 | 2 | Java | Excellent |
| 1 | 2 | 3 | Java | Génial |
| 2 | 1 | 1 | Hibernate | Bon |
| 2 | 1 | 2 | Hibernate | Excellent |
| 2 | 2 | 3 | Hibernate | Génial |
| 3 | 1 | 1 | JPA | Bon |
| 3 | 1 | 2 | JPA | Excellent |
| 3 | 2 | 3 | JPA | Génial |
Conclusion
Une instruction INNER JOIN peut être réécrite en tant que CROSS JOIN avec une clause WHERE correspondant à la même condition que vous avez utilisée dans la clause ON de la requête INNER JOIN.
Cela ne s'applique pas uniquement à INNER JOIN, pas à OUTER JOIN.