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
Table des livres
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. "
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. "
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. "
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. "
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.
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>
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:
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.
Jetez un œil à ce graphique. Remarquez la différence par rapport aux joints ci-dessus dans la zone ombragée.
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>
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
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:
Vous avez maintenant tous les clients qui n'ont pas de livres en prêt.
faisons de même avec une bonne jointure. Faisons tous les livres qui ne sont prêts à personne.
Une jointure de droite normale renverrait chaque livre, qu'il soit prêté, l'ensemble de résultats ressemblerait à ceci:
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>
Le résultat doit être prévisible. Nous n'obtenons que des livres qui ne sont pas prêtés.
La dernière jointure ressemble à ceci.
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
Le résultat de cette requête renverrait des données ressemblant à quelque chose comme ceci:
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.
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.
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.
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!
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.
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.
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.
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.
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.
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.
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.
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é.
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.
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!