QuieroProgramar por Rodri Gonzalez
SQL · Lección 07 de 15

INNER JOIN

En el mundo real, los datos NO están en una sola tabla. Los clientes están en una tabla, sus cuentas en otra, las transacciones en otra. JOIN es la operación que las conecta usando una columna en común (típicamente un ID). Es la habilidad SQL más importante después de SELECT.

90–110 min Prerrequisitos: SQL 06
01

Concepto teórico

¿Por qué múltiples tablas?

Las bases de datos relacionales dividen la información en tablas separadas para evitar redundancia. En vez de repetir "García, Buenos Aires, DNI 30123456" en cada transacción, guardás los datos del cliente UNA vez y los conectás con un ID:

TABLA clientes:  id=1, nombre='García', ciudad='BsAs'
TABLA cuentas:   id=101, cliente_id=1, tipo='CA$', saldo=150000
TABLA transacc:  id=5001, cuenta_id=101, tipo='depósito', monto=50000

El campo cliente_id en la tabla de cuentas es una clave foránea (FK) que apunta al id de la tabla de clientes. JOIN usa esta relación para combinar los datos.

INNER JOIN — solo las coincidencias

INNER JOIN devuelve SOLO las filas que tienen coincidencia en AMBAS tablas. Si un cliente no tiene cuentas, no aparece. Si una cuenta no tiene cliente válido, tampoco.

SELECT c.nombre, cu.tipo, cu.saldo
FROM clientes c
INNER JOIN cuentas cu ON c.id = cu.cliente_id;
Alias de tabla: cuando trabajás con múltiples tablas, usás alias cortos (c para clientes, cu para cuentas) para no escribir el nombre completo cada vez. Son obligatorios cuando ambas tablas tienen columnas con el mismo nombre (c.id vs cu.id).
Analogía: INNER JOIN es como cruzar dos planillas de Excel usando BUSCARV (VLOOKUP). Tenés una planilla de clientes y otra de cuentas. Buscás el ID del cliente en la planilla de cuentas y traés los datos que coinciden. Si un cliente no tiene match, no aparece en el resultado.
Error común: olvidar la cláusula ON. Sin ON, SQL hace un CROSS JOIN (producto cartesiano): combina CADA fila de una tabla con TODAS las filas de la otra. Si tenés 1000 clientes y 5000 cuentas, obtenés 5,000,000 filas. Siempre verificá tu ON.

JOIN con más de 2 tablas

Podés encadenar múltiples JOINs para conectar 3 o más tablas:

SELECT c.nombre, cu.tipo, t.monto, t.fecha
FROM clientes c
INNER JOIN cuentas cu ON c.id = cu.cliente_id
INNER JOIN transacciones t ON cu.id = t.cuenta_id;

JOIN + WHERE + GROUP BY

Los JOINs se combinan con todas las cláusulas que ya conocés:

SELECT c.ciudad, COUNT(*) AS transacciones, SUM(t.monto) AS total
FROM clientes c
INNER JOIN cuentas cu ON c.id = cu.cliente_id
INNER JOIN transacciones t ON cu.id = t.cuenta_id
WHERE c.activo = 1
GROUP BY c.ciudad
HAVING SUM(t.monto) > 100000
ORDER BY total DESC;
En el trabajo: en un banco, los datos están en decenas de tablas: clientes, cuentas, tarjetas, transacciones, scoring, sucursales, productos. Una consulta típica de reporte une 3-5 tablas. "Dame las transacciones de los clientes premium de BsAs del último mes" requiere JOIN de clientes + scoring + cuentas + transacciones.
02

Ejemplos explicados paso a paso

Ejemplo 1: INNER JOIN básico — dos tablas

ejemplo_01_inner.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 2: JOIN con 3 tablas

ejemplo_02_tres_tablas.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 3: JOIN + GROUP BY — análisis cruzado

ejemplo_03_join_group.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 4: JOIN + WHERE + HAVING

ejemplo_04_completo.sqlSQL

        
Hacé clic en ▶ Ejecutar

Ejemplo 5: JOIN para encontrar el cliente con más cuentas

ejemplo_05_top.sqlSQL

        
Hacé clic en ▶ Ejecutar
03

Referencia rápida

Concepto Sintaxis
INNER JOIN FROM t1 INNER JOIN t2 ON t1.col = t2.col
Alias FROM clientes c INNER JOIN cuentas cu
3 tablas ... JOIN t2 ON ... JOIN t3 ON ...
JOIN + WHERE WHERE filtra filas después del JOIN
JOIN + GROUP BY Agregar datos combinados
COUNT(DISTINCT) Contar entidades únicas tras JOIN
04

Ejercicios

Nivel 1 · Básico

Ejercicio 1: JOIN de 2 tablas

Uní clientes con cuentas y mostrá nombre + saldo. Debe incluir García.

ejercicio_01.sqlDebe incluir "García"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 2: JOIN con WHERE

Mostrá solo las cuentas de clientes de Buenos Aires. Debe incluir 890000.

ejercicio_02.sqlDebe incluir "890000"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 3: JOIN con alias y ORDER BY

Uní clientes y cuentas, ordená por saldo DESC. Debe incluir Pérez primero.

ejercicio_03.sqlDebe incluir "Pérez"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 4: Saldo total por cliente

Un cliente puede tener varias cuentas. Calculá el saldo total de cada uno con GROUP BY. Debe incluir 655000.

ejercicio_04.sqlDebe incluir "655000"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 5: Conteo de cuentas por cliente

¿Cuántas cuentas tiene cada cliente? Debe incluir 3.

ejercicio_05.sqlDebe incluir "3"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 6: JOIN de 3 tablas

Uní clientes → cuentas → transacciones. Mostrá nombre, tipo de operación y monto. Debe incluir depósito.

ejercicio_06.sqlDebe incluir "depósito"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 7: JOIN + GROUP BY por ciudad

Saldo total y promedio por ciudad usando JOIN de clientes+cuentas. Debe incluir Buenos Aires.

ejercicio_07.sqlDebe incluir "Buenos Aires"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 8: JOIN + HAVING

Mostrá solo clientes con saldo total > $500K. Debe incluir Pérez.

ejercicio_08.sqlDebe incluir "Pérez"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 9: JOIN + CASE WHEN + categoría

Uní clientes con cuentas, clasificá por saldo total (Alto > 500K, Medio > 200K, Bajo). Debe incluir Alto.

ejercicio_09.sqlDebe incluir "Alto"

          
Hacé clic en ▶ Ejecutar
Nivel 4 · Desafío

Ejercicio 10: Reporte ejecutivo multi-tabla

Uní 3 tablas (clientes, cuentas, transacciones). Mostrá por cada cliente: nombre, ciudad, saldo total de cuentas, cantidad de transacciones y monto total transaccionado. Debe incluir total_transaccionado.

ejercicio_10.sqlDebe incluir "total_transaccionado"

          
Hacé clic en ▶ Ejecutar
05

Resumen y conexión

En la siguiente lección (08 · LEFT, RIGHT y FULL JOIN) vas a aprender los JOINs que incluyen filas SIN coincidencia — cruciales para encontrar "los que NO tienen".