Aller au contenu

Jointures

Visuel des types de jointures

Types de jointures

Base de données exemples

Le système comprend deux tables : une table joueurs et une table guildes. Les joueurs ont la possibilité d'appartenir ou non à une guilde, tandis que chaque guilde peut avoir de zéro à plusieurs joueurs.

Schéma de la base de données

Voici un script de création pour réaliser les exemples suivants :

CREATE DATABASE IF NOT EXISTS bd2_exemple  
COLLATE = 'utf8mb4_unicode_ci';  


USE bd2_exemple;  

DROP TABLE IF EXISTS guilde;
CREATE TABLE guildes (
    id INT AUTO_INCREMENT,
    nom VARCHAR(30),
    PRIMARY KEY (id)
);


INSERT INTO guildes (nom) 
VALUES ('SqlIsGod'), 
    ('Error404'), 
    ('IsNobodyHere');

DROP TABLE IF EXISTS joueurs;
CREATE TABLE joueurs (
    id INT AUTO_INCREMENT,
    guilde_id INT NULL,
    nom VARCHAR(50),
    prenom VARCHAR(50),
    PRIMARY KEY (id),
    CONSTRAINT guilde_fk FOREIGN KEY (guilde_id) 
        REFERENCES guilde (id) 
        ON UPDATE RESTRICT ON DELETE CASCADE
);

INSERT INTO joueurs (guilde_id, nom, prenom) 
VALUES (1, 'Simms', 'Jonah'), 
    (1, 'McNeill', 'Garrett'), 
    (2, 'Sosa', 'Amy'),
    (null, 'Fox', 'Dina');

Contenu des deux tables

Table guildes

id nom
1 SqlIsGod
2 Error404
3 IsNobodyHere

Table joueurs

id guilde_id nom prenom
1 1 Simms Jonah
2 1 McNeill Garrett
3 2 Sosa Amy
4 NULL Fox Dina

INNER JOIN

Une jointure INNER JOIN retournera tous les enregistrements correspondants entre deux tables.

Exemple

SELECT j.nom, j.prenom, g.nom AS guilde
FROM joueurs j 
    INNER JOIN guildes g ON g.id = j.guilde_id;

Résultats

nom prenom guilde
Simms Jonah SqlIsGod
McNeill Garrett SqlIsGod
Sosa Amy Error404

LEFT JOIN

Une jointure LEFT JOIN retournera tous les enregistrements de la table de gauche et seulement les enregistrements correspondant de la table de droite.

Exemple

SELECT j.nom, j.prenom, g.nom AS guilde
FROM joueurs j 
    LEFT JOIN guildes g ON g.id = j.guilde_id;

Résultats

nom prenom guilde
Simms Jonah SqlIsGod
McNeill Garrett SqlIsGod
Sosa Amy Error404
Fox Dina NULL

RIGHT JOIN

Une jointure RIGHT JOIN retournera tous les enregistrements de la table de droite et seulement les enregistrements correspondant de la table de gauche.

Exemple

SELECT j.nom, j.prenom, g.nom AS guilde
FROM joueurs j 
    RIGHT JOIN guildes g ON g.id = j.guilde_id;

Résultats

nom prenom guilde
Simms Jonah SqlIsGod
McNeill Garrett SqlIsGod
Sosa Amy Error404
NULL NULL IsNobodyHere

UNION

L'opérateur UNION sert à combiner les résultats de deux ou plusieurs requêtes SELECT. Toutefois, il est essentiel de respecter les trois règles suivantes pour son utilisation :

  • Chaque requête SELECT doit comporter le même nombre de colonnes.
  • Les colonnes correspondantes dans les différentes requêtes doivent avoir des types de données similaires.
  • L'ordre des colonnes doit être identique dans toutes les requêtes.

Syntaxe

SELECT colonne1, colonne2 FROM table1
UNION
SELECT colonne3, colonne4 FROM table2;

Par défaut, l'opérateur UNION ne conserve que les valeurs uniques des résultats obtenus à partir de multiples requêtes. Pour inclure les doublons dans les résultats, il est nécessaire d'ajouter le mot-clé ALL.

SELECT colonne1, colonne2 FROM table1
UNION ALL
SELECT colonne3, colonne4 FROM table2;

Le nom des colonnes dans le résultat de l'opérateur UNION correspondra aux noms des colonnes spécifiés dans la première requête.

OUTER JOIN

Une jointure de type OUTER JOIN retourne tous les enregistrements de deux tables. Bien que la commande OUTER JOIN ne soit pas directement utilisable en MySQL, il est possible d'obtenir un résultat équivalent en combinant un LEFT JOIN et un RIGHT JOIN. Pour ce faire, réalisez d'abord une requête avec un LEFT JOIN, puis unissez-la à une seconde requête utilisant un RIGHT JOIN.

Exemple

SELECT j.nom, j.prenom, g.nom AS guilde
FROM joueurs j 
    LEFT JOIN guildes g ON g.id = j.guilde_id

UNION

SELECT j.nom, j.prenom, g.nom AS guilde
FROM joueurs j 
    RIGHT JOIN guildes g ON g.id = j.guilde_id;

Résultats

nom prenom guilde
Simms Jonah SqlIsGod
McNeill Garrett SqlIsGod
Sosa Amy Error404
Fox Dina NULL
NULL NULL IsNobodyHere