Croisez les données de deux tables avec INNER JOIN, des alias lisibles et une condition de jointure précise.
Ouvrir cette leçon dans KodokonUne base réelle ne stocke jamais tout dans une seule table : les clients d'un côté, leurs commandes de l'autre. Pour pratiquer ce module, ouvrez sqliteonline.com dans votre navigateur (aucune installation) ou lancez l'outil sqlite3 dans un terminal. Collez d'abord le script ci-dessous : il crée les deux tables utilisées dans cette leçon.
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
city TEXT
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer_id INTEGER NOT NULL,
amount REAL NOT NULL,
ordered_at TEXT NOT NULL
);
INSERT INTO customers (id, name, city) VALUES
(1, 'Alice', 'Lyon'),
(2, 'Karim', 'Paris'),
(3, 'Mina', 'Nantes');
INSERT INTO orders
(id, customer_id, amount, ordered_at)
VALUES
(1, 1, 49.90, '2026-06-01'),
(2, 1, 15.00, '2026-06-12'),
(3, 2, 120.50, '2026-06-15');INNER JOIN assemble deux tables ligne par ligne selon une condition de correspondance, écrite après ON. Ici, chaque commande est reliée au client dont l'id égale son customer_id. Les lignes sans correspondance sont écartées du résultat : Mina, qui n'a rien commandé, n'apparaît pas.
SELECT customers.name, orders.amount
FROM orders
INNER JOIN customers
ON customers.id = orders.customer_id;Répéter les noms complets des tables devient vite illisible. Un alias déclaré avec AS renomme la table pour la durée de la requête. Préfixez systématiquement les colonnes ambiguës : id existe dans les deux tables, écrivez donc c.id ou o.id, jamais id seul.
SELECT c.name, o.amount, o.ordered_at
FROM orders AS o
INNER JOIN customers AS c
ON c.id = o.customer_id
WHERE o.amount > 20
ORDER BY o.amount DESC;