Maison > développement back-end > tutoriel php > 3 autres joints que vous devriez être familier avec

3 autres joints que vous devriez être familier avec

Joseph Gordon-Levitt
Libérer: 2025-02-16 13:06:13
original
522 Les gens l'ont consulté

3 autres joints que vous devriez être familier avec

Les plats clés

  • L'article explique l'utilisation de la jointure de gauche, de la jointure droite, de la jointure intérieure et de la jointure extérieure dans SQL, en utilisant un exemple simple d'une base de données de prêt de livre avec deux tableaux: clients et livres.
  • Le concept de «gauche» et de «droite» dans les jointures SQL est clarifié comme rien de plus que l'ordre source. Le tableau mentionné avant le mot-clé JOIN est le tableau «gauche» et celui qui est le tableau «droit».
  • L'article présente le concept de jointures avec des exclusions, qui sont utiles pour les requêtes qui incluent les mots «non» ou «pas». Ces jointures utilisent une clause où exclure les données, en particulier lorsque vous recherchez des valeurs nulles.
  • La jointure extérieure avec les exclusions est décrite comme étant utile pour sélectionner des données sans connexion entre les tables, bien qu'elle ne soit pas prise en charge dans MySQL.
  • Il est souligné que la clause Where doit toujours être utilisée contre les champs qui ne peuvent pas avoir null comme valeur réelle. En outre, il est à noter que Cross Join est une jointure unique qui correspond à chaque ligne du tableau A à chaque ligne du tableau B.

Il existe de nombreuses façons de rejoindre les données de deux tables de base de données et de filtrer les informations dont vous avez besoin. Craig Buckler a écrit un article populaire sur la compréhension des jointures; à savoir intérieur, à gauche, à droite et à l'extérieur complet. Cet article est une extension de celui-là.

Récapitulons très rapidement ces derniers. Imaginez deux tables, une pour les clients et une pour les livres pour établir une base de données de prêts de livres.


Tableau des clients

id FirstName LastName book_id 1 Joe Souffler 1 2 Jeanne Biche 2 3 Harceler Corbeau 2 4 Jeffrey Neige 0

Table des livres

id Titre 1 Star Wars 2 Jurassique 3 Petites femmes 4 Tom Sawyer

La table des livres a une ligne pour chaque livre.

La table des clients a une ligne pour chaque client qui ne peut avoir qu'un seul livre en prêt à la fois. S'ils n'ont pas de livre en prêt, le book_id serait 0 ou une chaîne vide.

C'est un exemple très simple pour rendre les jointures aussi claires que possible pour comprendre!

Une jointure de gauche ici serait dans le cas où vous souhaitez poser une question telle que " Montrez-moi tous les clients, y compris tous les livres en prêt. "

3 autres joints que vous devriez être familier avec

Vous pouvez voir dans l'image que toutes les données du cercle de gauche ou du tableau sont incluses dans l'ensemble de résultats. Seules les données qui chevauchent le tableau des livres sont incluses à partir de la bonne table. Cela signifie qu'avec une jointure de gauche, certaines données dans la table droite peuvent être exclues.

Une jointure droite serait comme demander " montrez-moi tous les livres de ma bibliothèque, ainsi que tous les clients qui les ont empruntés. "

3 autres joints que vous devriez être familier avec

Dans cette image, vous voyez que toutes les données de la bonne table sont incluses dans l'ensemble de résultats. Seules les données qui chevauchent le tableau des clients sont incluses. Cela signifie qu'avec une jointure droite, certaines données du tableau de gauche peuvent être exclues.

Une jointure extérieure serait comme demander " montrez-moi tous les prêts et tous les livres, indépendamment des liens entre eux. "

3 autres joints que vous devriez être familier avec

Dans cette image, vous pouvez voir que toutes les données des deux tables seront incluses, que certaines données se chevauchent. Lorsqu'une question comme celle-ci est terminée, vous aurez des données non chevauchantes dans le résultat, et ces champs seront définis sur Null.

Une jointure intérieure serait comme demander " ne montrent que des clients avec un prêt. "

3 autres joints que vous devriez être familier avec

