Tables de base de données
Pour montrer comment fonctionnent les clauses USING et ON, supposons que nous ayons l'élément suivant post
y post_comment
des tables de la base de données, qui forment une relation de table un-à-plusieurs par l'intermédiaire de la fonction post_id
colonne Clé étrangère dans le post_comment
qui fait référence à la table post_id
Colonne de clé primaire dans le post
table :
Le parent post
a 3 rangées :
| post_id | title |
|---------|-----------|
| 1 | Java |
| 2 | Hibernate |
| 3 | JPA |
et le post_comment
La table enfant contient les 3 enregistrements :
| post_comment_id | review | post_id |
|-----------------|-----------|---------|
| 1 | Good | 1 |
| 2 | Excellent | 1 |
| 3 | Awesome | 2 |
La clause JOIN ON utilisant une projection personnalisée
Traditionnellement, lors de l'écriture d'un INNER JOIN
o LEFT JOIN
nous utilisons la clause ON pour définir la condition de jointure.
Par exemple, pour obtenir les commentaires ainsi que le titre et l'identifiant de l'article qui leur sont associés, nous pouvons utiliser la requête de projection SQL suivante :
SELECT
post.post_id,
title,
review
FROM post
INNER JOIN post_comment ON post.post_id = post_comment.post_id
ORDER BY post.post_id, post_comment_id
Et nous obtenons l'ensemble des résultats suivants :
| post_id | title | review |
|---------|-----------|-----------|
| 1 | Java | Good |
| 1 | Java | Excellent |
| 2 | Hibernate | Awesome |
La clause JOIN USING utilisant une projection personnalisée
Lorsque la colonne de la clé étrangère et la colonne qu'elle référence ont le même nom, nous pouvons utiliser la clause USING, comme dans l'exemple suivant :
SELECT
post_id,
title,
review
FROM post
INNER JOIN post_comment USING(post_id)
ORDER BY post_id, post_comment_id
Et, le jeu de résultats pour cette requête particulière est identique à la requête SQL précédente qui a utilisé la clause ON :
| post_id | title | review |
|---------|-----------|-----------|
| 1 | Java | Good |
| 1 | Java | Excellent |
| 2 | Hibernate | Awesome |
La clause USING fonctionne pour Oracle, PostgreSQL, MySQL et MariaDB. Le serveur SQL ne prend pas en charge la clause USING, vous devez donc utiliser la clause ON à la place.
La clause USING peut être utilisée avec les instructions INNER, LEFT, RIGHT et FULL JOIN.
Clause SQL JOIN ON avec SELECT *
Maintenant, si nous changeons la requête précédente de la clause ON pour sélectionner toutes les colonnes en utilisant SELECT *
:
SELECT *
FROM post
INNER JOIN post_comment ON post.post_id = post_comment.post_id
ORDER BY post.post_id, post_comment_id
Nous allons obtenir l'ensemble des résultats suivants :
| post_id | title | post_comment_id | review | post_id |
|---------|-----------|-----------------|-----------|---------|
| 1 | Java | 1 | Good | 1 |
| 1 | Java | 2 | Excellent | 1 |
| 2 | Hibernate | 3 | Awesome | 2 |
Comme vous pouvez le voir, le post_id
es dupliqué car les deux post
y post_comment
Les tableaux contiennent un post_id
colonne.
Clause SQL JOIN USING avec SELECT *
D'autre part, si nous exécutons un SELECT *
qui comporte la clause USING pour la condition JOIN :
SELECT *
FROM post
INNER JOIN post_comment USING(post_id)
ORDER BY post_id, post_comment_id
Nous obtiendrons l'ensemble des résultats suivants :
| post_id | title | post_comment_id | review |
|---------|-----------|-----------------|-----------|
| 1 | Java | 1 | Good |
| 1 | Java | 2 | Excellent |
| 2 | Hibernate | 3 | Awesome |
Vous pouvez voir que cette fois, le post_id
est dédupliquée, de sorte qu'il n'existe qu'une seule colonne post_id
la colonne étant incluse dans le jeu de résultats.
Conclusion
Si le schéma de la base de données est conçu de telle sorte que les noms des colonnes de clés étrangères correspondent aux colonnes qu'elles référencent, et que les conditions de JOIN vérifient uniquement si la valeur de la colonne de clé étrangère est égale à la valeur de sa colonne miroir dans l'autre table, vous pouvez alors utiliser la clause USING.
Sinon, si le nom de la colonne de la clé étrangère diffère de celui de la colonne de référence ou si vous voulez inclure une condition de jointure plus complexe, vous devez utiliser la clause ON à la place.
2 votes
Il y a aussi le JOINT NATUREL : stackoverflow.com/questions/8696383/
0 votes
Notez que
using
a un autre usage que celui de jointures. Voir stackoverflow.com/a/13750399/6329510 votes
Cela répond-il à votre question ? Quelle est la différence entre "using" et "on" dans les jointures de tables en MySQL ?