SQLShack (Français)

INNER JOIN vs LEFT JOIN, cest-à-dire la question. Aujourdhui, nous allons expliquer brièvement comment ces deux types de jointures sont utilisés et quelle est la différence. Nous reviendrons sur ce sujet plus tard lorsque nous développerons notre modèle et serons en mesure décrire des requêtes beaucoup plus complexes.

Changements dans les données

Avant de comparer INNER JOIN vs JOINT GAUCHE, voyons ce que nous savons actuellement. Jusquà présent, dans cette série, nous avons expliqué les principes de base des bases de données: comment créer une base de données et des tables, comment remplir des tables avec des données et vérifier ce qui y est stocké à laide de requêtes simples. Nous avons même joint deux tables dans larticle précédent. Nous sommes maintenant prêts pour la prochaine étape.

Mais avant dy passer, apportons juste une modification mineure à nos données. Nous allons ajouter 2 lignes dans la table country, en utilisant les commandes INSERT INTO suivantes:

Nous allons maintenant vérifier le contenu des deux tables:

Vous pouvez facilement remarquer que nous avons 2 nouvelles lignes dans le pays du tableau, une pour lEspagne et une pour la Russie. Leurs identifiants sont 6 et 7. Notez également que dans la table des villes, il ny a pas de country_id avec la valeur 6 ou 7. Cela signifie simplement que nous navons pas de ville de Russie ou dEspagne dans notre base de données. Nous utiliserons ce fait plus tard.

INNER JOIN

Discutons de ces deux requêtes:

Le résultat quelles renvoient est présenté sur limage ci-dessous:

Les deux requêtes renvoient exactement le même résultat. Ce nest pas un accident mais le résultat du fait quil sagit de la même requête écrite de deux manières différentes. Les deux méthodes sont correctes, et vous pouvez utiliser nimporte laquelle dentre elles.

Dans la première requête, nous avons répertorié toutes les tables que nous utilisons dans la partie FROM de la requête (FROM pays, ville), puis nous sommes allées avec la jointure condition dans la partie WHERE de la requête (WHERE city.country_id = country.id). Au cas où nous aurions oublié décrire cette condition de jointure, nous aurions le produit cartésien des deux tables.

Dans la deuxième requête, nous navons quune seule table dans la partie FROM de la requête (FROM country) et puis nous avons la deuxième table et la condition JOIN dans la partie JOIN de la requête (INNER JOIN city ON city.country_id = country.id).

Bien que les deux requêtes soient bien écrites, je suggérerais que vous utilisez toujours INNER JOIN au lieu de lister les tables et de les joindre dans la partie WHERE de la requête. Il y a plusieurs raisons à cela:

  • La lisibilité est bien meilleure car la table utilisée et la condition JOIN associée sont dans la même ligne. Vous pouvez facilement voir si vous avez omis la condition JOIN ou non
  • Si vous souhaitez utiliser dautres JOIN plus tard (GAUCHE ou DROITE), vous ne pouvez pas le faire (facilement) à moins davoir utilisé INNER JOIN auparavant que

Maintenant, commentons ce que les requêtes ont réellement renvoyé:

  • Toutes les paires de pays et de villes qui sont liées (via une clé étrangère)
  • Nous navons pas 2 pays dans la liste (Espagne et Russie), car ils nont aucune ville associée dans le tableau des villes

LEFT JOIN

Je le répète: « Nous navons pas 2 pays sur la liste (Espagne et Russie) car ils nont aucune ville associée dans le tableau des villes ». Cela savérera crucial lors de la comparaison entre INNER JOIN et LEFT JOIN.

Dans certains cas, nous voulons même avoir ces enregistrements dans nos résultats. Par exemple, vous voulez simplement voir dans le résultat que ces pays nont pas denregistrements associés dans une autre table. Cela pourrait faire partie dun contrôle, ou peut-être simplement compter les cas, etc. Quelle que soit la motivation derrière ce désir, nous devrions être techniquement capables de le faire. Et nous sommes. Dans les bases de données, LEFT JOIN fait exactement cela.

Le résultat de LEFT JOIN sera le même que celui de INNER JOIN + nous aurons des lignes, de la table « gauche », sans paire dans le table « droite ». Nous utiliserons la même requête INNER JOIN et remplacerons simplement le mot INNER par LEFT. Voici le résultat:

