Ir al contenido
wannacode

LEFT JOIN: también las filas sin pareja

En resumen: LEFT JOIN conserva todas las filas de la tabla izquierda, incluso las que no tienen pareja en la tabla derecha, y rellena con NULL las columnas que faltan.

Problema

¿Quién no ha pedido?

Marketing quiere escribir a los clientes que se registraron pero todavía no han pedido nada. En la última lección JOIN devolvió 60 filas, y Teodora y Yavor no estaban entre ellas.

JOIN conserva solo los pares. Una fila sin pareja desaparece sin avisar. Aquí esas son justo las filas que necesitamos.

La idea

LEFT JOIN

Compara las dos consultas. La primera usa JOIN:

SQLbase de datos: tienda

La segunda usa LEFT JOIN:

SQLbase de datos: tienda

62 filas en lugar de 60. LEFT JOIN conserva todas las filas de la tabla izquierda (la de FROM), aunque no haya pareja en la derecha. Donde no hay pareja, las columnas de la tabla derecha son NULL. Baja hasta el final: Teodora y Yavor están ahí, con NULL en el número y la fecha.

De aquí, los clientes sin pedidos están a un paso:

SQLbase de datos: tienda

WHERE o.id IS NULL conserva solo las filas en las que no se encontró ningún pedido. Comprobamos o.id porque la clave primaria de un pedido encontrado nunca está vacía.

Míralo

Una respuesta vacía también es una respuesta

¿Hay productos que nadie ha pedido nunca? El mismo enfoque, con order_items:

SQLbase de datos: tienda

Ni una sola fila. Cada uno de los 25 productos se ha pedido al menos una vez. Una tabla sin filas no es un error: la consulta ha respondido «no hay ninguno».

Pruébalo

Las categorías vacías

¿Qué categorías no tienen ningún producto directamente en ellas? Muestra el nombre de la categoría.

SQLbase de datos: tienda

Míralo

Contar con los ceros

¿Cuántos pedidos tiene cada cliente, incluidos los que no tienen ninguno? Un primer intento con COUNT(*):

SQLbase de datos: tienda

¿Teodora y Yavor tienen 1 pedido cada uno? No. COUNT(*) cuenta filas, y LEFT JOIN le dio a cada uno una fila llena de NULL. Cuenta lo que tiene valor, COUNT(o.id):

SQLbase de datos: tienda

COUNT(columna) salta los NULL, así que salen con 0. Con LEFT JOIN, cuenta una columna de la tabla derecha, preferiblemente su clave primaria.

Pruébalo

Reseñas por producto

Muestra cada producto y cuántas reseñas tiene, incluidos los productos sin reseña (con 0).

SQLbase de datos: tienda

Míralo

La trampa de WHERE

Un informe de octubre: todos los clientes y cuántos pedidos han hecho desde el 1 de octubre de 2026. La condición de la fecha va en WHERE:

SQLbase de datos: tienda
1. ¿Por qué WHERE o.ordered_at >= … quitó a los clientes sin pedidos en octubre?

Cinco filas, pero hay 20 clientes. Una condición sobre la tabla derecha en WHERE convierte un LEFT JOIN en un JOIN normal. Su sitio está en ON: allí dice qué pedidos unir, y todos los clientes se quedan.

SQLbase de datos: tienda

20 clientes, la mayoría con 0. La regla: con LEFT JOIN, una condición sobre la tabla derecha va en ON. La excepción es IS NULL, cuando buscas los que faltan.

Ejercicio

Dos tareas

1. La tienda invitará a escribir una reseña a los clientes que todavía no han escrito ninguna. ¿Quiénes son? Muestra el nombre.

Los clientes sin una sola reseña:

SQLbase de datos: tienda

2. La campaña «Te echamos de menos» es para los clientes que no han hecho ningún pedido desde el 1 de julio de 2026 (incluidos los que nunca han pedido). Muestra el nombre y el correo.

Los clientes sin pedido desde el 2026-07-01:

SQLbase de datos: tienda
Más precisamente, para curiosos

También existen RIGHT JOIN (conserva las filas de la tabla derecha) y FULL JOIN (conserva ambos lados). SQLite los entiende desde la versión 3.39. RIGHT JOIN se escribe poco: es lo mismo que LEFT JOIN con las tablas intercambiadas. MySQL no tiene FULL JOIN.

SQLbase de datos: tienda

Aquí salen solo los clientes sin pedidos, porque cada pedido tiene un cliente.

Test

Ponte a prueba

1. FROM customers c LEFT JOIN orders o … ¿Qué clientes salen?
2. ¿Cómo encuentras los clientes sin pedidos?
3. Un cliente sin pedidos, LEFT JOIN y GROUP BY. ¿Qué da COUNT(*) para él?
4. Quieres todos los clientes y solo sus pedidos de octubre. ¿Dónde va la condición de la fecha?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·