Una clienta al teléfono
Suena el teléfono en atención al cliente. Es Marta Gil y pregunta por sus pedidos.
Abres la tabla de pedidos y no aparece ningún nombre. Solo hay números de cliente.
Los nombres están en otra tabla. Para contestar a Marta, tienes que juntar las dos tablas en una sola consulta.
Al final de esta lección
Nota
Puedo unir dos tablas para responder a una pregunta.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Clave primaria | la columna que identifica cada fila sin repetirse | customers.id |
| Clave foránea | una columna que guarda la clave primaria de otra tabla | orders.customer_id |
| JOIN | junta las filas de dos tablas | |
| ON | dice qué filas van juntas | |
| Combinación | el resultado de juntar dos tablas |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una clave apunta a otra tabla
En customers, la columna id es la clave primaria. Dos clientes nunca tienen el mismo id.
En orders, la columna customer_id guarda ese mismo número. Es una clave foránea: dice de quién es el pedido.
El nombre de cada cliente se escribe una sola vez. Los pedidos solo guardan su número.
Prueba: mira las dos tablas
-- Mira las dos tablas, una detrás de otra.
SELECT * FROM customers;
SELECT * FROM orders;
-- Busca a Marta Gil en customers: ¿qué id tiene?
-- Después busca ese número en la columna customer_id.
JOIN y ON juntan las filas
JOIN customers añade la tabla de clientes a la consulta. ON orders.customer_id = customers.id dice cómo emparejar las filas.
Para cada pedido, la base de datos busca el cliente con ese id y pega las dos filas en una.
Las dos tablas tienen una columna id. Por eso escribes tabla.columna, para que no haya duda.
Prueba: cada pedido con su cliente
-- Cada pedido con el nombre de su cliente.
SELECT orders.id, customers.name, orders.amount
FROM orders
JOIN customers ON orders.customer_id = customers.id;
-- Añade customers.city a la lista de columnas y vuelve a ejecutar.
Ejemplo: el emparejamiento, pedido a pedido
| Pedido | customer_id | Cliente encontrado | Importe |
|---|---|---|---|
| 201 | 3 | Marta Gil | 75 € |
| 202 | 1 | Lucía Romero | 42 € |
| 203 | 3 | Marta Gil | 28 € |
| 204 | 2 | Javier Ortega | 18 € |
| 205 | 4 | Andrés Navarro | 120 € |
| 206 | 1 | Lucía Romero | 36 € |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que basta con poner las dos tablas en FROM. No es así. Sin ON, la base de datos empareja cada pedido con cada cliente: 6 por 5, 30 filas. Casi todas son falsas. Escribe siempre la condición que une las claves.
Después de unir, filtra como siempre
Una vez unidas las tablas, todo lo que ya sabes sigue valiendo. Puedes usar WHERE, ORDER BY y GROUP BY con columnas de las dos tablas.
Así contestas a Marta: unes las tablas y filtras por su nombre.
Prueba: los pedidos de Marta Gil
-- Los pedidos de Marta Gil, buscando por su nombre.
SELECT orders.id, orders.amount, orders.status
FROM orders
JOIN customers ON orders.customer_id = customers.id
WHERE customers.name = 'Marta Gil';
-- Cambia el nombre por 'Lucía Romero' y vuelve a ejecutar.