Ici, vous pouvez voir que les données peuvent être exclues des tables gauche et droite. Vous ne verrez aucun client s'ils n'ont pas de livre, et vous ne verrez aucun livre s'il n'est pas prêté!

Il s'agit du type de données le plus courant et est le comportement par défaut lors de l'utilisation du mot-clé jointe en soi. Le mot ajouté «intérieur» n'est généralement pas requis.

Que signifie «gauche» et «droite» de toute façon?

Vous pouvez penser à «gauche» et «droite» comme rien de plus que l'ordre source. Regardez cette requête:

<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion

Remarquez que j'ai mentionné les clients de la table avant d'utiliser le mot-clé de jointure. Cela signifie que les clients sont ma table «gauche». Une autre façon d'y penser est de se demander quelle table reste du mot-clé de jointure, et ce qui est à droite.

quelques mises en garde:

  • simplement parce qu'une table est la «gauche» ne signifie pas que vous sélectionnez tous ses enregistrements. Ceci est la fonction de la jointure de gauche ou de la jointure droite, pas de l'ordre source!
  • La table qui est la gauche aura ses colonnes répertoriées d'abord dans l'ensemble de résultats, sauf si vous choisissez spécifiquement des colonnes dans la section Sélectionner.
  • L'ordre des tables après le mot clé ON n'a pas d'importance, il renverrait les mêmes résultats s'ils étaient échangés.

suffisamment de révision. Quelles sont ces nouvelles jointures?

Eh bien, ils ne sont pas «nouveaux», ils ne sont qu'un moyen de poser des questions supplémentaires. Comment trouveriez-vous des réponses aux questions avec les mots «ne pas» ou «pas» dans la requête?

Montrez-moi tous les clients qui n'ont pas de livres en prêt.

Montrez-moi tous les livres qui ne sont pas prêtés.

gauche jointure avec exclusion

Jetez un œil à ce graphique. Remarquez la différence par rapport aux joints ci-dessus dans la zone ombragée.

3 autres joints que vous devriez être familier avec

Cela ressemble à une jointure de gauche, mais n'a plus les données de «chevauchement» incluses. Pourquoi? C'est la même chose que de demander " montre-moi des clients qui n'ont pas de livres en prêt. " Peut-être que vous souhaitez sélectionner tous les clients sans livre et leur envoyer une newsletter avec une remise spéciale?

Si vous êtes intelligent, vous pensez peut-être que vous pouvez simplement rechercher la table des clients pour un livre de 0 pour faire la même chose. Cela fonctionnerait dans cet exemple, mais la plupart du temps, ce ne sera pas le cas; Cela dépend de la façon dont vos tables sont conçues.

La requête ressemble à ceci:

<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion

Nous avons maintenant inclus une clause où. Chaque fois que vous avez une clause WHERE, vous êtes excluant les données ou les filtrer, presque comme une recherche. Alors pourquoi recherchons-nous des livres. Pourquoi serait-ce nul? Exécutons la jointure de gauche standard et voyons les données qu'il renvoie, nous aurons la réponse:

gauche jointure return data

id FirstName LastName book_id id1 Titre 1 Joe Souffler 1 1 Star Wars 2 Jeanne Biche 2 2 Jurassique 3 Harceler Corbeau 2 2 Jurassique 4 Jeffrey Neige 0 nul nul

Pouvez-vous voir le problème? Il s'agit d'une jointure à gauche, ce qui signifie que toutes les données du tableau des clients sont incluses indépendamment du chevauchement des livres. Jeffrey Snow est inclus mais il n'a pas de livre en prêt, c'est pourquoi les colonnes «ID1» et «Title» sont définies sur Null. Lorsque les tables sont jointes, il n'y aurait pas de titre de livre ou d'identifiant de livre lié à lui.

Si nous demandons " montrez-moi tous les clients, y compris quels livres ils ont ", vous voudriez les données ci-dessus parce que Jeffrey est un client, qu'il ait un livre en prêt ou non. Ce serait la fonction d'une jointure de gauche dans ce cas.

