SQLShack (Français)

Si vous voulez obtenir quelque chose de significatif à partir des données , vous devrez presque toujours joindre plusieurs tables. Dans cet article, nous allons montrer comment procéder en utilisant différents types de jointures. Pour y parvenir, nous allons combiner les JOINTS INNER et LEFT JOINs. Alors, commençons.

Le modèle

Dans limage ci-dessous, vous pouvez voir le modèle existant. Il se compose de 6 tableaux et nous lavons déjà plus ou moins décrit dans les articles précédents.

Pourtant, même sans décrire, si la base de données est modélisée et présentée de manière correcte (choisir les noms judicieusement, utiliser la convention de dénomination, suivre les mêmes règles dans tout le modèle, les lignes / relations dans le schéma ne se chevauchent pas plus que nécessaire), vous devriez pouvoir pour conclure où vous pouvez trouver les données dont vous avez besoin. Ceci est crucial car avant de joindre plusieurs tables, vous devez dabord identifier ces tables.

Nous parlerons de la convention de dénomination et des conseils sur la façon de penser lorsque vous écrivez des requêtes SQL, plus loin dans ce séries. Jusquà présent, vivons avec le fait que ce modèle est assez simple et que nous pouvons le faire assez facilement.

Que savons-nous jusquà présent?

Dans cette série, nous couvert:

  • Principes de base liés à linstruction SQL SELECT, et
  • Comparaison de INNER JOIN et LEFT JOIN

Nous utiliserons les connaissances à partir de ces deux articles et combinez-les pour écrire des instructions SELECT plus complexes qui joindront plusieurs tables.

Joindre plusieurs tables en utilisant INNER JOIN

Le premier exemple que nous analyserons est de savoir comment récupérer données de plusieurs tables en utilisant uniquement des JOINTS INNER Pour chaque exemple, nous allons utiliser la définition du problème que nous devons résoudre et la requête qui fait le travail. Commençons donc par le premier problème.

# 1 Nous devons répertorier tous les appels avec leur heure de début et leur heure de fin. Pour chaque appel, nous voulons afficher le résultat ainsi que le prénom et le nom de lemployé qui a effectué cet appel. Nous allons trier nos appels par heure de début par ordre croissant.

Avant décrire la requête, nous identifierons les tables que nous devons utiliser. Pour ce faire, nous devons déterminer quelles tables contiennent les données dont nous avons besoin et les inclure. De plus, nous devrions inclure toutes les tables le long du chemin entre ces tables – des tables qui ne contiennent pas les données nécessaires mais servent de relation entre les tables qui le font (ce nest pas le cas ici).

La requête qui fait le travail est donnée ci-dessous:

Le résultat de la requête est donné ci-dessous:

Il y a quelques choses que je voudrais souligner ici:

  • Les tables que nous avons jointes sont ici parce que les données dont nous avons besoin se trouve dans ces 3 tableaux
  • Chaque fois que je mentionne un attribut de nimporte quelle table, jutilise le format nom_table.nom_attribut (par exemple, employé.first_name). Bien que ce ne soit pas nécessaire, cest une bonne pratique, car parfois 2 tables ou plus dans la même requête pourraient utiliser les mêmes noms dattributs et cela entraînerait une erreur
  • Nous avons utilisé INNER JOIN 2 fois dans lordre pour joindre 3 tables. Cela entraînera le renvoi uniquement des lignes ayant des paires dans une autre table
  • Lorsque vous nutilisez que des INNER JOINs pour joindre plusieurs tables, lordre de ces tables dans les jointures nest pas important. La seule chose importante est que vous utilisiez des conditions de jointure appropriées après le « ON » (jointure en utilisant des clés étrangères)

Étant donné que tous les appels avaient un employé et un résultat dappel associés, nous obtiendrions le même résultat si nous avons utilisé LEFT JOIN au lieu de INNER JOIN.

Joindre plusieurs tables en utilisant LEFT JOIN

Lécriture de requêtes utilisant des LEFT JOINs ne diffère pas beaucoup par rapport à lécriture de requêtes en utilisant JOINTS INTÉRIEURS. Le résultat serait, bien sûr, différent (du moins dans les cas où certains enregistrements nont pas de paire dans dautres tables).

Cest le problème que nous voulons résoudre.

# 2 Répertoriez tous les pays et clients associés à ces pays. Pour chaque pays, affichez son nom en anglais, le nom de la ville où se trouve le client ainsi que le nom de ce client. Renvoyez même les pays sans villes associées et clients.

Les tableaux contenant les données dont nous avons besoin sont illustrés ci-dessous:

Tout dabord, allons vérifier rapidement quel est le contenu ents de ces 3 tableaux.

Nous pouvons remarquer deux choses importantes:

  • Bien que chaque ville ait un pays associé, tous les pays nont pas de villes associées (lEspagne & La Russie nen a pas)
  • Même chose pour les clients.Chaque client a la valeur city_id définie, mais seules 3 villes sont utilisées (Berlin, Zagreb & New York)

Commençons par noter le requête utilisant INNER JOIN:

Le résultat de la requête est affiché dans limage ci-dessous:

