MySQL - Full Join

Bonjour là-bas, aspirants passionnés de bases de données ! Aujourd'hui, nous allons plonger dans l'univers passionnant de MySQL et explorer un outil puissant de notre boîte à outils SQL : le Full Join. Ne vous inquiétez pas si vous êtes nouveau dans la programmation ; je vais vous guider pas à pas à travers ce concept, tout comme j'ai fait pour des centaines d'étudiants au fil des ans. Alors, prenez une tasse de café (ou de thé, si c'est votre préférence), et embarquons ensemble dans cette aventure d'apprentissage !

MySQL - Full Join

Qu'est-ce qu'un Full Join ?

Avant de nous lancer dans les détails des Full Joins dans MySQL, penchons-nous sur une simple analogie. Imaginez que vous organisez une fête et que vous avez deux listes d'invités : une de votre meilleur ami et une de votre frère ou sœur. Un Full Join est comme combiner ces listes de manière à inclure tout le monde, même s'ils n'apparaissent que sur une seule liste.

En termes de base de données, un Full Join combine des lignes de deux ou plusieurs tables basées sur une colonne liée entre elles, incluant toutes les lignes de toutes les tables, même si il n'y a pas de correspondance dans l'autre table(s).

La Syntaxe

Voici la syntaxe de base pour un Full Join en SQL :

SELECT columns
FROM table1
FULL JOIN table2
ON table1.column = table2.column;

Maintenant, je peux presque entendre vos voix dire : "Mais attendez ! MySQL n'a pas de mot-clé FULL JOIN !" Et vous auriez tout à fait raison ! MySQL ne supporte pas directement le FULL JOIN, mais ne vous inquiétez pas - nous avons une solution ingénieuse en utilisant UNION. Explorons cela en détail.

MySQL Full Join (Using UNION)

Puisque MySQL n'a pas de FULL JOIN intégré, nous pouvons le simuler en utilisant une combinaison de LEFT JOIN et RIGHT JOIN avec UNION. Voici comment cela fonctionne :

SELECT t1.column1, t1.column2, t2.column1, t2.column2
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
UNION
SELECT t1.column1, t1.column2, t2.column1, t2.column2
FROM table1 t1
RIGHT JOIN table2 t2 ON t1.id = t2.id;

Décomposons cela :

  1. Nous effectuons un LEFT JOIN pour obtenir toutes les lignes de table1, ainsi que les lignes correspondantes de table2.
  2. Ensuite, nous UNIONnons cela avec un RIGHT JOIN, qui obtient toutes les lignes de table2, ainsi que les lignes correspondantes de table1.
  3. Le UNION combine ces résultats, nous donnant ainsi un FULL JOIN.

Un Exemple Pratique

Pour rendre cela plus concret, utilisons un exemple du monde réel. Imaginez que nous gérons une petite bibliothèque et que nous avons deux tables : books et borrowers.

Premièrement, créons ces tables :

CREATE TABLE books (
book_id INT PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(100)
);

CREATE TABLE borrowers (
borrower_id INT PRIMARY KEY,
book_id INT,
borrower_name VARCHAR(100)
);

INSERT INTO books VALUES (1, 'To Kill a Mockingbird', 'Harper Lee');
INSERT INTO books VALUES (2, '1984', 'George Orwell');
INSERT INTO books VALUES (3, 'Pride and Prejudice', 'Jane Austen');

INSERT INTO borrowers VALUES (1, 1, 'Alice');
INSERT INTO borrowers VALUES (2, NULL, 'Bob');
INSERT INTO borrowers VALUES (3, 4, 'Charlie');

Maintenant, effectuons notre Full Join :

SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
LEFT JOIN borrowers br ON b.book_id = br.book_id
UNION
SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
RIGHT JOIN borrowers br ON b.book_id = br.book_id;

Cette requête nous donnera le résultat suivant :

book_id title borrower_id borrower_name
1 To Kill a Mockingbird 1 Alice
2 1984 NULL NULL
3 Pride and Prejudice NULL NULL
NULL NULL 2 Bob
NULL NULL 3 Charlie

Analysons ce résultat :

  • Nous voyons tous les livres, même ceux qui ne sont pas empruntés (comme '1984' et 'Pride and Prejudice').
  • Nous voyons tous les emprunteurs, même ceux qui ne prêtent pas de livre actuellement (comme Bob).
  • Nous voyons même Charlie, qui emprunte un livre qui n'est pas dans notre table books (book_id 4).

C'est la puissance du Full Join - il nous donne une vue complète de nos données, mettant en évidence à la fois les correspondances et les non-correspondances entre nos tables.

Full Join avec une Clause WHERE

Parfois, nous pourrions vouloir filtrer les résultats de notre Full Join. Nous pouvons le faire en ajoutant une clause WHERE à notre requête. Par exemple, disons que nous voulons trouver tous les livres qui ne sont pas actuellement empruntés :

SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
LEFT JOIN borrowers br ON b.book_id = br.book_id
WHERE br.borrower_id IS NULL
UNION
SELECT b.book_id, b.title, br.borrower_id, br.borrower_name
FROM books b
RIGHT JOIN borrowers br ON b.book_id = br.book_id
WHERE b.book_id IS NULL;

Cette requête nous retournera :

book_id title borrower_id borrower_name
2 1984 NULL NULL
3 Pride and Prejudice NULL NULL
NULL NULL 2 Bob
NULL NULL 3 Charlie

Ce résultat nous montre :

  • Les livres qui ne sont pas empruntés ('1984' et 'Pride and Prejudice')
  • Les emprunteurs qui ne prêtent pas de livre actuellement (Bob)
  • Les emprunteurs qui prêtent un livre qui n'est pas dans notre table books (Charlie)

Conclusion

Et voilà, mes chers étudiants ! Nous avons parcouru le pays des Full Joins dans MySQL, de la compréhension du concept à l'implémentation avec des exemples du monde réel. Souvenez-vous, bien que MySQL ne possède pas de FULL JOIN intégré, nous pouvons obtenir le même résultat en utilisant une combinaison de LEFT JOIN, RIGHT JOIN et UNION.

Les Full Joins sont extrêmement utiles lorsque vous avez besoin de voir toutes les données de plusieurs tables, indépendamment de la présence de valeurs correspondantes entre elles. Ils sont comme l'ami inclusif à une fête qui s'assure que tout le monde est impliqué, qu'ils se connaissent ou non !

Alors, continuez votre aventure MySQL et continuez à vous entraîner avec différents scénarios. Plus vous jouerez avec ces concepts, plus vous deviendrez à l'aise. Et qui sait ? Vous pourriez même devenir le gourou de la base de données parmi vos amis !

Bonne programmation, et puissent vos requêtes toujours retourner les résultats que vous cherchez !

Credits: Image by storyset