Jointures

Les jointures permettent d'interroger plusieurs tables, en exploitant les relations qui les lient. On obtient alors une combinaison des colonnes des différentes tables. Notez qu'il est possible de faire une jointure d'une table sur elle-même.

Simples

Le but est d'écrire une requête qui fera le lien entre deux tables en utilisant les données de colonnes contenant des données qu'on peut rapprocher. En utilisant le même exemple que précédemment, on voit que les lieux de naissance des auteurs peuvent être rapprochés des lieux. La requête contiendra donc un filtre (clause where) demandant l'égalité de cette valeur pour chacune des lignes comparées. Grâce à cela, on pourra afficher dans une seule représentation les données des deux tables.

mysql> select * from Livres INNER JOIN Lieux on Livres.LieuNaissance=Lieux.Ville;
+---------------------+---------------------+----------------------------------------+-----------+-------+---------------------+-------------+
| Auteur              | LieuNaissance       | Titre                                  | Type      | Annee | Ville               | Pays        |
+---------------------+---------------------+----------------------------------------+-----------+-------+---------------------+-------------+
| Mark Twain          | Florida             | Les aventures de Tom Sawyer            | Fiction   |  1876 | Florida             | Royaume-Uni |
| Charles Darwin      | Shrewsbury          | L'origine des espèces                  | Science   |  1856 | Shrewsbury          | Royaume-Uni |
| William Shakespeare | Stratford-upon-Avon | Roméo et Juliette                      | Théâtre   |  1594 | Stratford-upon-Avon | Royaume-Uni |
| J.K. Rowling        | Yate                | Harry Potter à  l'école des sorciers   | Fiction   |  1995 | Yate                | Royaume-Uni |
| Dan Simmons         | Peoria              | Hyperion                               | Fiction   |  1989 | Peoria              | Etats-Unis  |
+---------------------+---------------------+----------------------------------------+-----------+-------+---------------------+-------------+
5 rows in set (0.00 sec)

Complexes

Nous avons vu dans l'exemple précédent comment exploiter la relation existant entre les données de deux tables. Nous avons joint une table à gauche et une table à droite mais toutes les lignes à gauche ou à droite ne trouvent pas forcément de correspondance dans l'autre table. Selon le contexte, on donnera un caractère obligatoire ou non à la correspondance des données.

Jointure interne

La liaison interne inner est équivalent à la syntaxe dite simple. Elle oblige à ce qu'une correspondance existe entre les tables. Dans notre exemple, seules les lignes pour lesquelles un auteur a un lieu de naissance présent dans la table Lieux vont remonter. Les lignes présentes dans Lieux mais sans correspondances dans Livres ne remonteront pas.

On utilisera la syntaxe tableGauche INNER JOIN tableDroite ON tableGauche.colonneJointure = tableDroite.colonneJointure

mysql> select * from Livres inner join Lieux on Livres.LieuNaissance=Lieux.Ville;
+---------------------+---------------------+----------------------------------------+-----------+-------+---------------------+-------------+
| Auteur              | LieuNaissance       | Titre                                  | Type      | Annee | Ville               | Pays        |
+---------------------+---------------------+----------------------------------------+-----------+-------+---------------------+-------------+
| Mark Twain          | Florida             | Les aventures de Tom Sawyer            | Fiction   |  1876 | Florida             | Royaume-Uni |
| Charles Darwin      | Shrewsbury          | L'origine des espèces                  | Science   |  1856 | Shrewsbury          | Royaume-Uni |
| William Shakespeare | Stratford-upon-Avon | Roméo et Juliette                      | Théâtre   |  1594 | Stratford-upon-Avon | Royaume-Uni |
| J.K. Rowling        | Yate                | Harry Potter à  l'école des sorciers   | Fiction   |  1995 | Yate                | Royaume-Uni |
| Dan Simmons         | Peoria              | Hyperion                               | Fiction   |  1989 | Peoria              | Etats-Unis  |
+---------------------+---------------------+----------------------------------------+-----------+-------+---------------------+-------------+
5 rows in set (0.00 sec)

Jointures externes

Les jointures externes permettent de remonter des lignes même si une partie de la correspondance entre les données n'est pas vérifiée. On pourra spécifier quelle partie de la correspondance est optionnelle.

Jointure externe gauche