Nous avons 7 comtés et 6 villes dans notre base de données, mais notre requête ne renvoie que 4 lignes. Cest le résultat du fait que nous navons que 4 clients dans notre base de données. Chacun de ces 4 est lié à sa ville et la ville est liée au pays. Ainsi, INNER JOIN a éliminé tous ces pays et villes sans clients. Mais comment les inclure également dans le résultat?

Pour ce faire, nous utiliserons LEFT JOIN. Nous remplacerons simplement tout « INNER » par « LEFT », donc notre requête est la suivante:

Le résultat est montré dans limage ci-dessous:

Vous pouvez facilement remarquer que maintenant nous avons tous les pays, même ceux sans ville associée (Russie & Espagne), ainsi que tous villes, même celles sans clients (Varsovie, Belgrade & Los Angeles). Les 4 lignes restantes sont les mêmes que dans la requête utilisant INNER JOIN.

LEFT JOIN – Lordre des tables compte

Bien que lordre des JOINs dans INNER JOIN ne soit pas important, le même ne représente pas la jointure gauche. Lorsque nous utilisons LEFT JOIN pour joindre plusieurs tables, il est important de se rappeler que cette jointure inclura toutes les lignes de la table sur le côté GAUCHE de la JOIN. Réorganisons la requête précédente:

Dans un premier temps, vous pourriez facilement dire que cette requête et la précédente sont identiques (ceci est vrai lorsque vous utilisez INNER JOIN). Nous avons utilisé les mêmes tables, LEFT JOINs et les mêmes conditions de jointure. Examinons dabord le résultat:

Alors, que sest-il passé ici? Pourquoi avons-nous 4 lignes (les 4 mêmes que nous avions lorsque nous avons utilisé INNER JOIN)?

La réponse est simple et elle est liée au fonctionnement de LEFT JOIN. Il prend la première table (client) et joint toutes ses lignes (4 dentre elles) à la table suivante (ville). Le résultat est de 4 lignes car le client ne peut appartenir quà une seule ville. Ensuite, nous joignons ces 4 lignes à la table suivante (pays), et encore une fois nous avons 4 lignes car la ville pourrait appartenir à un seul pays.

La raison pour laquelle nous ne rejoindrions pas ces 3 tables dans ce la voie est donnée par le texte de lexemple n ° 2. La requête est rédigée de telle manière quelle renvoie 4 lignes, ce serait la réponse à la question suivante: Renvoyer les noms de tous les clients ainsi que les villes et les pays dans lesquels ils se trouvent. Renvoyer même les clients sans villes et pays associés.

  • Remarque: lorsque vous utilisez LEFT JOIN, lordre des tables dans cette instruction est important et la requête renverra un résultat différent si vous modifiez cet ordre. Lordre dépend en fait de ce que vous souhaitez renvoyer.

Rejoignez plusieurs tables en utilisant les deux – INNER JOIN & LEFT JOIN

Cest également possible. Reprenons un exemple.

# 3 Renvoie la liste de tous les pays et villes qui ont une paire (exclure les pays qui ne sont référencés par aucune ville). Pour de telles paires, renvoyez tous les clients. Renvoie même les paires nayant pas un seul client.

La requête qui fait le travail est:

Le résultat de la requête est donné dans limage ci-dessous:

Vous pouvez facilement remarquer que nous navons pas de pays sans ville associée (il sagissait de lEspagne & Russie). LINNER JOIN a éliminé ces lignes. Pourtant, nous avons des citations sans aucun client (Belgrade, Los Angeles & Varsovie). Cest le résultat du fait que nous avons utilisé LEFT JOIN entre les tables city et customer.

Conclusion

Lorsque vous devez joindre plusieurs tables, vous avez INNER & LEFT JOIN à votre disposition (RIGHT JOIN est rarement utilisé et peut être facilement remplacé par LEFT JOIN). La jointure que vous utiliserez dépend directement de la tâche que vous devez résoudre et vous en aurez une idée en cours de route. Dans les prochains articles, nous verrons comment penser et vous organiser lorsque vous devez rédiger des requêtes plus complexes.

Table des matières

Apprenez SQL: CREATE DATABASE & Opérations CREATE TABLE

Learn SQL: INSERT INTO TABLE

Learn SQL: Primary Key

Learn SQL: Foreign Key

Learn SQL: SELECT instruction

Apprendre SQL: INNER JOIN vs LEFT JOIN

Apprendre SQL: Scripts SQL

Apprendre SQL: Types de relations

Apprendre SQL: Joindre plusieurs tables

Apprendre SQL: Fonctions dagrégation

Apprendre SQL: Comment écrire un SELECT complexe Requête

Apprendre SQL: la base de données INFORMATION_SCHEMA

Apprendre 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: Sexercer aux requêtes SQL

Apprendre SQL: SQL Exemples de requêtes

Apprenez SQL: créez un rapport manuellement à laide 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

Apprendre SQL: Bonnes pratiques SQL pour la suppression et la mise à jour de données

Apprendre SQL: Conventions de dénomination

Apprendre SQL: Travaux liés à SQL

Apprendre SQL: jointures non équi dans SQL Server

Apprendre SQL: injection SQL

  • 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 messages dEmil Drkusic (voir tout)
  • 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 *