MySQL Jonction : Intérieure, Extérieure, Gauche, Droite, Croix
⚡ Résumé intelligent
MySQL Les jointures permettent de combiner les lignes de deux tables ou plus liées en un seul ensemble de résultats. Cette ressource explique les jointures CROSS, INNER, LEFT, RIGHT et OUTER à l'aide de requêtes exécutables, d'exemples de données et de tableaux de résultats clairs pour une utilisation pratique des bases de données.

Que sont les JOINS ?
Les jointures aident à récupérer les données de deux ou plusieurs tables de base de données.
Les tables sont mutuellement liées à l'aide de clés primaires et étrangères.
Remarque : L’opération JOIN est l’une des notions les plus mal comprises par les débutants en SQL. Par souci de simplicité et de clarté, nous utiliserons une nouvelle base de données pour les exemples pratiques. Comme indiqué ci-dessous.
Chaque exemple ci-dessous utilise ces deux tableaux. id_film colonne dans membres pointe vers le id colonne dans films — la relation sur laquelle chaque JOIN correspond.
membres
| id | Prénom | nom de famille | id_film |
|---|---|---|---|
| 1 | Adam | Smith | 1 |
| 2 | Ravi | Kumar | 2 |
| 3 | Susan | Davidson | 5 |
| 4 | Jenny | Adrianna | 8 |
| 5 | Lee | Pong | 10 |
films
| id | titre | category |
|---|---|---|
| 1 | ASSASSIN'S CREED : BRAISES | Animations |
| 2 | Vrai acier (2012) | Animations |
| 3 | Alvin et les Chipmunks | Animations |
| 4 | Les aventures de Tintin | Animations |
| 5 | Coffre-fort (2012) | Action |
| 6 | Maison sûre (2012) | Action |
| 7 | GIA | 18 |
| 8 | Date limite 2009 | 18 |
| 9 | L'image sale | 18 |
| 10 | Marley et moi | Romantique |
Pourquoi devrions-nous utiliser des jointures ?
Avant d'examiner chaque type de jointure, il est utile de comprendre pourquoi une jointure est préférable à l'exécution de plusieurs requêtes.
Maintenant, vous vous demandez peut-être pourquoi nous utilisons les JOIN alors que nous pouvons effectuer la même tâche en exécutant des requêtes. Surtout si vous avez une certaine expérience en programmation de bases de données, vous savez que nous pouvons exécuter des requêtes une par une, utiliser la sortie de chacune dans des requêtes successives. Bien sûr, c'est possible. Mais en utilisant les JOIN, vous pouvez effectuer le travail en utilisant une seule requête avec n'importe quel paramètre de recherche. D'autre part MySQL peut obtenir de meilleures performances avec JOINs car il peut utiliser l'indexation. L'utilisation simple d'une seule requête JOIN au lieu d'exécuter plusieurs requêtes réduit la surcharge du serveur. Utiliser plutôt plusieurs requêtes qui entraînent davantage de transferts de données entre MySQL et applications (logiciels). De plus, cela nécessite également davantage de manipulations de données du côté de l'application.
Il est clair que nous pouvons faire mieux MySQL et les performances des applications grâce à l'utilisation de JOIN.
Types de jointures
MySQL Cette fonction prend en charge plusieurs types de jointures, chacun répondant à une question différente concernant les mêmes deux tables. Le tableau ci-dessous les compare ; chaque type est ensuite illustré par une requête et son résultat.
| Type de jointure | Lignes renvoyées | Résultats NULL ? | Utilisation typique |
|---|---|---|---|
| JOINDRE CROISÉ | Chaque ligne du tableau A est associée à chaque ligne du tableau B. | Non | Générer toutes les combinaisons possibles |
| JOINTURE INTERNE | Seules les lignes correspondant à la condition dans les deux tables sont conservées. | Non | Les membres qui ont effectivement loué un film |
| JOINDRE GAUCHE | Toutes les lignes du tableau de gauche, plus les correspondances du tableau de droite | Oui, du côté droit | Tous les films, même ceux que je n'ai jamais loués |
| JOINDRE À DROITE | Toutes les lignes du tableau de droite, plus les correspondances du tableau de gauche | Oui, du côté gauche | Tous les films, même sans membre attaché |
JOINDRE CROISÉ
Cross JOIN est la forme la plus simple de JOIN qui fait correspondre chaque ligne d'une table de base de données à toutes les lignes d'une autre.
En d’autres termes, cela nous donne des combinaisons de chaque ligne du premier tableau avec tous les enregistrements du deuxième tableau.
Supposons que nous souhaitions obtenir tous les enregistrements de membres par rapport à tous les enregistrements de films, nous pouvons utiliser le script ci-dessous pour obtenir les résultats souhaités.
SELECT * FROM `movies` CROSS JOIN `members`
Exécuter le script ci-dessus dans MySQL établi nous donne les résultats suivants.
| id | title | id | first_name | last_name | movie_id | |
|---|---|---|---|---|---|---|
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 1 | Adam | Smith | 1 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 2 | Ravi | Kumar | 2 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 3 | Susan | Davidson | 5 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 4 | Jenny | Adrianna | 8 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 6 | Lee | Pong | 10 |
| 2 | Real Steel(2012) | Animations | 1 | Adam | Smith | 1 |
| 2 | Real Steel(2012) | Animations | 2 | Ravi | Kumar | 2 |
| 2 | Real Steel(2012) | Animations | 3 | Susan | Davidson | 5 |
| 2 | Real Steel(2012) | Animations | 4 | Jenny | Adrianna | 8 |
| 2 | Real Steel(2012) | Animations | 6 | Lee | Pong | 10 |
| 3 | Alvin and the Chipmunks | Animations | 1 | Adam | Smith | 1 |
| 3 | Alvin and the Chipmunks | Animations | 2 | Ravi | Kumar | 2 |
| 3 | Alvin and the Chipmunks | Animations | 3 | Susan | Davidson | 5 |
| 3 | Alvin and the Chipmunks | Animations | 4 | Jenny | Adrianna | 8 |
| 3 | Alvin and the Chipmunks | Animations | 6 | Lee | Pong | 10 |
| 4 | The Adventures of Tin Tin | Animations | 1 | Adam | Smith | 1 |
| 4 | The Adventures of Tin Tin | Animations | 2 | Ravi | Kumar | 2 |
| 4 | The Adventures of Tin Tin | Animations | 3 | Susan | Davidson | 5 |
| 4 | The Adventures of Tin Tin | Animations | 4 | Jenny | Adrianna | 8 |
| 4 | The Adventures of Tin Tin | Animations | 6 | Lee | Pong | 10 |
| 5 | Safe (2012) | Action | 1 | Adam | Smith | 1 |
| 5 | Safe (2012) | Action | 2 | Ravi | Kumar | 2 |
| 5 | Safe (2012) | Action | 3 | Susan | Davidson | 5 |
| 5 | Safe (2012) | Action | 4 | Jenny | Adrianna | 8 |
| 5 | Safe (2012) | Action | 6 | Lee | Pong | 10 |
| 6 | Safe House(2012) | Action | 1 | Adam | Smith | 1 |
| 6 | Safe House(2012) | Action | 2 | Ravi | Kumar | 2 |
| 6 | Safe House(2012) | Action | 3 | Susan | Davidson | 5 |
| 6 | Safe House(2012) | Action | 4 | Jenny | Adrianna | 8 |
| 6 | Safe House(2012) | Action | 6 | Lee | Pong | 10 |
| 7 | GIA | 18+ | 1 | Adam | Smith | 1 |
| 7 | GIA | 18+ | 2 | Ravi | Kumar | 2 |
| 7 | GIA | 18+ | 3 | Susan | Davidson | 5 |
| 7 | GIA | 18+ | 4 | Jenny | Adrianna | 8 |
| 7 | GIA | 18+ | 6 | Lee | Pong | 10 |
| 8 | Deadline(2009) | 18+ | 1 | Adam | Smith | 1 |
| 8 | Deadline(2009) | 18+ | 2 | Ravi | Kumar | 2 |
| 8 | Deadline(2009) | 18+ | 3 | Susan | Davidson | 5 |
| 8 | Deadline(2009) | 18+ | 4 | Jenny | Adrianna | 8 |
| 8 | Deadline(2009) | 18+ | 6 | Lee | Pong | 10 |
| 9 | The Dirty Picture | 18+ | 1 | Adam | Smith | 1 |
| 9 | The Dirty Picture | 18+ | 2 | Ravi | Kumar | 2 |
| 9 | The Dirty Picture | 18+ | 3 | Susan | Davidson | 5 |
| 9 | The Dirty Picture | 18+ | 4 | Jenny | Adrianna | 8 |
| 9 | The Dirty Picture | 18+ | 6 | Lee | Pong | 10 |
| 10 | Marley and me | Romance | 1 | Adam | Smith | 1 |
| 10 | Marley and me | Romance | 2 | Ravi | Kumar | 2 |
| 10 | Marley and me | Romance | 3 | Susan | Davidson | 5 |
| 10 | Marley and me | Romance | 4 | Jenny | Adrianna | 8 |
| 10 | Marley and me | Romance | 6 | Lee | Pong | 10 |
JOINTURE INTERNE
Une jointure croisée (CROSS JOIN) renvoie toutes les paires possibles, ce qui est rarement souhaitable. Une jointure interne (INNER JOIN) restreint le résultat aux paires réellement liées.
Le JOIN interne est utilisé pour renvoyer les lignes des deux tables qui satisfont à la condition donnée.
Supposons que vous souhaitiez obtenir la liste des membres ayant loué des films, ainsi que les titres de ces films. Vous pouvez simplement utiliser une jointure interne (INNER JOIN), qui renvoie les lignes des deux tables correspondant aux critères spécifiés.
SELECT members.`first_name` , members.`last_name` , movies.`title` FROM members ,movies WHERE movies.`id` = members.`movie_id`
L'exécution du script ci-dessus donne
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
Notez que le script de résultats ci-dessus peut également être écrit comme suit pour obtenir les mêmes résultats.
SELECT A.`first_name` , A.`last_name` , B.`title` FROM `members` AS A INNER JOIN `movies` AS B ON B.`id` = A.`movie_id`
JOIN externes
Une jointure interne (INNER JOIN) supprime silencieusement les lignes sans correspondance. Lorsque ces lignes non appariées sont importantes, une jointure externe (OUTER JOIN) est la solution appropriée.
MySQL Les jointures externes renvoient tous les enregistrements correspondants des deux tables.
Il peut détecter les enregistrements n'ayant aucune correspondance dans la table jointe. Il revient NULL valeurs pour les enregistrements de la table jointe si aucune correspondance n’est trouvée.
Cela vous semble compliqué ? Prenons un exemple :
JOINDRE GAUCHE
Supposons maintenant que vous souhaitiez obtenir les titres de tous les films ainsi que les noms des membres qui les ont loués. Il est clair que certains films ne sont loués par personne. On peut simplement utiliser JOINDRE GAUCHE aux fins.
Le LEFT JOIN renvoie toutes les lignes du tableau de gauche même si aucune ligne correspondante n'a été trouvée dans le tableau de droite. Lorsqu'aucune correspondance n'a été trouvée dans le tableau de droite, NULL est renvoyé.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B ON B.`movie_id` = A.`id`
Exécuter le script ci-dessus dans MySQL L'outil de test fournit des informations. Comme vous pouvez le constater dans les résultats ci-dessous, pour les films non loués, les champs « nom du membre » contiennent des valeurs NULL. Cela signifie qu'aucun membre correspondant n'a été trouvé dans la table des membres pour ce film.
| title | first_name | last_name |
|---|---|---|
| ASSASSIN'S CREED: EMBERS | Adam | Smith |
| Real Steel(2012) | Ravi | Kumar |
| Safe (2012) | Susan | Davidson |
| Deadline(2009) | Jenny | Adrianna |
| Marley and me | Lee | Pong |
| Alvin and the Chipmunks | NULL | NULL |
| The Adventures of Tin Tin | NULL | NULL |
| Safe House(2012) | NULL | NULL |
| GIA | NULL | NULL |
| The Dirty Picture | NULL | NULL |
JOINDRE À DROITE
RIGHT JOIN est évidemment l’opposé de LEFT JOIN. Le RIGHT JOIN renvoie toutes les colonnes du tableau de droite même si aucune ligne correspondante n'a été trouvée dans le tableau de gauche. Lorsqu'aucune correspondance n'a été trouvée dans le tableau de gauche, NULL est renvoyé.
Dans notre exemple, supposons que vous ayez besoin d'obtenir les noms des membres et les films qu'ils ont loués. Nous avons maintenant un nouveau membre qui n'a encore loué aucun film.
SELECT A.`first_name` , A.`last_name`, B.`title` FROM `members` AS A RIGHT JOIN `movies` AS B ON B.`id` = A.`movie_id`
Exécuter le script ci-dessus dans MySQL L'établi donne les résultats suivants.
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
| NULL | NULL | Alvin and the Chipmunks |
| NULL | NULL | The Adventures of Tin Tin |
| NULL | NULL | Safe House(2012) |
| NULL | NULL | GIA |
| NULL | NULL | The Dirty Picture |
Clauses « ON » et « USING »
Toutes les requêtes effectuées jusqu'à présent ont fait correspondre des lignes avec une clause ON. MySQL offre une alternative plus courte lorsque les colonnes correspondantes partagent un nom.
Dans les exemples de requête JOIN ci-dessus, nous avons utilisé la clause ON pour faire correspondre les enregistrements entre les tables.
La clause USING peut également être utilisée dans le même but. La différence avec EN UTILISANT est-il doit avoir des noms identiques pour les colonnes correspondantes dans les deux tables.
Jusqu’à présent, dans le tableau « films », nous avons utilisé sa clé primaire avec le nom « id ». Nous y avons fait référence dans le tableau « membres » avec le nom « movie_id ».
Renommons le champ « id » des tables « films » pour avoir le nom « movie_id ». Nous faisons cela afin d'avoir des noms de champs correspondants identiques.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Utilisons ensuite USING avec l'exemple LEFT JOIN ci-dessus.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B USING ( `movie_id` )
En plus d'utiliser ON et UTILISER avec les JOINs vous pouvez en utiliser beaucoup d'autres MySQL des clauses comme PAR GROUPE, OÙ et même des fonctions comme SUM, AVG, etc.