Vous pouvez facilement remarquer que nous avons 2 lignes de plus, par rapport au résultat de lINNER REJOINDRE la requête. Ce sont des lignes pour la Russie et lEspagne. Puisquils nont pas tous deux de ville associée, tous les attributs de ville de ces deux lignes ont des valeurs NULL (ne sont pas définis). Cest la plus grande différence lorsque lon compare INNER JOIN et LEFT JOIN.

RIGHT JOIN

Vous entendrez au moins parler de RIGHT JOIN. Il est rarement utilisé car il renvoie le même résultat que LEFT JOIN. Par contre, les requêtes qui utilisent LEFT JOIN sont beaucoup plus faciles à lire car nous listons simplement les tables les unes après les autres.

Ceci est léquivalent de la requête précédente utilisant le RIGHT JOIN:

Vous pouvez remarquer que les valeurs renvoyées sont les mêmes, seulement dans ce cas, les valeurs de la table des villes sont dans les 5 premières colonnes, et country- les valeurs associées viennent après eux.

INNER JOIN vs LEFT JOIN

INNER JOIN vs LEFT JOIN?En fait, ce nest pas du tout la question. Vous utiliserez INNER JOIN lorsque vous souhaitez renvoyer uniquement les enregistrements ayant une paire des deux côtés, et vous utiliserez LEFT JOIN lorsque vous aurez besoin de tous les enregistrements de la table «gauche», peu importe sils ont une paire dans la table «droite» ou non. Si vous avez besoin de tous les enregistrements des deux tables, peu importe si elles ont une paire, vous devrez utiliser CROSS JOIN (ou le simuler à laide de LEFT JOINs et UNION). Plus dinformations à ce sujet dans les prochains articles.

Table des matières

Apprenez SQL: CREATE DATABASE & CREATE TABLE Operations

Apprendre SQL: INSÉRER DANS LA TABLE

Apprendre SQL: Clé primaire

Apprendre SQL: Clé étrangère

Apprenez SQL: instruction SELECT

Apprenez SQL: INNER JOIN vs LEFT JOIN

Apprenez SQL: Scripts SQL

Apprendre SQL: Types de relations

Apprendre SQL: Joindre plusieurs tables

Apprendre SQL: Fonctions dagrégation

Apprendre SQL: Comment écrire une requête SELECT complexe

Apprenez SQL: la base de données INFORMATION_SCHEMA

Apprenez SQL: types de données SQL

Apprendre SQL: Théorie des ensembles

Apprendre SQL: Fonctions définies par lutilisateur

Apprendre SQL: Procédures stockées définies par lutilisateur

Apprendre SQL: Vues SQL

Apprendre SQL: Déclencheurs SQL

Apprendre SQL: Pratiquer les requêtes SQL

Apprendre SQL: exemples de requêtes SQL

Apprendre SQL: créer un rapport manuellement utilisation de requêtes SQL

Apprenez SQL: fonctions de date et dheure SQL Server

Apprenez SQL: créez des rapports SQL Server à laide des fonctions de date et dheure

Apprenez SQL: tableaux croisés dynamiques SQL Server

Apprenez SQL: exportation SQL Server vers Excel

Apprenez SQL: introduction aux boucles SQL Server

Apprenez SQL: curseurs SQL Server

Apprenez SQL: Meilleures pratiques SQL pour la suppression et la mise à jour de données

Apprenez SQL: Conventions de dénomination

Apprendre SQL: travaux liés à SQL

Apprendre SQL: jointures non équi dans SQL Server

Apprendre SQL: SQL Injection

  • Auteur
  • Messages récents
Emil est un professionnel des bases de données avec plus de 10 ans dexpérience dans tout ce qui concerne les bases de données. Au cours des années, il a travaillé dans lindustrie informatique et financière et travaille maintenant comme pigiste.
Ses engagements passés et présents vont de la conception et du codage de bases de données à lenseignement, au conseil et à la rédaction de bases de données. A ne pas oublier aussi, BI, création dalgorithmes, échecs, philatélie, 2 chiens, 2 chats, 1 femme, 1 bébé …
Vous pouvez le trouver sur LinkedIn
Voir tous les articles dEmil Drkusic

Derniers articles dEmil Drkusic (tout voir)
  • Learn SQL: SQL Injection – 2 novembre 2020
  • Learn SQL: Non-Equi Joins in SQL Server – 29 septembre 2020
  • Learn SQL: Emplois liés à SQL – 1er septembre 2020

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *