SQL Intermedio · Lección 2 de 6
Cruzar tablas con JOIN
Ya sabés cómo se organiza la base: hechos al centro y dimensiones alrededor, conectados por claves. Hoy aprendés a unirlas en una sola consulta.
De las claves a los nombres
En la lección anterior viste que la tabla de hechos ventas guarda claves y no nombres: una fila dice que el cliente 5 compró el producto 9 en la sucursal 3. Para analizar, necesitás ver los nombres. Eso es lo que hace JOIN: sigue cada clave hasta su dimensión y trae los datos que necesitás.
¿Y cómo traigo los nombres?
Con JOIN. Le decís a SQL qué tabla sumar y cómo se conectan las filas con ON. Esta consulta trae cada venta con el nombre de su producto:
SELECT ventas.fecha,
productos.nombre
FROM ventas
JOIN productos ON ventas.producto_id = productos.id;Se lee así: "de ventas, uní productos donde el producto_id de la venta sea igual al id del producto". Para cada venta, SQL busca su producto y arma una fila con datos de las dos tablas.

Cada color es un emparejamiento. Fijate que dos ventas apuntan al mismo producto, y que el aceite, que no está en estas cuatro ventas, no aparece en el resultado.
Alias: nombres cortos para las tablas
Escribir productos.nombre todo el tiempo cansa. Por eso se usan alias: una letra después del nombre de la tabla. Es la misma consulta, más fácil de leer:
SELECT v.fecha,
p.nombre
FROM ventas v
JOIN productos p ON v.producto_id = p.id;El punto indica de qué tabla es cada columna: v.fecha es la fecha de ventas y p.nombre es el nombre de productos. Es importante cuando dos tablas tienen columnas que se llaman igual, como nombre o id.
ON.Actividad 1
Detective de ids
Esta es una fila de la tabla ventas. Los números no dicen mucho solos: hay que buscarlos en las otras tablas. Seguí los pedidos y tocá la fila correcta en cada tabla.
| id | fecha | cliente_id | producto_id | sucursal_id | cantidad |
|---|---|---|---|---|---|
| 7 | 2026-03-08 | 5 | 9 | 3 | 1 |
⊞ clientes
| id | nombre | barrio |
|---|---|---|
| 1 | Ana | Centro |
| 2 | Jorge | Norte |
| 3 | Lucía | Centro |
| 4 | Martín | Sur |
| 5 | Sofía | Norte |
| 6 | Diego | Sur |
| 7 | Carla | Centro |
| 8 | Pablo | Norte |
⊞ productos
| id | nombre | precio |
|---|---|---|
| 1 | Yerba 1 kg | 4200 |
| 2 | Aceite de girasol 1,5 l | 3100 |
| 3 | Arroz 1 kg | 1500 |
| 4 | Fideos tirabuzón 500 g | 1100 |
| 5 | Leche entera 1 l | 1250 |
| 6 | Queso cremoso 1 kg | 8900 |
| 7 | Gaseosa cola 2,25 l | 2800 |
| 8 | Agua mineral 2 l | 1300 |
| 9 | Galletitas de agua | 950 |
| 10 | Detergente 750 ml | 1900 |
| 11 | Lavandina 1 l | 1050 |
| 12 | Pan lactal | 2300 |
⊞ sucursales
| id | nombre |
|---|---|
| 1 | Centro |
| 2 | Norte |
| 3 | Sur |
Actividad 2
Tus primeros JOIN
Tres misiones para unir tablas. Antes de escribir, mirá cómo se conectan: las tablas y sus columnas están a mano.
ventas:idINTEGERfechaDATEcliente_idINTEGERproducto_idINTEGERsucursal_idINTEGERcantidadINTEGERPrimer paso: explorar toda la tabla
Antes de escribir tu consulta, conviene mirar la tabla completa. Esta consulta trae todas las columnas (eso significa el asterisco) y todas las filas:
SELECT * FROM ventas;
Cargando la tabla…
Cada fila es una compra: cuándo, quién, qué, en qué sucursal y cuántas unidades. Fijate que cliente_id, producto_id y sucursal_id no son nombres: son números que apuntan a otra tabla. Para traer esos nombres se usa JOIN.
Hacelo siempre como primer paso cuando trabajes con una tabla nueva. Si la tabla es enorme, sumale LIMIT 20 para ver solo una muestra, como viste en SQL Inicial.
productos:idINTEGERnombreTEXTcategoriaTEXTprecioREALstockINTEGERPrimer paso: explorar toda la tabla
Antes de escribir tu consulta, conviene mirar la tabla completa. Esta consulta trae todas las columnas (eso significa el asterisco) y todas las filas:
SELECT * FROM productos;
Cargando la tabla…
Mirándola te ubicás: qué columnas hay, cómo están escritos los textos (por ejemplo, 'Lácteos' con mayúscula y tilde) y entre qué valores andan los números. Con eso armás tu consulta sin adivinar. Su id es el número que aparece en ventas.producto_id.
Hacelo siempre como primer paso cuando trabajes con una tabla nueva. Si la tabla es enorme, sumale LIMIT 20 para ver solo una muestra, como viste en SQL Inicial.
clientes:idINTEGERnombreTEXTbarrioTEXTtelefonoTEXTPrimer paso: explorar toda la tabla
Antes de escribir tu consulta, conviene mirar la tabla completa. Esta consulta trae todas las columnas (eso significa el asterisco) y todas las filas:
SELECT * FROM clientes;
Cargando la tabla…
Cada fila es una persona que compra en el almacén. Su id es el número que aparece en ventas.cliente_id.
Hacelo siempre como primer paso cuando trabajes con una tabla nueva. Si la tabla es enorme, sumale LIMIT 20 para ver solo una muestra, como viste en SQL Inicial.
- 1Mostrá la
fechade cada venta y elnombredel producto que se vendió. - 2Mostrá la
fecha, elnombredel cliente y lacantidadde cada venta. - 3Mostrá las compras de Ana:
fecha, nombre del producto ycantidad. Vas a necesitar dos JOIN y un WHERE.
Tu misión, las tablas, los mensajes y la ayuda están en el panel de la izquierda.
Tocá Ejecutar para ver el resultado.
Chequeo rápido
¿Qué pasa si escribís el JOIN sin el ON?
Pedile a la IA que te dibuje las conexiones
Cuando una base tiene muchas tablas, la IA te puede ayudar a entender cómo se conectan. Copiá este pedido y cambiá lo que está entre corchetes:
Tengo estas tablas: [ventas (id, fecha, cliente_id, producto_id, sucursal_id, cantidad)], [productos (id, nombre, categoria, precio, stock)] y [clientes (id, nombre, barrio)]. Explicame cómo se conectan y escribime el JOIN para [ver cada venta con el nombre del cliente].
Después ejecutá la consulta y fijate si la cantidad de filas tiene sentido.
_id). JOIN … ON une las filas que coinciden, y los alias (v., p.) hacen la consulta más corta y clara.Ya sabés cruzar tablas