Aller au contenu principal

Autres jointures

Résumé

  • Une jointure SQL permet de lier deux ou plusieurs tables entre elles.

  • La première table écrite dans la requête SQL est toujours considérée comme la table de gauche, les autres sont considérées comme les tables de droites.

  • INNER JOIN est appelée une jointure interne, elle retourne les entrées qui ont une correspondance entre les deux tables en fonction de la valeur choisie après ON.

  • Les jointures autres que INNER JOIN sont des jointures externes.

  • LEFT JOIN et RIGHT JOIN vont retourner les entrées qui ont une correspondance entre les deux tables, mais également toute la table qui est désignée (gauche ou droite). Les entrées qui n’ont pas trouvé de correspondance auront leurs champs mis à NULL.

  • FULL JOIN retourne tout ! S’il n’y a pas de correspondance entre les deux tables pour une ligne, ces champs seront mis à NULL.

  • La jointure FULL JOIN n'est pas supportée par MariaDB ou MySQL, on utilise à la place l'UNION des requêtes LEFT JOIN et RIGHT JOIN.

  • Il est bien sûr possible de filtrer le résultat en ajoutant une condition dans la requête, avec une clause WHERE.

4) Pour aller plus loin

  • Il existe aussi d'autres jointures, moins utilisées :

    • LEFT JOIN (sans correspondance)
    • RIGHT JOIN (sans correspondance)
    • FULL JOIN (sans correspondance)
    • CROSS JOIN
    • NATURAL JOIN
  • Voyons maintenant ces autres jointures...


LEFT JOIN (sans correspondance)

On ajoute une clause WHERE : WHERE T1.id_genre IS NULL

