SQL : Comprendre les rêquetes LEFT JOIN via un exemple

Voici un petit exemple, on va faire une base de donnée sous Postgresql :

$ createdb CLASSE
$ psql -d CLASSE
psql (14.11 (Ubuntu 14.11-0ubuntu0.22.04.1), server 10.15 (Ubuntu 10.15-0ubuntu0.18.04.1))
Type "help" for help.
CLASSE=> create table classe (Prenom varchar(50) primary key, classe int);
CREATE TABLE
CLASSE=> create table math (Prenom varchar(50) primary key, note float);
CREATE TABLE
CLASSE=> create table anglais (Prenom varchar(50) primary key, note float);
CREATE TABLE
CLASSE=> create table espagnol (Prenom varchar(50) primary key, note float);
CREATE TABLE
CLASSE=> insert into classe (Prenom, classe) values ('Riri',1);
INSERT 0 1
CLASSE=> insert into classe (Prenom, classe) values ('Fifi',1);
INSERT 0 1
CLASSE=> insert into classe (Prenom, classe) values ('Loulou',1);
INSERT 0 1
CLASSE=> insert into classe (Prenom, classe) values ('Paul',2);
INSERT 0 1
CLASSE=> insert into classe (Prenom, classe) values ('Pierre',2);
INSERT 0 1
CLASSE=> insert into classe (Prenom, classe) values ('Jacques',2);
INSERT 0 1
CLASSE=> insert into math (Prenom, note) values ('Riri',10);
INSERT 0 1
CLASSE=> insert into math (Prenom, note) values ('Fifi',11);
INSERT 0 1
CLASSE=> insert into math (Prenom, note) values ('Loulou',12);
INSERT 0 1
CLASSE=> insert into math (Prenom, note) values ('Paul',13);
INSERT 0 1
CLASSE=> insert into math (Prenom, note) values ('Pierre',14);
INSERT 0 1
CLASSE=> insert into math (Prenom, note) values ('Jacques',15);
INSERT 0 1
CLASSE=> insert into anglais (Prenom, note) values ('Riri',11);
INSERT 0 1
CLASSE=> insert into anglais (Prenom, note) values ('Fifi',12);
INSERT 0 1
CLASSE=> insert into espagnol (Prenom, note) values ('Loulou',13);
INSERT 0 1
CLASSE=> insert into espagnol (Prenom, note) values ('Paul',14);
INSERT 0 1
CLASSE=> insert into espagnol (Prenom, note) values ('Pierre',15);
INSERT 0 1
CLASSE=> insert into anglais (Prenom, note) values ('Jacques',16);
INSERT 0 1

On a donc 2 classes de 3 élèves, et dans les classes tous le monde à math mais les langues sont mélangés.

Sans jointure on n’a rien :

CLASSE=> select c.Prenom,m.note as Math,a.note as Anglais, e.note as Espagnol   
from classe c, math m, anglais a, espagnol e 
where c.Prenom = a.Prenom and c.Prenom = m.Prenom and c.Prenom = e.Prenom and c.classe = 1;

 prenom | math | anglais | espagnol 
--------+------+---------+----------
(0 rows)

Ce qui est normal car personne ne fait Anglais & Espagnol.

Avec une jointure je vais ajouter les données si elles sont disponibles :

CLASSE=> select c.Prenom,m.note as Math,a.note as Anglais, e.note as Espagnol 
from classe c 
     LEFT JOIN math m ON c.Prenom = m.Prenom  
     LEFT JOIN anglais a ON c.Prenom = a.Prenom 
     LEFT JOIN espagnol e ON c.Prenom = e.Prenom  
where c.classe = 1;
 prenom | math | anglais | espagnol 
--------+------+---------+----------
 Loulou |   12 |         |       13
 Riri   |   10 |      11 |         
 Fifi   |   11 |      12 |         
(3 rows)