Les jointures
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.
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
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
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
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
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.
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 |