Aller au contenu

Les jointures

Comprendre les jointures de tables

Une jointure consiste à croiser plusieurs tables. Les jointures sont par défaut internes.

Jointure interne

Elle consiste à ne garder que les lignes où il y a correspondantes ie où les clés étrangère et primaire matchent

SELECT *
FROM entity
INNER JOIN address ON entity.id_address = address.id_address;

Voici, une manière d'écrire une jointure interne.

SELECT
    t.Name AS Song ,
    g.Name AS Genre ,
    a.Title AS Album ,
    a2.Name AS Artist ,
    t.Composer AS Composer ,
    COUNT(*) as occ ,
FROM 
    playlists p , 
    playlist_track pt , 
    tracks t ,
    genres g ,
    albums a ,
    artists a2 
WHERE 
    p.PlaylistId = pt.PlaylistId 
        AND 
    pt.TrackId = t.TrackId
        AND 
    t.GenreId = g.GenreId 
        AND 
    t.AlbumId = a.AlbumId 
        AND 
    a.ArtistId = a2.ArtistId 
GROUP BY
    t.Name
ORDER BY
    occ DESC ;

Jointure externe

Jointure externe à gauche

On garde toutes les lignes de la table à gauche

SELECT *
FROM entity
LEFT OUTER JOIN address ON entity.id_address = address.id_address;

Jointure externe à droite

On garde toutes les lignes de la table à droite

SELECT *
FROM entity
RIGHT OUTER JOIN address ON entity.id_address = address.id_address;

Jointure externe totale

On garde toutes les lignes des deux tables

SELECT *
FROM entity
FULL OUTER JOIN address ON entity.id_address = address.id_address;

Jointure croisée

Une jointure croisée retourne le produit cartésien des tables, i.e toutes les combinaisons possibles. Ce type de jointure est très peu utilisé mais peut s'avérer utile pour des besoins de génération de données.

SELECT
    a.Name AS Artist,
    b.Name AS Genre
FROM artists a, genres b;

Jointure réflexive

Il s'agit d'un type de jointure qui consiste à croiser une table avec elle-même.

Voici un exemple, supposons que les employés et les managers sont stockés dans une même table Employes, si l'on souhaite avoir les détails sur le manager d'un employé donné, alors il faut croiser la table Employes avec elle-même.

SELECT a.Nom Nom_Employe, b.Nom Nom_Manager
FROM Employes a
LEFT JOIN Employes b ON a.id_manager = b.id_employe;

Je me suis basé sur cet article pour rédiger cette section https://www.sqlshack.com/learn-sql-inner-join-vs-left-join/