Joint interne Vs joint externe : Préparez-vous à explorer les différences exactes entre la jointure interne et externe
Avant d’explorer les différences entre la jointure interne Vs la jointure externe, voyons d’abord ce qu’est une jointure SQL ?
Une clause de jointure est utilisée pour combiner des enregistrements ou pour manipuler les enregistrements de deux tables ou plus à travers une condition de jointure. La condition de jointure indique comment les colonnes de chaque table sont mises en correspondance les unes avec les autres.
La jointure est basée sur une colonne liée entre ces tables. Un exemple le plus commun est la jointure entre deux tables à travers la colonne de clé primaire et la colonne de clé étrangère.
Supposons que nous avons une table qui contient le salaire de l’employé et il y a une autre table qui contient les détails de l’employé.
Dans ce cas, il y aura une colonne commune comme l’ID de l’employé qui joindra ces deux tables. Cette colonne ID de l’employé serait la clé primaire des tables de détails de l’employé et la clé étrangère dans la table de salaire de l’employé.
Il est très important d’avoir une clé commune entre les deux entités. Vous pouvez penser à une table comme une entité et la clé comme un lien commun entre les deux tables qui est utilisé pour l’opération de jointure.
Basiquement, il existe deux types de jointure en SQL c’est-à-dire la jointure interne et la jointure externe. La jointure externe est encore subdivisée en trois types c’est-à-dire la jointure externe gauche, la jointure externe droite et la jointure externe complète.
Dans cet article, nous verrons la différence entre la jointure interne et la jointure externe en détail. Nous garderons les jointures croisées et les jointures inégales hors du champ d’application de cet article.
- Qu’est-ce qu’une jointure interne ?
- Qu’est-ce qu’une jointure externe ?
- Différence entre la jointure interne et externe
- Performance
- Jonction interne et externe de MS Access
- Jointure gauche vs jointure externe gauche
- Joint externe gauche vs joint externe droit
- Différence entre la jointure interne et la jointure externe en format tabulaire
- Jointure interne et externe vs Union
- Conclusion
Qu’est-ce qu’une jointure interne ?
Une jointure interne ne retourne que les lignes qui ont des valeurs correspondantes dans les deux tables (nous considérons ici que la jointure est faite entre les deux tables).
Qu’est-ce qu’une jointure externe ?
La jointure externe inclut les lignes correspondantes ainsi que certaines des lignes non correspondantes entre les deux tables. Une jointure externe diffère fondamentalement de la jointure interne dans la façon dont elle gère la condition de fausse correspondance.
Il existe 3 types de jointure externe :
- Jointure externe gauche : Renvoie toutes les lignes de la table LEFT et les enregistrements correspondants entre les deux tables.
- Jointure externe droite : Renvoie toutes les lignes de la table DROITE et les enregistrements correspondants entre les deux tables.
- Jointure externe complète : Elle combine le résultat de la jointure externe gauche et de la jointure externe droite.
Différence entre la jointure interne et externe
Comme le montre le schéma ci-dessus, il y a deux entités à savoir la table 1 et la table 2 et les deux tables partagent certaines données communes.
Une jointure interne retournera la zone commune entre ces tables (la zone ombrée en vert dans le diagramme ci-dessus) c’est-à-dire tous les enregistrements qui sont communs entre la table 1 et la table 2.
Une jointure externe gauche retournera toutes les lignes de la table 1 et seulement les lignes de la table 2 qui sont communes à la table 1 également. Une jointure externe droite fera exactement l’inverse. Elle donnera tous les enregistrements de la table 2 et seulement les enregistrements correspondants de la table 1.
De plus, une jointure externe complète nous donnera tous les enregistrements de la table 1 et de la table 2.
Démarrons avec un exemple pour rendre cela plus clair.
Supposons que nous ayons deux tables : EmpDetails et EmpSalary.
Table EmpDetails :
EmployeeID | EmployeeName |
1 | John |
2 | Samantha |
3 | Hakuna |
4 | Silky |
5 | Ram |
6 | Arpit |
7 | Lily |
8 | Sita |
9 | Farah |
10 | Jerry |
Tableau des salaires :
EmployeeID | EmployeeName | EmployeeSalary |
---|---|---|
1 | John | 50000 |
2 | Samantha | 120000 |
3 | Hakuna | 75000 |
4 | Silky | 25000 |
5 | Ram | 150000 |
6 | Arpit | 80000 |
11 | Rose | 90000 |
12 | Sakshi | 45000 |
13 | Jack | 250000 |
Faisons une jointure interne sur ces deux tables et observons le résultat :
Recherche:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails INNER JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Résultat :
EmployeeID | EmployeeName | EmployeeSalary |
---|---|---|
1 | John | 50000 |
2 | Samantha | 120000 | 3 | Hakuna | 75000 |
4 | Silky | 25000 |
5 | Ram | 150000 |
6 | Arpit | 80000 |
Dans le jeu de résultats ci-dessus, vous pouvez voir que la jointure interne a retourné les 6 premiers enregistrements qui étaient présents à la fois dans EmpDetails et EmpSalary ayant une clé correspondante, c’est-à-dire EmployeeID.c’est-à-dire EmployeeID. Par conséquent, si A et B sont deux entités, la jointure interne retournera l’ensemble de résultats qui sera égal à ‘Enregistrements dans A et B’, sur la base de la clé correspondante.
Voyons maintenant ce que fera une jointure externe gauche.
Query:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails LEFT JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Résultat :
EmployeeID | EmployeeName | EmployeeSalary |
---|---|---|
1 | John | 50000 |
2 | Samantha | 120000 |
3 | Hakuna | 75000 |
4 | Silky | 25000 |
5 | Ram | 150000 |
6 | Arpit | 80000 |
7 | Lily | NULL |
8 | Sita | NULL |
9 | Farah | NULL |
10 | Jerry | NULL |
Dans l’ensemble de résultats ci-dessus, vous pouvez voir que la jointure externe gauche a retourné les 10 enregistrements de la table LEFT, c’est-à-dire la table EmpDetails.c’est-à-dire la table EmpDetails et comme les 6 premiers enregistrements correspondent, elle a renvoyé le salaire de l’employé pour ces enregistrements correspondants.
Comme le reste des enregistrements n’a pas de clé correspondante dans la table RIGHT, c’est-à-dire la table EmpSalary, elle a renvoyé NULL correspondant à ceux-ci. Puisque, Lily, Sita, Farah et Jerry n’ont pas d’ID d’employé correspondant dans la table EmpSalary, leur salaire apparaît comme NULL dans le jeu de résultats.
Donc, si A et B sont deux entités, alors la jointure externe gauche renverra le jeu de résultats qui sera égal à ‘Enregistrements dans A PAS B’, sur la base de la clé correspondante.
Observons maintenant ce que fait la jointure externe droite.
Query:
SELECT EmpDetails. EmployeeID, EmpDetails. EmployeeName, EmpSalary. EmployeeSalaryFROM EmpDetails RIGHT join EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Résultat :
EmployeeID | EmployeeName | EmployeeSalary |
---|---|---|
1 | John | 50000 |
2 | Samantha | 120000 |
3 | Hakuna | 75000 |
4 | Silky | 25000 |
5 | Ram | 150000 |
6 | Arpit | 80000 |
NULL | NULL | 90000 |
NULL | NULL | 250000 |
NULL | NULL | 250000 |
Dans l’ensemble de résultats ci-dessus, vous pouvez voir que la jointure externe droite a fait exactement le contraire de la jointure gauche. Elle a retourné tous les salaires de la table de droite c’est-à-dire la table EmpSalary.
Mais, comme Rose, Sakshi et Jack n’ont pas d’ID d’employé correspondant dans la table de gauche c’est-à-dire la table EmpDetails, nous avons obtenu leur ID d’employé et leur EmployeeName comme NULL de la table de gauche.
Donc, si A et B sont deux entités, alors la jointure externe droite renverra le jeu de résultats qui sera égal à ‘Enregistrements dans B PAS A’, basé sur la clé correspondante.
Voyons également quel sera le jeu de résultats si nous effectuons une opération de sélection sur toutes les colonnes des deux tables.
Query:
SELECT *FROM EmpDetails RIGHT JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Résultat :
EmployeeID | EmployeeName | EmployeeID | EmployeeName | EmployeeSalary |
---|---|---|---|---|
1 | John | 1 | John | 50000 |
2 | Samantha | 2 | Samantha | 120000 |
3 | Hakuna | 3 | Hakuna | 75000 |
4 | Silky | 4 | Silky | 25000 |
5 | Ram | 5 | Ram | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
NULL | NULL | 11 | Rose | 90000 |
NULL | NULL | 12 | Sakshi | 250000 |
NULL | NULL | 13 | Jack | 250000 |
Maintenant, passons à la jointure complète.
Une jointure externe complète est effectuée lorsque nous voulons toutes les données des deux tables, indépendamment du fait qu’il y ait une correspondance ou non. Par conséquent, si je veux tous les employés même si je ne trouve pas de clé correspondante, je vais exécuter une requête comme indiqué ci-dessous.
Querie:
SELECT *FROM EmpDetails FULL JOIN EmpSalaryON EmpDetails. EmployeeID = EmpSalary. EmployeeID;
Résultat :
EmployeeID | EmployeeName | EmployeeID | EmployeeName | EmployeeSalary |
---|---|---|---|---|
1 | John | 1 | John | 50000 |
2 | Samantha | 2 | Samantha | 120000 |
3 | Hakuna | 3 | Hakuna | 75000 |
4 | Silky | 4 | Silky | 25000 |
5 | Ram | 5 | Ram | 150000 |
6 | Arpit | 6 | Arpit | 80000 |
7 | Lily | NULLE | NULLE | NULLE |
8 | Sita | NULLE | NULLE | NULLE |
9 | Farah | NULL | NULL | NULL |
10 | Jerry | NULL | NULL | NULL |
NULL | NULL | 11 | Rose | 90000 |
NULL | NULL | 12 | Sakshi | 250000 |
NULL | NULL | 13 | Jack | 250000 |
Vous pouvez voir dans le jeu de résultats ci-dessus que les six premiers enregistrements correspondent dans les deux tables, nous avons obtenu toutes les données sans aucun NULL. Les quatre enregistrements suivants existent dans la table de gauche mais pas dans la table de droite, donc les données correspondantes dans la table de droite sont NULL.
Les trois derniers enregistrements existent dans la table de droite et pas dans la table de gauche, donc nous avons NULL dans les données correspondantes de la table de gauche. Donc, si A et B sont deux entités, la jointure externe complète renverra l’ensemble de résultats qui sera égal à ‘Enregistrements dans A ET B’, indépendamment de la clé correspondante.
Théoriquement, c’est une combinaison de la jointure gauche et de la jointure droite.
Performance
Comparons une jointure interne par rapport à une jointure externe gauche dans le serveur SQL. En parlant de la vitesse d’opération, une jointure externe gauche n’est évidemment pas plus rapide qu’une jointure interne.
Selon la définition, une jointure externe, que ce soit la gauche ou la droite, elle doit effectuer tout le travail d’une jointure interne ainsi que le travail supplémentaire null- extension des résultats. On s’attend à ce qu’une jointure externe renvoie un plus grand nombre d’enregistrements, ce qui augmente encore son temps d’exécution total juste à cause du plus grand ensemble de résultats.
Donc, une jointure externe est plus lente qu’une jointure interne.
De plus, il peut y avoir quelques situations spécifiques où la jointure gauche sera plus rapide qu’une jointure interne, mais nous ne pouvons pas continuer pour les remplacer l’une par l’autre car une jointure externe gauche n’est pas fonctionnellement équivalente à une jointure interne.
Discutons d’un cas où la jointure gauche pourrait être plus rapide que la jointure interne. Si les tables impliquées dans l’opération de jointure sont trop petites, disons qu’elles ont moins de 10 enregistrements et que les tables ne possèdent pas suffisamment d’index pour couvrir la requête, dans ce cas, la jointure gauche est généralement plus rapide que la jointure interne.
Créons les deux tables ci-dessous et faisons une JOINTURE INTERNE et une JOINTURE EXTERNE GAUCHE entre elles à titre d’exemple :
CREATE TABLE #Table1(ID int NOT NULL PRIMARY KEY,Name varchar(50) NOT NULL)INSERT #Table1 (ID, Name) VALUES (1, 'A')INSERT #Table1 (ID, Name) VALUES (2, 'B')INSERT #Table1 (ID, Name) VALUES (3, 'C')INSERT #Table1 (ID, Name) VALUES (4, 'D')INSERT #Table1 (ID, Name) VALUES (5, 'E')CREATE TABLE #Table2(ID int NOT NULL PRIMARY KEY,Name varchar(50) NOT NULL)INSERT #Table2 (ID, Name) VALUES (1, 'A')INSERT #Table2 (ID, Name) VALUES (2, 'B')INSERT #Table2 (ID, Name) VALUES (3, 'C')INSERT #Table2 (ID, Name) VALUES (4, 'D')INSERT #Table2 (ID, Name) VALUES (5, 'E')SELECT *FROM #Table1 t1INNER JOIN #Table2 t2ON t2.Name = t1.Name
ID | Nom | ID | Nom | |
---|---|---|---|---|
1 | 1 | A | 1 | A |
2 | 2 | B | 2 | B |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | E | 5 | E |
SELECT * FROM (SELECT 38 AS bah) AS foo JOIN (SELECT 35 AS bah) AS barON (55=55);
.
ID | Name | ID | Name | |
---|---|---|---|---|
1 | 1 | A | 1 | A |
2 | 2 | B | 2 | B |
3 | 3 | C | 3 | C |
4 | 4 | D | 4 | D |
5 | 5 | E | 5 | E |
Comme vous pouvez le voir ci-dessus, les deux requêtes ont retourné le même ensemble de résultats. Dans ce cas, si vous visualisez le plan d’exécution des deux requêtes, alors vous constaterez que la jointure interne a coûté plus cher que la jointure externe. C’est parce que, pour une jointure interne, le serveur SQL fait une correspondance de hachage alors qu’il fait des boucles imbriquées pour la jointure gauche.
Une correspondance de hachage est normalement plus rapide que les boucles imbriquées. Mais, dans ce cas, comme le nombre de lignes est si petit et qu’il n’y a pas d’index à utiliser (car nous faisons la jointure sur la colonne nom), l’opération de hachage s’est avérée être une requête de jointure interne des plus coûteuses.
Cependant, si vous changez la clé de correspondance dans la requête de jointure de Nom à ID et s’il y a un grand nombre de lignes dans la table, alors vous trouverez que la jointure interne sera plus rapide que la jointure externe gauche.
Jonction interne et externe de MS Access
Lorsque vous utilisez plusieurs sources de données dans une requête MS Access, alors vous appliquez des JOINs pour contrôler les enregistrements que vous voulez voir, selon la façon dont les sources de données sont liées entre elles.
Dans une jointure interne, seuls ceux qui sont liés des deux tables sont combinés dans un seul ensemble de résultats. C’est une jointure par défaut dans Access et la plus fréquemment utilisée aussi. Si vous appliquez une jointure mais ne spécifiez pas explicitement de quel type de jointure il s’agit, alors l’Access suppose qu’il s’agit d’une jointure interne.
Dans les jointures externes, toutes les données liées des deux tables sont combinées correctement, plus toutes les lignes restantes d’une table. Dans les jointures externes complètes, toutes les données sont combinées dans la mesure du possible.
Jointure gauche vs jointure externe gauche
En SQL server, le mot clé outer est facultatif lorsque vous appliquez une jointure externe gauche. Ainsi, cela ne fait aucune différence si vous écrivez soit ‘LEFT OUTER JOIN’ soit ‘LEFT JOIN’ car les deux vont vous donner le même résultat.
A LEFT JOIN B est une syntaxe équivalente à A LEFT OUTER JOIN B.
Vous trouverez ci-dessous la liste des syntaxes équivalentes dans le serveur SQL:
Joint externe gauche vs joint externe droit
Nous avons déjà vu cette différence dans cet article. Vous pouvez vous référer aux requêtes Left Outer Join et Right Outer Join et au jeu de résultats pour voir la différence.
La principale différence entre la Left Join et la Right Join réside dans l’inclusion des lignes non appariées. La jointure externe gauche inclut les lignes non appariées de la table qui est à gauche de la clause de jointure alors qu’une jointure externe droite inclut les lignes non appariées de la table qui est à droite de la clause de jointure.
Les gens se demandent en effet ce qui est mieux à utiliser c’est-à-dire la jointure gauche ou la jointure droite ? Fondamentalement, ils sont le même type d’opérations, sauf avec leurs arguments inversés. Par conséquent, lorsque vous demandez quelle jointure utiliser, vous demandez en fait s’il faut écrire a<b ou b>a. C’est juste une question de préférence.
Généralement, les gens préfèrent utiliser la jointure gauche dans leur requête SQL. Je suggérerais que vous devriez rester cohérent dans la façon dont vous dans laquelle sont écrites la requête afin d’éviter toute confusion dans l’interprétation de la requête.
Nous avons vu tout sur la jointure interne et tout type de jointures externes jusqu’à présent. Résumons rapidement la différence entre la jointure interne et la jointure externe.
Différence entre la jointure interne et la jointure externe en format tabulaire
La jointure interne | La jointure externe |
---|---|
Retourne uniquement les lignes qui ont des valeurs correspondantes dans les deux tables. | Inclut les lignes correspondantes ainsi que certaines des lignes non correspondantes entre les deux tables. |
Dans le cas où il y a un grand nombre de lignes dans les tables et qu’il y a un index à utiliser, INNER JOIN est généralement plus rapide que OUTER JOIN. | Généralement, un OUTER JOIN est plus lent qu’un INNER JOIN car il doit retourner un plus grand nombre d’enregistrements par rapport à INNER JOIN. Cependant, il peut y avoir certains scénarios spécifiques où OUTER JOIN est plus rapide. |
Lorsqu’une correspondance n’est pas trouvée, elle ne renvoie rien. | Lorsqu’une correspondance n’est pas trouvée, un NULL est placé dans la valeur de la colonne renvoyée. |
Utilisez INNER JOIN lorsque vous voulez consulter les informations détaillées d’une colonne spécifique. | Utilisez OUTER JOIN lorsque vous voulez afficher la liste de toutes les informations des deux tables. |
INNER JOIN agit comme un filtre. Il doit y avoir une correspondance sur les deux tables pour qu’une jointure interne renvoie des données. | Elles agissent comme des ajouts de données. |
Implicit join notation existe pour la jointure interne qui enrôle les tables à joindre de la manière séparée par des virgules dans la clause FROM. Exemple : SELECT * FROM produit, catégorie WHERE produit.CategoryID = catégorie.CategoryID; |
La notation de jointure implicite n’existe pas pour la jointure externe. |
Voici la visualisation d’une jointure interne : |
Voici la visualisation d’une jointure externe |
Jointure interne et externe vs Union
Parfois, nous confondons la jointure et l’union et c’est aussi l’une des questions les plus fréquemment posées dans les entretiens SQL. Nous avons déjà vu la différence entre la jointure interne et la jointure externe . Maintenant, voyons comment une JOIN est différente d’une UNION.
L’UNION place une ligne de requêtes l’une après l’autre, alors que la jointure crée un produit cartésien et le sous-ensemble. Ainsi, UNION et JOIN sont des opérations complètement différentes.
Exécutons les deux requêtes ci-dessous dans MySQL et voyons leur résultat.
Demande UNION:
SELECT 28 AS bahUNIONSELECT 35 AS bah;
Résultat :
Bah | |
---|---|
1 | 28 |
2 | 35 |
QuêteJOIN :
SELECT * FROM(SELECT 38 AS bah) AS fooJOIN(SELECT 35 AS bah) AS barON (55=55);
Résultat :
foo | Bar | |
---|---|---|
1 | 38 | 35 |
Une opération UNION met le résultat de deux ou plusieurs requêtes dans un seul jeu de résultats. Ce jeu de résultats contient tous les enregistrements retournés par toutes les requêtes impliquées dans l’UNION. Ainsi, fondamentalement, un UNION combine les deux ensembles de résultats ensemble.
Une opération de jointure récupère les données de deux ou plusieurs tables en fonction des relations logiques entre ces tables c’est-à-dire en fonction de la condition de jointure. Dans la requête de jointure, les données d’une table sont utilisées pour sélectionner les enregistrements d’une autre table. Elle vous permet de relier des données similaires qui sont présentes sur différentes tables.
Pour le comprendre très simplement, on peut dire qu’un UNION combine des lignes de deux tables alors qu’une jointure combine des colonnes de deux tables ou plus. Ainsi, les deux sont utilisés pour combiner les données de n tables, mais la différence réside dans la façon dont les données sont combinées.
Vous trouverez ci-dessous les représentations imagées de UNION et JOIN.
Ce qui précède est une représentation imagée d’une opération de jointure décrivant que chaque enregistrement dans le jeu de résultats contient des colonnes des deux tables c’est-à-dire la table A et la table B. Ce résultat est renvoyé en fonction de la condition de jointure appliquée dans la requête.
Une jointure est généralement le résultat de la dénormalisation (opposé de la normalisation) et elle utilise la clé étrangère d’une table pour rechercher les valeurs de la colonne en employant la clé primaire dans une autre table.
La représentation imagée ci-dessus d’une opération UNION décrivant que chaque enregistrement dans l’ensemble de résultats est une ligne de l’une ou l’autre des deux tables. Ainsi, le résultat de l’UNION a combiné les lignes de la table A et de la table B.
Lecture complémentaire =>> L’UNION MySQL expliquée avec des exemples
Conclusion
Dans cet article, nous avons vu les principales différences entre la jointure interne et la jointure externe en SQL. Nous avons également vu la classification d’une jointure externe c’est-à-dire la jointure gauche, la jointure droite et la jointure complète. Nous avons vu comment chacun de ces types de jointure fonctionne et comment ils varient les uns des autres.
Nous avons également fait une comparaison des performances entre ces types de jointure. Nous avons également discuté de la façon dont une jointure est différente d’une union.
Aussi lu =>> MySQL Join Types
J’espère que cet article vous aurait aidé à dissiper vos doutes concernant les différences entre les différents types de jointure. Nous sommes sûrs que cela vous permettra en effet de décider du type de jointure à choisir en fonction de l’ensemble de résultats souhaité.