Aller au contenu

Les jointures

SQL Joins

Base de données exemples

J'ai un système de deux tables, l'une de joueurs et l'autre de guilde. Les joueurs peuvent ou non faire partie d'une guilde et chaque guilde peut avoir de 0 à plusieurs joueurs.

jointure_01

Voici un script de création si vous voulez réaliser les exemples

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


DROP TABLE IF EXISTS guilde;
CREATE TABLE guilde (
    id INT AUTO_INCREMENT,
    nom VARCHAR(30),
    PRIMARY KEY (id)
);
INSERT INTO guilde (nom) 
VALUES ('SqlIsGod'), 
       ('Error404'), 
       ('IsNobodyHere');

DROP TABLE IF EXISTS joueur;
CREATE TABLE joueur (
    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 joueur (guilde_id, nom, prenom) 
VALUES (1, 'Fréchette', 'Mathieu'), 
       (1, 'Ouellet', 'Alexandre'), 
       (2, 'Tousignant', 'Simon'), 
       (null, 'Taleb', 'Frédéric');

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 joueur j 
    INNER JOIN guilde g ON g.id = j.guilde_id;

Résultat

nom prenom guilde
Fréchette Mathieu SqlIsGod
Ouellet Alexandre SqlIsGod
Tousignant Simon 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 joueur j 
    LEFT JOIN guilde g ON g.id = j.guilde_id;

Résultat

nom prenom guilde
Fréchette Mathieu SqlIsGod
Ouellet Alexandre SqlIsGod
Tousignant Simon Error404
Taleb Frédéric 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 joueur j 
    RIGHT JOIN guilde g ON g.id = j.guilde_id;

Résultat

Nom prenom guilde
Fréchette Mathieu SqlIsGod
Ouellet Alexandre SqlIsGod
Tousignant Simon Error404
NULL NULL IsNobodyHere

UNION

L'opérateur UNION est utilisé pour combiner les résultats de deux ou plusieurs requête SELECT. On doit par contre respecter les trois règles suivantes :

  • Toutes les requêtes SELECT doivent comporter le même nombre de colonnes.
  • Les colonnes correspondantes doivent avoir un type de données similaire.
  • Les colonnes doivent aussi être dans le même ordre.

Syntaxe

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

Par défaut l'opérateur UNION conservera que les valeurs unique des multiples requêtes. Si ont veut conserver les doublons, on doit ajouter ALL.

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

Le nom des colonnes du résultat sera le nom des colonnes défini dans la première requête.

OUTER JOIN

Une jointure OUTER JOIN retournera tous les enregistrements des deux tables. On ne peux pas utiliser la commande OUTER JOIN en MySQL mais on peut arriver au même résultat en faisant une première requête avec un LEFT JOIN unis à une deuxième requête avec un RIGHT JOIN

Exemple

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

UNION

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

Résultat

Nom prenom guilde
Fréchette Mathieu SqlIsGod
Ouellet Alexandre SqlIsGod
Tousignant Simon Error404
Taleb Frédéric NULL
NULL NULL IsNobodyHere