SELECT * FROM livre AS T1 LEFT JOIN genre AS T2 ON T1.id_genre = T2.id WHERE T1.id_genre IS NULL;
  • Pour une jointure sans correspondance (c'est à dire sans l’intersection), il faut utiliser une condition WHERE. Cette requête va retourner seulement toutes les entrées de T1 qui n’ont aucune correspondance dans la table T2.

SELECT * FROM livre AS T1 LEFT JOIN genre AS T2 ON T1.id_genre = T2.id WHERE T1.id_genre IS NULL;

  • Dans notre exemple, cela va retourner uniquement les livres n’ayant pas de genre. Les lignes retournées auront certains de leurs champs mis à NULL vu qu’on ne prend pas en compte les champs de T2.

RIGHT JOIN (sans correspondance)

SELECT * FROM livre AS T1 RIGHT JOIN genre AS T2 ON T1.id_genre = T2.id WHERE T1.id_genre IS NULL;
  • Cette requête va retourner seulement toutes les entrées de T2 qui n’ont aucune correspondance dans la table T1.

  • Dans notre exemple, cela va retourner seulement les genres n’ayant pas de livres !

FULL JOIN (sans correspondance)

SELECT * FROM livre AS T1 FULL JOIN genre AS T2 ON T1.id_genre = T2.id
WHERE T2.id IS NULL OR T1.id_genre IS NULL;
  • Retourne le même résultat de FULL JOIN, mais sans les correspondances entre les deux tables.

  • C’est l’inverse de INNER JOIN !

  • Dans notre exemple, cela va retourner tous les livres n’ayant pas de genre ainsi que tous les genres n’ayant pas de livre.

  • La jointure FULL JOIN n'est pas supportée par MariaDB ou MySQL, on utilise à la place l'UNION des requêtes LEFT JOIN (sans correspondance) et RIGHT JOIN (sans correspondance).

    SELECT * FROM livre AS T1 LEFT JOIN genre AS T2 ON T1.id_genre = T2.id
    WHERE T2.id IS NULL
    UNION
    SELECT * FROM livre AS T1 RIGHT JOIN genre AS T2 ON T1.id_genre = T2.id
    WHERE T1.id_genre IS NULL;
  • Dans notre exemple, la jointure FULL JOIN width:100px
    retournera tous les livres n’ayant pas de genre ainsi que tous les genres n’ayant pas de livre !

SELECT * FROM livre AS T1 LEFT JOIN genre AS T2 ON T1.id_genre = T2.id
WHERE T2.id IS NULL
UNION
SELECT * FROM livre AS T1 RIGHT JOIN genre AS T2 ON T1.id_genre = T2.id
WHERE T1.id_genre IS NULL;


CROSS JOIN

  • Dans le langage SQL, la commande CROSS JOIN est un type de jointure sur 2 tables SQL qui permet de retourner le produit cartésien.

  • La commande CROSS JOIN permet de retourner chaque ligne d’une table avec chaque ligne d’une autre table.

  • Par exemple, effectuer le produit cartésien d’une table A qui contient 30 lignes avec une table B de 40 lignes va produire 1200 lignes (30 x 40 = 1200).

  • Nous avons vu que la commande CROSS JOIN est un type de jointure sur 2 tables SQL qui permet de retourner le produit cartésien.

  • En général la commande CROSS JOIN est combinée avec la commande WHERE pour filtrer les résultats qui respectent certaines conditions.

  • Attention, le nombre de résultats peut facilement être très élevé. S’il est effectué sur des tables avec beaucoup d’enregistrements, cela peut ralentir sensiblement le serveur.

  • Explication de la jointure CROSS JOIN :

  • Pour effectuer un jointure avec CROSS JOIN, il convient d’effectuer une requête SQL respectant la syntaxe suivante :

    SELECT *
    FROM table1
    CROSS JOIN table2;
  • Cette requête, correspond au produit cartésien, et retourne donc les mêmes résultats que la requête :

    SELECT *
    FROM table1, table2;
  • La jointure CROSS JOIN est généralement complétée par une clause WHERE :

    SELECT *
    FROM table1 AS T1
    CROSS JOIN table2 AS T2
    WHERE T1.color = 'red';
  • La jointure CROSS JOIN est très rarement utilisée. Pour en savoir plus, vous pouvez consulter l'article suivant : https://learnsql.fr/blog/guide-illustre-du-cross-join-sql/

  • Passons maintenant à la jointure NATURAL JOIN.


NATURAL JOIN

  • Si deux tables sont liées par des colonnes du même nom, on parle de NATURAL JOIN.

  • On peut également avoir un NATURAL LEFT OUTER JOIN ou un NATURAL RIGHT OUTER JOIN.

  • Comme les NATURAL JOINs sont liés par des colonnes du même nom, les colonnes ne sont pas affichées deux fois dans le jeu de résultats, mais sont fusionnées pour former une seule colonne commune.

  • Voyons maintenant un exemple de jointure NATURAL JOIN.

Dans notre exemple, avec une jointure NATURAL JOIN :

  • si le champ identifiant de la table T2 (Genre de livre) était "id_genre", alors au lieu d'écrire :

    SELECT * FROM livre AS T1 INNER JOIN genre AS T2 ON T1.id_genre = T2.id_genre;
  • il serait possible d'écrire :

    SELECT * FROM livre AS T1 NATURAL JOIN genre AS T2;

  • Pour vous permettre de bien comprendre la jointure NATURAL JOIN, nous avons une 2ème table "Genre de livre" nommée genre2 avec la colonne "id" renommée "id_genre".

  • Voici une requête SQL qui utilise une jointure NATURAL JOIN :

    SELECT * FROM livre AS T1 NATURAL JOIN genre2 AS T2;
  • et la même requête SQL sans renommer les tables en T1 et T2 :

    SELECT * FROM livre NATURAL JOIN genre2;
SELECT * FROM livre NATURAL JOIN genre2;

  • Vous pouvez constater :
    • que la requête est plus simple à écrire
    • et qu'il n'y a qu'une seule colonne id_genre qui s'affiche.

Test de mémorisation/compréhension


Qu'est-ce qu'une jointure LEFT JOIN (sans correspondance) en SQL ?


Qu'est-ce qu'une jointure RIGHT JOIN (sans correspondance) en SQL ?


Qu'est-ce qu'une jointure FULL JOIN (sans correspondance) en SQL ?


Qu'est-ce qu'une jointure CROSS JOIN en SQL ?


Qu'est-ce qu'une jointure NATURAL JOIN en SQL ?