Al terminar, podrás
- Relacionar una clave foránea con su clave primaria.
- Seleccionar columnas de dos tablas mediante alias.
- Predecir qué filas se descartan cuando no existe coincidencia.
Recupera lo aprendido: ¿Qué columna de pedidos apunta a clientes.id: id o cliente_id?
La idea clave
INNER JOIN combina una fila de la primera tabla con cada fila de la segunda que cumpla la condición escrita en ON. Las filas sin coincidencia no aparecen.
Modelo mental: la cláusula ON es la regla de emparejamiento. No unes “tablas por proximidad”; unes valores concretos, como pedidos.cliente_id con clientes.id.
La sintaxis básica
SELECT a.columna, b.columna
FROM tabla_a AS a
INNER JOIN tabla_b AS b
ON a.clave_foranea = b.clave_primaria;Los alias reducen la repetición y permiten indicar con claridad de qué tabla procede cada columna. Es especialmente importante cuando ambas tablas tienen una columna llamada id.
Ejemplo paso a paso
| id | cliente_id | estado | total |
|---|---|---|---|
| 101 | 1 | enviado | 128,40 |
| 102 | 2 | pendiente | 49,50 |
| 103 | 1 | cancelado | 24,90 |
| 104 | 3 | enviado | 179,00 |
| 105 | 4 | pendiente | 69,90 |
| 106 | 5 | enviado | 1088,00 |
| id | nombre |
|---|---|
| 1 | Ana Torres |
| 2 | Luis Martín |
| 3 | Marta Ruiz |
| 4 | Diego López |
| 5 | Sara Gómez |
Queremos reemplazar cada identificador de cliente por un nombre legible.
SELECT p.id AS pedido,
c.nombre AS cliente,
p.estado,
p.total
FROM pedidos AS p
INNER JOIN clientes AS c
ON p.cliente_id = c.id
ORDER BY p.id
LIMIT 6;| pedido | cliente | estado | total |
|---|---|---|---|
| 101 | Ana Torres | enviado | 128,40 |
| 102 | Luis Martín | pendiente | 49,50 |
| 103 | Ana Torres | cancelado | 24,90 |
| 104 | Marta Ruiz | enviado | 179,00 |
| 105 | Diego López | pendiente | 69,90 |
| 106 | Sara Gómez | enviado | 1088,00 |
Cómo funciona
- Para el pedido 101,
p.cliente_idvale 1. - La condición busca la fila de
clientescuyoidtambién vale 1. - El resultado combina las columnas solicitadas de ambas filas.
- El proceso se repite para cada pedido; si no existiera cliente coincidente, ese pedido no aparecería.
Un error habitual
Omitir o escribir mal la condición de unión
SELECT p.id, c.nombre
FROM pedidos AS p
INNER JOIN clientes AS c
ON p.id = c.id;Los identificadores de pedido y cliente representan entidades distintas. La relación real está en p.cliente_id = c.id. Una condición equivocada puede devolver pocas filas, ninguna o coincidencias sin sentido.
Practica con datos
Laboratorio SQL
Resuelve la consulta
Escribe una consulta que devuelva id de pedido, nombre del cliente y estado para todos los pedidos con su cliente.
Resultado esperado: 18 filas con id, nombre, estado. El orden de las filas no importa.
Ver tablas y datos
Cargando la estructura del ejercicio…
Usa alias p y c.
Relaciona p.cliente_id con c.id.
Selecciona columnas de ambas tablas.
Solución
SELECT p.id, c.nombre, p.estado FROM pedidos AS p INNER JOIN clientes AS c ON p.cliente_id = c.id;La condición ON expresa la relación real; los alias evitan nombres largos.
Puedes consultar la solución y volver a intentarlo. La práctica se completa cuando tu consulta funciona.
La consulta usa datos ficticios y se ejecuta solo en este navegador.
Fuentes técnicas consultadas
Las referencias describen INNER JOIN como la combinación de pares de filas que satisfacen la expresión de unión y documentan la sintaxis con ON.
- PostgreSQL: uniones entre tablas
- PostgreSQL: sintaxis y comportamiento de JOIN
- SQLite: cláusula JOIN en SELECT
Comprueba si puedes explicarlo
Un cliente tiene tres pedidos. Al relacionarlos con INNER JOIN, ¿cuántas veces puede aparecer su nombre?
Ver respuesta razonada
Tres veces, una por pedido. Son tres relaciones válidas, no necesariamente un error. Una fila representa un pedido con los datos de su cliente.
Responde antes de abrir la explicación. Si necesitaste ayuda, cierra la respuesta y vuelve a explicarlo con tus palabras antes de dar la lección por aprendida.
Qué debes recordar
- ON expresa la regla exacta de emparejamiento.
- INNER JOIN solo conserva filas que encuentran coincidencia.
- Califica las columnas con alias para evitar ambigüedades.
A continuación: Continúa con Conserva todas las filas con LEFT JOIN.