Si nous posons la question " Montrez-moi des clients sans livre sur le prêt ", il est maintenant parfaitement logique de rechercher. Nous avons seulement besoin de sélectionner les clients où nous voyons Null pour la colonne Books.ID (lorsqu'elle est rejointe, serait étiqueté ID1 car il y a deux colonnes nommées «ID»). Nous le faisons avec une clause standard où nous ajoutons où les livres.id sont nuls. Maintenant, le résultat est filtré à ce sujet:

id FirstName LastName book_id id1 Titre 4 Jeffrey Neige 0 nul nul

Vous avez maintenant tous les clients qui n'ont pas de livres en prêt.

à droite Rejoignez avec l'exclusion

faisons de même avec une bonne jointure. Faisons tous les livres qui ne sont prêts à personne.

3 autres joints que vous devriez être familier avec

Une jointure de droite normale renverrait chaque livre, qu'il soit prêté, l'ensemble de résultats ressemblerait à ceci:

id FirstName LastName book_id id1 Titre 1 Joe Souffler 1 1 Star Wars 2 Jeanne Biche 2 2 Jurassique 3 Harceler Corbeau 2 2 Jurassique nul nul nul nul 3 Petites femmes nul nul nul nul 4 Tom Sawyer

Cela semble un peu différent. Tout d'abord, vous remarquerez peut-être que Jurassic Park est répertorié deux fois. En effet, deux personnes ont le livre en prêt, et la base de données retourne une ligne pour chaque match.

Remarquez toutes les colonnes correspondantes de la table des clients sont nuls pour les petites femmes et Tom Sawyer car personne n'a emprunté ces titres, il n'y a donc pas de données qui se chevauchent.

Si nous voulons sélectionner tous les livres qui ne sont pas prêtés, nous utilisons simplement la clause WHERE pour trouver «Null» dans la colonne Clients.ID.

<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>
Copier après la connexion
Copier après la connexion
Copier après la connexion

Le résultat doit être prévisible. Nous n'obtenons que des livres qui ne sont pas prêtés.

id FirstName LastName book_id id1 Titre nul nul nul nul 3 Petites femmes nul nul nul nul 4 Tom Sawyer

Rejoindre extérieure aux exclusions

La dernière jointure ressemble à ceci.

3 autres joints que vous devriez être familier avec

Cette jointure n'est pas très utile, mais vous donnera essentiellement une liste des deux clients sans prêt et des livres qui ne sont pas prêtés, en même temps.

Une jointure étrange comme celle-ci peut être utile dans les cas où vous devez littéralement sélectionner des données sans connexion entre les tables. Peut-être que vous recherchez des données orphelins ou recherchez des incohérences dans une ancienne base de données que vous avez convertie.

En fait, ce genre de jointure est si bizarre que vous ne pouvez même pas le faire dans MySQL, il ne prend pas en charge la jointure extérieure. SQL ordinaire le fait, et la requête ressemblerait à ceci (MSSQL pas mysql):

<span>SELECT *
</span><span>FROM customers
</span><span>LEFT JOIN books
</span><span>ON customers.book_id = books.id
</span>WHERE books.id IS NULL
Copier après la connexion

Le résultat de cette requête renverrait des données ressemblant à quelque chose comme ceci:

id FirstName LastName book_id id1 Titre 1 Jeffrey Neige 0 nul nul nul nul nul nul 3 Petites femmes nul nul nul nul 4 Tom Sawyer

Vous pouvez réaliser une jointure extérieure en utilisant la méthode expliquée par Craig Buckler avec une union, mais ce n'est pas sans problèmes potentiels. Le meilleur résultat Google pour simuler une jointure extérieure complète dans MySQL est à partir de 2006 et peut être trouvée ici. Il peut devenir quelque peu compliqué.

La principale chose à remarquer dans le code ci-dessus est de vérifier les deux côtés des deux côtés, car nous voulons exclure des deux tables. Sans vérifier les deux côtés, nous nous retrouvions simplement avec l'une des autres jointures qui parlaient.

indépendamment de la bizarre ou de la prise en charge d'une question comme celle-ci, je voulais l'inclure parce que c'est un type de jointure valide, si vous pouvez penser à une raison de l'utiliser.

Autres pensées

Vous devez toujours utiliser votre clause où les champs qui ne peuvent pas avoir null comme valeur réelle ! Nous avons toujours testé contre les champs d'ID qui ne peuvent pas avoir NULL comme valeur. Imaginez si notre table de livres avait un champ ISBN qui permettait Null. Si nous testions pour Null en utilisant ce champ , il inclurait des lignes que nous ne voudrions peut-être pas!

Il y a une autre jointure appelée A Cross Join qui est également étrange et unique. Imaginez au lieu de simplement faire correspondre un utilisateur à un livre, chaque utilisateur a été jumelé avec chaque livre! Oui, cela signifie que si vous avez 20 livres et 30 clients, une jointure croisée se traduirait par 30 * 20 rangées de données! Pour un exemple de la façon dont cela pourrait être utile, consultez cet article.

Notez que dans MySQL, la jointure, la jointure intérieure et la jointure croisée sont des équivalents syntaxiques et peuvent se remplacer mutuellement. En effet, JOIN et INNER JOIN font la même chose et doivent utiliser le mot-clé ON pour correspondre aux colonnes. Lorsque vous utilisez une jointure croisée, il n'y a pas de mot-clé, car il correspond à chaque ligne du tableau A à chaque ligne du tableau B.

Conclusion

J'espère que ces quelques jointures supplémentaires ont du sens pour vous. Pensez à les utiliser à chaque fois que vous demandez des données entre les tables où quelque chose "ne" ne correspond pas à l'autre.

  • "Trouvez tous les clients qui n'ont pas commandé auparavant".
  • "Trouvez tous les clients pas dans la liste noire".
  • "Trouvez tous les produits qui ne se sont pas vendus".
  • "Trouvez tous les clients qui n'empruntent pas de livres".
  • "Trouvez tous les chiens qui n'ont pas été promenés ces derniers temps".
  • «Trouvez des employés qui n'ont jamais envoyé un billet de soutien».

En résumé, en fonction de la définition de votre base de données et de vos tables, vous devrez peut-être utiliser la clause où vérifier les valeurs nulles à exclure les correspondances plutôt que inclure avec un comportement de jointure normal.

Alors… avez-vous déjà eu besoin d'une jointure de croix? Y a-t-il d'autres cas d'utilisation spécifiques que vous aimeriez nous parler ou que nous voulons nous couvrir? Faites-nous savoir!

Des questions fréquemment posées (FAQ) sur les jointures SQL

Quels sont les différents types de jointures SQL et en quoi diffèrent-ils les uns des autres?

Les jointures SQL sont utilisées pour combiner les lignes de deux tables ou plus, sur la base d'une colonne connexe entre eux. Il existe quatre types de base de jointures SQL: jointure intérieure, jointure de gauche, jointure droite et jointure complète. Inner Join renvoie des enregistrements qui ont des valeurs correspondantes dans les deux tables. Le jointure gauche renvoie tous les enregistrements de la table gauche et les enregistrements correspondants de la table droite. Le jointure à droite renvoie tous les enregistrements de la table droite et les enregistrements correspondants de la table de gauche. Full Join renvoie tous les enregistrements lorsqu'il y a une correspondance dans la table gauche ou droite.

Comment utiliser plusieurs jointures dans SQL?

Les jointures multiples peuvent être utilisées dans SQL en ajoutant simplement plus d'instructions de jointure dans votre requête SQL. Chaque énoncé de jointure doit avoir la sienne sur la clause qui spécifie les conditions de la jointure. L'ordre des instructions de jointure dans votre requête peut affecter les résultats, il est donc important de considérer soigneusement la logique de votre requête lorsque vous utilisez plusieurs jointures.

Qu'est-ce qu'une jointure à trois tables dans SQL et comment fonctionne-t-elle ?

Une jointure à trois tables dans SQL est un type de jointure où trois tables sont combinées en fonction d'une colonne connexe entre eux. Cela se fait en utilisant deux instructions de jointure dans votre requête SQL. L'instruction First Join combine les deux premières tables et l'instruction Second Join combine le résultat de la première jointure avec la troisième table. L'ordre des instructions de jointure et les conditions spécifiées dans les clauses ON déterminent comment les tables sont combinées.

Quelle est la différence entre une jointure de gauche et une jointure droite dans SQL?

La principale La différence entre une jointure de gauche et une jointure à droite dans SQL est l'ordre dans lequel les tables sont jointes et les résultats qui sont renvoyés. Une jointure gauche renvoie tous les enregistrements de la table gauche et les enregistrements correspondants de la table droite. S'il n'y a pas de correspondance, le résultat est nul sur le côté droit. D'un autre côté, une jointure de droite renvoie tous les enregistrements de la table droite et les enregistrements correspondants de la table de gauche. S'il n'y a pas de correspondance, le résultat est nul sur le côté gauche.

Comment puis-je visualiser les jointures SQL?

Visualiser que les jointures SQL peuvent être effectuées à l'aide de diagrammes de Venn. Chaque cercle du diagramme représente une table. La zone où les cercles se chevauchent représentent les enregistrements qui sont retournés par la jointure. Pour une jointure intérieure, seule la zone de chevauchement est montrée. Pour une jointure gauche, tout le cercle gauche et la zone de chevauchement sont affichés. Pour une jointure droite, tout le cercle droit et la zone de chevauchement sont affichés. Pour une jointure complète, la zone entière des deux cercles est affichée.

Qu'est-ce qu'une jointure complète dans SQL et quand dois-je l'utiliser?

Une jointure complète dans SQL renvoie tous les enregistrements lorsqu'il y est est une correspondance dans la table gauche ou droite. S'il n'y a pas de correspondance, le résultat est nul de chaque côté. Ce type de jointure est utile lorsque vous souhaitez conserver tous les enregistrements des deux tables, même s'il n'y a pas de correspondance entre les colonnes en cours de joie.

Puis-je utiliser des jointures SQL avec plus de deux tables?

Oui, vous pouvez utiliser des jointures SQL avec plus de deux tables. Cela se fait en utilisant plusieurs instructions de jointure dans votre requête SQL. Chaque instruction de jointure combine deux tables, donc pour rejoindre trois tables, vous utiliseriez deux instructions de jointure, pour rejoindre quatre tables, vous utiliseriez trois instructions de jointure, etc.

Quel est l'impact des performances de l'utilisation de plusieurs jointures dans SQL?

L'utilisation de plusieurs jointures dans SQL peut avoir un impact significatif sur les performances de la requête, en particulier si les tableaux sont joints ont un grand nombre d'enregistrements. Chaque opération de jointure nécessite une puissance et une mémoire de traitement, donc plus vous avez de jointures dans votre requête, plus les ressources sont nécessaires pour exécuter la requête. Cependant, l'impact des performances peut être atténué en utilisant des index, en optimisant votre requête et en utilisant un matériel approprié.

Comment puis-je optimiser mes requêtes SQL qui utilisent des jointures?

Il existe plusieurs façons d'optimiser Vos requêtes SQL qui utilisent des jointures. Une façon consiste à utiliser des index sur les colonnes qui sont jointes. Cela peut accélérer considérablement l'opération de jointure. Une autre façon consiste à limiter le nombre d'enregistrements qui sont renvoyés par la requête en utilisant la clause WHERE. De plus, l'ordre des instructions de jointure dans votre requête peut affecter les performances, il est donc important de considérer soigneusement la logique de votre requête.

Quelles sont les erreurs courantes à éviter lors de l'utilisation de jointures SQL?

Certaines erreurs courantes à éviter lors de l'utilisation de jointures SQL comprennent l'oubli pour spécifier la clause ON, qui peut entraîner un produit cartésien, l'adhésion aux colonnes non indexées, ce qui peut ralentir les performances de la requête et en utilisant le mauvais type de jointure, qui peut entraîner des résultats incorrects. Il est également important de se rappeler que l'ordre des instructions de jointure dans votre requête peut affecter les résultats, il est donc important de considérer soigneusement la logique de votre requête.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal