Joins I: combinar tablas
Hasta hoy cada consulta ha mirado UNA sola tabla. Pero fíjate en la tabla pedidos: solo tiene cliente_id y producto_id, números sueltos sin nombre ni precio. Para saber "qué compró Ana" de verdad, necesitas cruzar tres tablas a la vez. Bienvenido al concepto más importante de todo el curso: los JOIN.
Por qué las tablas están separadas (y no deberían dejar de estarlo)
Podrías pensar: ¿por qué no meter el nombre del cliente directamente en cada
fila de pedidos, y ahorrarnos este lío? Porque entonces, si Ana cambia de
email, tendrías que actualizarlo en cada uno de sus pedidos, en vez
de en un solo sitio. Separar los datos en tablas relacionadas —y usar
cliente_id como referencia— es la base de todo
diseño de bases de datos serio. JOIN es cómo
volvemos a juntar esa información cuando la necesitamos.
INNER JOIN: solo lo que coincide en ambas tablas
INNER JOIN combina filas de dos tablas donde una
condición se cumple —normalmente, que una clave foránea coincida con una clave
primaria—. Si un pedido no tiene cliente correspondiente (no debería pasar,
pero imagina que sí), simplemente no aparece en el resultado.
Fíjate en la sintaxis: FROM pedidos p le da a la
tabla pedidos el alias corto p, y
clientes c hace lo mismo. Después, cada columna
se escribe como p.cantidad o
c.nombre — imprescindible en cuanto dos tablas
comparten un nombre de columna (como id), y una
costumbre que merece la pena mantener siempre por claridad.
Puedes encadenar más de un JOIN para traer datos de tres tablas a la vez:
LEFT JOIN: todo de la izquierda, coincida o no
LEFT JOIN mantiene todas las filas
de la tabla de la izquierda (la que va después de FROM), tengan o no
coincidencia en la tabla de la derecha. Cuando no hay coincidencia, las
columnas de la derecha aparecen como NULL.
Esta última consulta responde una pregunta de negocio real, y es el motivo por el que existe LEFT JOIN: "¿qué productos no ha comprado nunca nadie?". Con INNER JOIN esto sería imposible de preguntar — un producto sin pedidos simplemente desaparecería del resultado en vez de mostrarse con NULL.
Usar INNER JOIN cuando en realidad quieres LEFT JOIN. Si tu resultado tiene menos filas de las que esperabas, sospecha primero de esto: es la causa más habitual de "bugs" en informes con JOINs. Pregúntate: "¿de esta tabla quiero todas las filas, aunque no tengan pareja en la otra?". Si la respuesta es sí, es LEFT JOIN, no INNER.
Ponlo a prueba
Comprueba lo que has aprendido
1. ¿Qué hace un INNER JOIN?
2. Quieres una lista de TODOS los productos, incluso los que nunca se han pedido. ¿Qué usas?
3. En un LEFT JOIN, cuando no hay coincidencia en la tabla derecha, ¿qué aparece en esas columnas?