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
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
- 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