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#
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.