Lesson 2 of 18· Bienvenida y el esquema multitabla
Ya sabes escribir SELECT, WHERE y GROUP BY sobre una tabla. Pero en el mundo real los datos casi nunca viven en una sola tabla: están repartidos en varias que se relacionan entre sí. Aprender a combinarlas es lo que convierte a SQL en una herramienta de negocio de verdad.
En esta lección vas a hacerlo de inmediato. Nada de teoría larga primero: verás el problema, correrás una consulta, y en menos de tres minutos tendrás tu primer JOIN funcionando sobre el dataset de la tienda online que usaremos durante todo el curso.
Imagina que trabajas en una tienda online y te piden un listado de los pedidos con el nombre del cliente que los hizo. Empecemos por lo que ya sabes: consultar la tabla orders. Ejecuta este bloque (haz clic en Run) y mira el resultado.
SELECT order_id, order_date, customer_id
FROM orders
ORDER BY order_id;Funciona, pero hay un problema evidente: la columna customer_id es solo un número (1, 2, 3…). ¿Quién es el cliente 3? La tabla orders no lo sabe: guarda el identificador del cliente, no su nombre. El nombre, el email y la ciudad viven en otra tabla, customers.
Ese número no es un error de diseño, es intencional: evita repetir "Ana Torres", "ana.torres@example.com", "Bogotá"… en cada pedido de Ana. En su lugar, orders guarda un customer_id que apunta a la fila correspondiente en customers. Nuestro trabajo es seguir ese puntero.
Visualmente, la relación entre las dos tablas es así:
La línea que une las tablas dice: cada fila de orders tiene un customer_id que coincide con un customer_id de customers. Ese es el puente. (El símbolo PK marca la clave primaria y FK la clave foránea; los veremos con calma en el próximo módulo, aquí solo necesitas la idea del puente.)
JOIN ... ONPara traer el nombre del cliente le pedimos a SQL que una ambas tablas por ese puente. La sintaxis es un JOIN seguido de un ON que dice por qué columnas coinciden las filas. Ejecútalo:
SELECT orders.order_id,
orders.order_date,
customers.name
FROM orders
JOIN customers
ON orders.customer_id = customers.customer_id
ORDER BY orders.order_id;¡Ahí está! 🎉 Ahora cada pedido aparece con el nombre real del cliente en lugar de un número anónimo. Acabas de escribir tu primer JOIN.
Lee la consulta parte por parte:
| Parte | Qué hace |
|---|---|
FROM orders | Empezamos con la tabla de pedidos (la tabla "de la izquierda"). |
JOIN customers | Pedimos combinarla con la tabla de clientes. |
ON orders.customer_id = customers.customer_id | La condición de unión: empareja cada pedido con el cliente cuyo customer_id coincide. |
SELECT orders.order_id, ..., customers.name | Elegimos columnas de ambas tablas a la vez. |
Como ahora hay dos tablas en juego y ambas tienen una columna customer_id, escribimos tabla.columna (por ejemplo orders.customer_id) para que SQL no se confunda sobre a cuál nos referimos. A esto se le llama cualificar el nombre de la columna.
Mentalmente, un JOIN funciona así: SQL recorre cada fila de orders, y para cada una busca en customers la fila que cumple la condición del ON; cuando la encuentra, pega las columnas de ambas en una sola fila del resultado.
Este JOIN que acabas de usar es en realidad un INNER JOIN (la palabra INNER es opcional: JOIN a secas significa lo mismo). "Inner" quiere decir que solo aparecen las filas que encuentran pareja a ambos lados.
¿Un detalle que quizá notaste? En la tabla orders hay un pedido más reciente sin cliente asignado (su customer_id está vacío), y no aparece en el resultado del JOIN: como no encuentra pareja en customers, un INNER JOIN lo descarta. Eso a veces es justo lo que quieres… y a veces no. En módulos posteriores veremos qué hacer cuando quieres conservar filas sin pareja (los LEFT, RIGHT y FULL JOIN), pero por hoy quédate con esta base: unir dos tablas por una columna en común con JOIN ... ON.
customer_id) que apunta a otra.JOIN ... ON combina esas tablas emparejando filas por una columna en común.tabla.columna.JOIN (o INNER JOIN) devuelve solo las filas que encuentran pareja a ambos lados; las que no la encuentran se quedan fuera.En la siguiente lección leeremos a fondo el diagrama entidad-relación de la tienda para entender todas las tablas y cómo se conectan, antes de exprimir los JOINs. Pero antes de pasar de página, demuéstrate a ti mismo que ya sabes hacerlo: la mejor forma de fijar un JOIN es escribir uno.
Hora de recuperar lo aprendido tú mismo. Toma la consulta del JOIN y amplíala para que muestre también el email de cada cliente.
El resultado debe tener cuatro columnas, en este orden: order_id, order_date, name y email, ordenado por order_id. El email vive en la tabla customers (columna email). Escribe tu versión, haz clic en Check y compara: cuando pase, habrás cerrado tú mismo el ciclo de esta lección.
Modifica la consulta para que el SELECT incluya también el email del cliente. El resultado debe tener las columnas order_id, order_date, name y email (en ese orden), unido por customer_id y ordenado por order_id.
-- Añade la columna email del cliente al SELECT.
-- Debe devolver: order_id, order_date, name, email (en ese orden), ordenado por order_id.
SELECT orders.order_id,
orders.order_date,
customers.name
-- TODO: agrega aquí la columna del email
FROM orders
JOIN customers
ON orders.customer_id = customers.customer_id
ORDER BY orders.order_id;Free