Que sont JOINS?
Les jointures aident à récupérer des données à partir de deux ou plusieurs tables de base de données. Les tables sont liées entre elles à l'aide de clés primaires et étrangères.Remarque: JOIN est le sujet le plus mal compris parmi les maigres SQL. Par souci de simplicité et de facilité de compréhension, nous utiliserons une nouvelle base de données pour pratiquer un échantillon. Comme indiqué ci-dessous
identifiant | Prénom | nom de famille | movie_id |
---|---|---|---|
1 | Adam | Forgeron | 1 |
2 | Ravi | Kumar | 2 |
3 | Susan | Davidson | 5 |
4 | Jenny | Adrianna | 8 |
6 | Lee | Pong | dix |
identifiant | Titre | Catégorie |
---|---|---|
1 | ASSASSIN'S CREED: EMBERS | Animations |
2 | Véritable acier (2012) | Animations |
3 | Alvin et les Chipmunks | Animations |
4 | Les aventures de Tintin | Animations |
5 | Sûr (2012) | action |
6 | Maison sûre (2012) | action |
7 | GIA | 18 ans et plus |
8 | Date limite 2009 | 18 ans et plus |
9 | L'image sale | 18 ans et plus |
dix | Marley et moi | Romance |
Types de jointures
Croix REJOINDRE
Cross JOIN est une 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, il nous donne des combinaisons de chaque ligne de la première table avec tous les enregistrements de la seconde table.
Supposons que nous voulions obtenir tous les enregistrements de membres par rapport à tous les enregistrements de film, nous pouvons utiliser le script ci-dessous pour obtenir les résultats souhaités.
SELECT * FROM `movies` CROSS JOIN `members`
L'exécution du script ci-dessus dans MySQL workbench 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
La jointure interne est utilisée pour renvoyer les lignes des deux tables qui satisfont à la condition donnée.
Supposons que vous souhaitiez obtenir la liste des membres qui ont loué des films ainsi que les titres des films qu'ils ont loués. Vous pouvez simplement utiliser un INNER JOIN pour cela, qui renvoie les lignes des deux tables qui satisfont aux conditions données.
SELECT members.`first_name` , members.`last_name` , movies.`title`FROM members ,moviesWHERE 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 AINNER JOIN `movies` AS BON B.`id` = A.`movie_id`
JOINTS EXTÉRIEURS
Les jointures externes MySQL renvoient tous les enregistrements correspondant aux deux tables.
Il peut détecter les enregistrements n'ayant aucune correspondance dans la table jointe. Il renvoie des valeurs NULL pour les enregistrements de la table jointe si aucune correspondance n'est trouvée.
Cela semble déroutant? Regardons un exemple -
JOINT GAUCHE
Supposons maintenant que vous souhaitiez obtenir les titres de tous les films avec les noms des membres qui les ont loués. Il est clair que certains films n'ont été loués par personne. Nous pouvons simplement utiliser LEFT JOIN à cette fin.
LEFT JOIN renvoie toutes les lignes de la table de gauche même si aucune ligne correspondante n'a été trouvée dans la table 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 ALEFT JOIN `members` AS BON B.`movie_id` = A.`id`
L'exécution du script ci-dessus dans MySQL workbench donne. Vous pouvez voir que dans le résultat renvoyé qui est répertorié ci-dessous que pour les films qui ne sont pas loués, les champs de nom de membre ont des valeurs NULL. Cela signifie qu'aucun membre correspondant n'a trouvé la table des membres pour ce film particulier.
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 DROIT
RIGHT JOIN est évidemment l'opposé de LEFT JOIN. Le RIGHT JOIN renvoie toutes les colonnes de la table de droite même si aucune ligne correspondante n'a été trouvée dans la table 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 des films loués par eux. 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 ARIGHT JOIN `movies` AS BON B.`id` = A.`movie_id`
L'exécution du script ci-dessus dans MySQL workbench 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"
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 USING est qu'il doit avoir des noms identiques pour les colonnes correspondantes dans les deux tables.
Dans la table "movies" jusqu'à présent, nous avons utilisé sa clé primaire avec le nom "id". Nous nous sommes référés à la même chose dans la table "members" avec le nom "movie_id".
Renommons le champ "id" des tables "movies" pour avoir le nom "movie_id". Nous faisons cela afin d'avoir des noms de champs identiques.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Utilisons ensuite USING avec l'exemple ci-dessus LEFT JOIN.
SELECT A.`title` , B.`first_name` , B.`last_name`FROM `movies` AS ALEFT JOIN `members` AS BUSING ( `movie_id` )
Outre l'utilisation de ON et USING avec JOINs, vous pouvez utiliser de nombreuses autres clauses MySQL telles que GROUP BY, WHERE et même des fonctions telles que SUM , AVG , etc.
Pourquoi utiliser des jointures?
Vous vous demandez peut-être pourquoi nous utilisons des JOINs lorsque nous pouvons effectuer la même tâche en exécutant des requêtes. Surtout si vous avez une certaine expérience dans la programmation de bases de données, vous savez que nous pouvons exécuter des requêtes une par une, utilisez la sortie de chacune dans des requêtes successives. Bien sûr, c'est possible. Mais en utilisant JOINs, vous pouvez effectuer le travail en n'utilisant qu'une seule requête avec tous les paramètres de recherche. D'autre part, MySQL peut obtenir de meilleures performances avec les JOIN car il peut utiliser l'indexation. La simple utilisation d'une seule requête JOIN au lieu d'exécuter plusieurs requêtes réduit la surcharge du serveur. L'utilisation de plusieurs requêtes à la place entraîne davantage de transferts de données entre MySQL et les applications (logiciels). En outre, cela nécessite plus de manipulations de données dans la fin de l'application également.
Il est clair que nous pouvons améliorer les performances de MySQL et des applications en utilisant des JOIN.
Résumé
- JOINS nous permet de combiner les données de plusieurs tables en un seul jeu de résultats.
- JOINS a de meilleures performances par rapport aux sous-requêtes
- INNER JOINS ne renvoie que les lignes qui répondent aux critères donnés.
- OUTER JOINS peut également renvoyer des lignes où aucune correspondance n'a été trouvée. Les lignes sans correspondance sont renvoyées avec le mot clé NULL.
- Les principaux types de jointures incluent les jointures internes, externes gauche, externes droite, les jointures croisées, etc.
- La clause fréquemment utilisée dans les opérations JOIN est "ON". La clause "USING" exige que les colonnes correspondantes soient du même nom.
- JOINS peut également être utilisé dans d'autres clauses telles que GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS, etc.