Cruza datos de dos tablas con INNER JOIN, alias legibles y una condición de unión precisa.
Abrir esta lección en KodokonUna base de datos real nunca almacena todo en una sola tabla: los clientes por un lado, sus pedidos por el otro. Para practicar este módulo, abre sqliteonline.com en tu navegador (sin necesidad de instalar nada) o inicia la herramienta sqlite3 en una terminal. Primero pega el script de abajo: crea las dos tablas que se usan en esta lección.
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 ensambla dos tablas fila por fila según una condición de coincidencia escrita después de ON. Aquí, cada pedido se vincula al cliente cuyo id es igual a su customer_id. Las filas sin coincidencia se descartan del resultado: Mina, que no pidió nada, no aparece.
SELECT customers.name, orders.amount
FROM orders
INNER JOIN customers
ON customers.id = orders.customer_id;Repetir los nombres completos de las tablas se vuelve ilegible enseguida. Un alias declarado con AS renombra la tabla mientras dura la consulta. Prefija siempre las columnas ambiguas: id existe en ambas tablas, así que escribe c.id u o.id, nunca id a secas.
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;