Ici, on remontera les lignes des la table de gauche, même s'il n'y a pas de correspondance avec la table de droite. Les lignes de droite sans correspondance avec la table de gauche ne sont pas remontées.

On utilisera la syntaxe tableGauche LEFT JOIN tableDroite ON tableGauche.colonneJointure = tableDroite.colonneJointure

Dans notre exemple, on obtiendra autant de lignes que de livres, les relations non vérifiées voyant leur valeur à NULL

mysql> select Auteur, Titre, Ville, Pays from Livres left join Lieux on LieuNaissance=Ville;
+---------------------+----------------------------------------+---------------------+-------------+
| Auteur              | Titre                                  | Ville               | Pays        |
+---------------------+----------------------------------------+---------------------+-------------+
| Mark Twain          | Les aventures de Tom Sawyer            | Florida             | Royaume-Uni |
| Charles Darwin      | L'origine des espèces                  | Shrewsbury          | Royaume-Uni |
| William Shakespeare | Roméo et Juliette                      | Stratford-upon-Avon | Royaume-Uni |
| J.K. Rowling        | Harry Potter à  l'école des sorciers   | Yate                | Royaume-Uni |
| Caryl Férey         | Zulu                                   | NULL                | NULL        |
| Emmanuel Jouanne    | Damiers imaginaires                    | NULL                | NULL        |
| Dan Simmons         | Hyperion                               | Peoria              | Etats-Unis  |
+---------------------+----------------------------------------+---------------------+-------------+
7 rows in set (0.00 sec)

Jointure externe droite

Ici, on remontera les lignes des la table de droite, même s'il n'y a pas de correspondance avec la table de gauche. Les lignes de droite sans correspondance avec la table de droite ne sont pas remontées.

On utilisera la syntaxe tableGauche RIGHT JOIN tableDroite ON tableGauche.colonneJointure = tableDroite.colonneJointure

Dans notre exemple, on obtiendra autant de lignes que de lieux, les relations non vérifiées voyant leur valeur à NULL

mysql> select Auteur, Titre, Ville, Pays from Livres right join Lieux on LieuNaissance=Ville;
+---------------------+----------------------------------------+---------------------+-------------+
| Auteur              | Titre                                  | Ville               | Pays        |
+---------------------+----------------------------------------+---------------------+-------------+
| Mark Twain          | Les aventures de Tom Sawyer            | Florida             | Royaume-Uni |
| Charles Darwin      | L'origine des espèces                  | Shrewsbury          | Royaume-Uni |
| William Shakespeare | Roméo et Juliette                      | Stratford-upon-Avon | Royaume-Uni |
| J.K. Rowling        | Harry Potter à  l'école des sorciers   | Yate                | Royaume-Uni |
| NULL                | NULL                                   | Strasbourg          | France      |
| Dan Simmons         | Hyperion                               | Peoria              | Etats-Unis  |
+---------------------+----------------------------------------+---------------------+-------------+
6 rows in set (0.00 sec)

Jointure externe (ou full outer)

On cherche ici à remonter toutes les lignes des deux tables.on tulisera l'union (UNION) des résultats des jointures externes gauche et droite.

mysql> select Auteur, Titre, Ville, Pays from Livres right join Lieux on LieuNaissance=Ville
    -> union select Auteur, Titre, Ville, Pays from Livres left join Lieux on LieuNaissance=Ville;
+---------------------+----------------------------------------+---------------------+-------------+
| Auteur              | Titre                                  | Ville               | Pays        |
+---------------------+----------------------------------------+---------------------+-------------+
| Mark Twain          | Les aventures de Tom Sawyer            | Florida             | Royaume-Uni |
| Charles Darwin      | L'origine des espèces                  | Shrewsbury          | Royaume-Uni |
| William Shakespeare | Roméo et Juliette                      | Stratford-upon-Avon | Royaume-Uni |
| J.K. Rowling        | Harry Potter à  l'école des sorciers   | Yate                | Royaume-Uni |
| NULL                | NULL                                   | Strasbourg          | France      |
| Dan Simmons         | Hyperion                               | Peoria              | Etats-Unis  |
| Caryl Férey         | Zulu                                   | NULL                | NULL        |
| Emmanuel Jouanne    | Damiers imaginaires                    | NULL                | NULL        |
+---------------------+----------------------------------------+---------------------+-------------+
8 rows in set (0.00 sec)

Exercice