Pablo Santa Cruz est correcte, cependant, si quelqu'un tombe sur cette page et a besoin de plus de précisions, voici une ventilation détaillée ;
Exemple de tableau
Supposons que nous ayons le tableau suivant :
-- t1
id name
1 Tim
2 Marta
-- t2
id name
1 Tim
3 Katarina
Connexion intérieure
Connexion interne, comme indiqué ci-dessous :
SELECT *
FROM `t1`
INNER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
nous permettra uniquement de voir les enregistrements qui apparaissent dans les deux tableaux, comme indiqué ci-dessous :
1 Tim 1 Tim
Les jointures internes n'ont aucune direction (par exemple gauche ou droite) car elles sont explicitement bidirectionnelles - nous avons besoin que les deux côtés correspondent.
JOINTURE EXTERNE
Les jointures externes, en revanche, sont utilisées pour rechercher des enregistrements qui peuvent ne pas correspondre dans une autre table. Par conséquent, vous devez spécifier de quel côté de la connexion il peut y avoir des enregistrements manquants.
Abréviations pour
; j'utiliserai leurs noms complets ci-dessous pour renforcer le concept de jointures externes et de jointures internes. LEFT JOIN和RIGHT JOIN是LEFT OUTER JOIN和RIGHT OUTER JOIN
Jointure externe gauche
Jointure externe gauche, comme indiqué ci-dessous :
SELECT *
FROM `t1`
LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
...obtiendra tous les enregistrements de la table de gauche, qu'ils aient ou non une correspondance dans la table de droite, comme ceci :
1 Tim 1 Tim
2 Marta NULL NULL
Jointure externe droite
Jointure externe droite, comme indiqué ci-dessous :
SELECT *
FROM `t1`
RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
...obtiendra tous les enregistrements de la table de droite, qu'ils aient ou non une correspondance dans la table de gauche, comme ceci :
1 Tim 1 Tim
NULL NULL 3 Katarina
Jointure externe complète
Une jointure externe complète nous donnera tous les enregistrements des deux tables, qu'ils aient une correspondance dans l'autre table, ou NULL des deux côtés sinon. Le résultat ressemble à ceci :
1 Tim 1 Tim
2 Marta NULL NULL
NULL NULL 3 Katarina
Cependant, comme l'a souligné Pablo Santa Cruz, MySQL ne prend pas en charge cela. Nous pouvons le simuler avec une UNION de jointure gauche et de jointure droite comme ceci :
SELECT *
FROM `t1`
LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
UNION
SELECT *
FROM `t1`
RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
Vous pouvez considérer
comme « exécuter ces deux requêtes, puis empiler les résultats ensemble » ; certaines lignes proviendront de la première requête et d'autres de la seconde. UNION
Notez que
dans MySQL élimine les doublons exacts : Tim apparaîtra ici dans les deux requêtes, mais les résultats pour UNION 会消除精确的重复项:Tim 会出现在此处的两个查询中,但 UNION 的结果仅列出他一次。我的数据库专家同事认为不应依赖这种行为。因此,为了更明确地说明这一点,我们可以向第二个查询添加一个 WHERE ne le répertorient qu'une seule fois. Mes collègues experts en bases de données estiment qu'il ne faut pas se fier à ce comportement. Ainsi, pour rendre cela plus explicite, nous pouvons ajouter une clause WHERE à la deuxième requête :
SELECT *
FROM `t1`
LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
UNION
SELECT *
FROM `t1`
RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
WHERE `t1`.`id` IS NULL;
D'un autre côté, si pour une raison quelconque vous souhaitez voir les doublons, vous pouvez utiliser UNION ALL.
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
La requête ci-dessus convient au cas particulier où l'opération jointure externe complète ne produira aucune ligne en double. La requête ci-dessus s'appuie sur l'opérateur d'ensemble UNION pour supprimer les lignes en double introduites par le modèle de requête. Nous pouvons éviter d'introduire des lignes en double en utilisant le modèle anti-join
sur la deuxième requête, puis en utilisant l'opérateur d'ensemble UNION ALL pour combiner les deux ensembles. Dans le cas plus général où une jointure externe complète renverra des lignes en double, nous pouvons faire ceci : 🎜
SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION ALL
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
WHERE t1.id IS NULL
La réponse donnée par
Pablo Santa Cruz est correcte, cependant, si quelqu'un tombe sur cette page et a besoin de plus de précisions, voici une ventilation détaillée ;
Exemple de tableau
Supposons que nous ayons le tableau suivant :
Connexion intérieure
Connexion interne, comme indiqué ci-dessous :
nous permettra uniquement de voir les enregistrements qui apparaissent dans les deux tableaux, comme indiqué ci-dessous :
Les jointures internes n'ont aucune direction (par exemple gauche ou droite) car elles sont explicitement bidirectionnelles - nous avons besoin que les deux côtés correspondent.
JOINTURE EXTERNE
Les jointures externes, en revanche, sont utilisées pour rechercher des enregistrements qui peuvent ne pas correspondre dans une autre table. Par conséquent, vous devez spécifier de quel côté de la connexion il peut y avoir des enregistrements manquants. Abréviations pour
; j'utiliserai leurs noms complets ci-dessous pour renforcer le concept de jointures externes et de jointures internes.
Jointure externe gaucheLEFT JOIN
和RIGHT JOIN
是LEFT OUTER JOIN
和RIGHT OUTER JOIN
comme « exécuter ces deux requêtes, puis empiler les résultats ensemble » ; certaines lignes proviendront de la première requête et d'autres de la seconde.
Notez queUNION
dans MySQL élimine les doublons exacts : Tim apparaîtra ici dans les deux requêtes, mais les résultats pour
UNION
会消除精确的重复项:Tim 会出现在此处的两个查询中,但UNION
的结果仅列出他一次。我的数据库专家同事认为不应依赖这种行为。因此,为了更明确地说明这一点,我们可以向第二个查询添加一个WHERE
ne le répertorient qu'une seule fois. Mes collègues experts en bases de données estiment qu'il ne faut pas se fier à ce comportement. Ainsi, pour rendre cela plus explicite, nous pouvons ajouter une clauseWHERE
à la deuxième requête :D'un autre côté, si pour une raison quelconque vous souhaitez voir les doublons, vous pouvez utiliser
UNION ALL
.Vous n'avez pas de connexions complètes dans MySQL, mais vous pouvez certainement les simuler.
Pour le code exemple transcrit de cette question Stack Overflow
vous avez :La requête ci-dessus convient au cas particulier où l'opération jointure externe complète ne produira aucune ligne en double. La requête ci-dessus s'appuie sur l'opérateur d'ensemble UNION pour supprimer les lignes en double introduites par le modèle de requête. Nous pouvons éviter d'introduire des lignes en double en utilisant le modèle anti-join
sur la deuxième requête, puis en utilisant l'opérateur d'ensemble UNION ALL pour combiner les deux ensembles. Dans le cas plus général où une jointure externe complète renverra des lignes en double, nous pouvons faire ceci : 🎜