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)