Contenido de esta guía
Qué conserva INNER JOIN
INNER JOIN compara filas de dos tablas y devuelve solo las combinaciones que hacen verdadera la condición de ON. Si una fila no encuentra pareja, desaparece del resultado.
Úsalo cuando la pregunta exige una relación existente: pedidos con su cliente, pagos asociados a un pedido o productos que aparecen en alguna línea de venta.
Sintaxis básica
SELECT columnas
FROM tabla_a AS a
INNER JOIN tabla_b AS b
ON b.clave = a.clave;La palabra INNER suele ser opcional: escribir JOIN sin calificativo normalmente significa INNER JOIN. La condición debe relacionar columnas que representen el mismo dato, no solo columnas con nombres parecidos.
Ejemplo guiado
La tabla inicial tampoco se conserva completa. En un INNER JOIN, cualquier fila de cualquiera de los dos lados puede desaparecer si no cumple ON.
Los pedidos 101 y 104 tienen una fila en pagos. El pedido 103 no aparece porque no encuentra una coincidencia.
| pedido_id | estado | metodo |
|---|---|---|
| 101 | enviado | tarjeta |
| 104 | enviado | tarjeta |
SELECT p.id AS pedido_id,
p.estado,
pa.metodo
FROM pedidos AS p
INNER JOIN pagos AS pa
ON pa.pedido_id = p.id
WHERE p.id IN (101, 103, 104)
ORDER BY p.id;Error frecuente
Unir columnas que no representan la misma clave
ON pedidos.id = clientes.id compara identificadores de entidades distintas. Puede devolver coincidencias accidentales y un resultado aparentemente válido.
Revisa las claves y relaciones del esquema. En este caso la relación correcta es pedidos.cliente_id = clientes.id.
Comprueba lo aprendido
Muestra solo pedidos que tienen pago
Devuelve el identificador del pedido, el nombre del cliente y el método de pago. Ordena por pedido. Los pedidos sin pago no deben aparecer.
pedidos.clientes mediante cliente_id.pagos mediante pedido_id.Solución razonada
SELECT p.id AS pedido_id,
c.nombre AS cliente,
pa.metodo
FROM pedidos AS p
INNER JOIN clientes AS c
ON c.id = p.cliente_id
INNER JOIN pagos AS pa
ON pa.pedido_id = p.id
ORDER BY p.id;Cada unión exige una coincidencia. Por eso el resultado contiene únicamente pedidos con cliente y con pago asociado.
Compatibilidad entre motores
INNER JOIN forma parte del SQL habitual y está disponible en PostgreSQL, MySQL, SQLite y SQL Server. JOIN sin INNER expresa la misma clase de unión en estos motores. Pueden cambiar los planes de ejecución, pero no la regla básica de conservar solo coincidencias.
Qué debes recordar
- Solo aparecen filas que encuentran pareja.
ONdefine qué significa «coincidir».- Una relación uno a muchos puede repetir la fila de la tabla principal.
- Si necesitas conservar ausencias, usa una unión externa.