Aller au contenu

Jointures — Exemples#

essentiel

Schéma de référence#

CREATE TABLE villes (id INTEGER PRIMARY KEY, nom TEXT);

CREATE TABLE etudiants (
  id INTEGER PRIMARY KEY,
  nom TEXT,
  ville_id INTEGER REFERENCES villes(id),
  binome_id INTEGER REFERENCES etudiants(id)
);

CREATE TABLE inscriptions (
  id INTEGER PRIMARY KEY,
  etudiant_id INTEGER REFERENCES etudiants(id),
  cours TEXT
);

INNER JOIN#

SELECT e.nom, v.nom AS ville
FROM etudiants e
JOIN villes v ON e.ville_id = v.id;

LEFT JOIN + valeurs manquantes#

SELECT e.nom, v.nom AS ville
FROM etudiants e
LEFT JOIN villes v ON e.ville_id = v.id
WHERE v.id IS NULL;   -- étudiants sans ville

Jointure multiple#

SELECT e.nom, v.nom AS ville, i.cours
FROM etudiants e
JOIN villes v ON e.ville_id = v.id
JOIN inscriptions i ON i.etudiant_id = e.id;

Auto-jointure courant#

SELECT e1.nom AS etudiant, e2.nom AS binome
FROM etudiants e1
LEFT JOIN etudiants e2 ON e1.binome_id = e2.id;

Simuler un FULL OUTER JOIN avancé#

Avant SQLite 3.39, ni RIGHT JOIN ni FULL JOIN n'existent : on combine deux LEFT JOIN inversés.

SELECT e.id AS etudiant_id, e.nom AS etudiant, v.id AS ville_id, v.nom AS ville
FROM etudiants e
LEFT JOIN villes v ON e.ville_id = v.id

UNION

SELECT e.id, e.nom, v.id, v.nom
FROM villes v
LEFT JOIN etudiants e ON e.ville_id = v.id;

Les deux SELECT doivent produire les colonnes dans le même ordre — d'où l'énumération explicite plutôt que SELECT *.

À partir de 3.39 : FROM etudiants e FULL OUTER JOIN villes v ON e.ville_id = v.id.