0Pricing
SQL Interview Prep · Lección

LEFT JOIN y conservación de filas sin coincidencia

Descubra qué conserva LEFT JOIN y cómo aparecen los valores NULL en las filas sin coincidencia

LEFT JOIN y conservación de filas sin coincidencia es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.

La situación de la entrevista

El entrevistador dice: "Enumere todos los clientes y sus pedidos, incluidos los clientes que nunca han hecho un pedido." Un INNER JOIN elimina los clientes sin pedidos, por lo que no cumple este requisito. La solución es un LEFT JOIN.

Un LEFT JOIN conserva todas las filas de la tabla de la izquierda (la primera que se nombra) y adjunta las filas coincidentes de la tabla de la derecha cuando existen. Esta lección construye el modelo mental preciso que esperan los entrevistadores.

Qué garantiza LEFT JOIN

La promesa fundamental: toda fila de la tabla izquierda aparece al menos una vez en la salida, tenga coincidencia o no.

  • Si una fila izquierda encuentra coincidencias a la derecha, obtiene una fila de salida por cada coincidencia.
  • Si una fila izquierda no encuentra ninguna coincidencia, aun así obtiene una fila de salida, con todas las columnas de la tabla derecha establecidas en NULL.

Por eso los entrevistadores lo llaman una unión externa: las filas que quedan fuera del conjunto de coincidencias se conservan en lugar de descartarse.

Las dos tablas

Durante toda esta lección usamos dos tablas sencillas. customers contiene todos los clientes; orders registra las compras y hace referencia a un cliente mediante customer_id.

Observe que el cliente 3 (Carol) no tiene ninguna fila en orders. Ese cliente sin coincidencia es exactamente el que debe conservar un LEFT JOIN.

-- customers
-- id | name
--  1 | Alice
--  2 | Bob
--  3 | Carol

-- orders
-- id | customer_id | amount
-- 10 |     1       |  50
-- 11 |     1       |  75
-- 12 |     2       |  20

Escritura del LEFT JOIN

La sintaxis refleja una unión interna, sustituyendo INNER por LEFT (la palabra OUTER es opcional: LEFT JOIN y LEFT OUTER JOIN son idénticos).

La tabla escrita antes de la palabra clave es el lado izquierdo que se conserva. El orden importa: customers LEFT JOIN orders conserva todos los clientes, no todos los pedidos.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id;

Lectura del resultado

Esta es la salida de esa consulta. Alice coincidió dos veces, así que aparece dos veces. Bob coincidió una vez. Carol no coincidió con nada, por lo que sigue apareciendo con NULL en la columna amount.

Esa única fila de Carol con NULL es la señal distintiva de un LEFT JOIN. Un entrevistador que observe cómo razona en voz alta quiere oírle decir: "las filas izquierdas sin coincidencia sobreviven con NULL a la derecha".

-- name  | amount
-- Alice |  50
-- Alice |  75
-- Bob   |  20
-- Carol | NULL   <-- preserved, no match

De dónde proceden los NULL

El NULL no se almacena en ningún sitio. La base de datos lo genera porque no existe ninguna fila de la tabla derecha que proporcione amount.

Todas las columnas obtenidas de la tabla derecha se convierten en NULL para una fila izquierda sin coincidencia: o.id, o.customer_id y o.amount son NULL en la fila de Carol. Esto es importante porque que o.customer_id sea NULL no significa que el cliente no tenga un id, sino que no había ningún pedido coincidente.

Contar los pedidos por cliente

Una pregunta habitual de seguimiento: "¿Cuántos pedidos tiene cada cliente, incluidos los que tienen cero?" Un LEFT JOIN combinado con COUNT resuelve el problema, pero debe contar la columna de la tabla derecha, no *.

COUNT(o.id) ignora los NULL, así que Carol obtiene 0. COUNT(*) devolvería erróneamente 1 para Carol porque la fila NULL generada sigue contando como una fila.

SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 2
-- Bob   | 1
-- Carol | 0

Trampa de COUNT(*) frente a COUNT(columna)

Esta es una pregunta engañosa clásica de las entrevistas. Después de un LEFT JOIN, la fila izquierda sin coincidencia existe físicamente en el resultado, con columnas derechas NULL.

  • COUNT(*) cuenta esa fila y devuelve 1 para un cliente sin pedidos.
  • COUNT(o.id) omite el NULL y devuelve correctamente 0.

Cuente siempre una columna que sea NULL en el lado sin coincidencia cuando necesite ceros reales.

-- WRONG: Carol shows 1
SELECT c.name, COUNT(*) AS n
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;

Sumar con LEFT JOIN

Los agregados distintos de COUNT se comportan correctamente con los NULL generados. SUM ignora los NULL, por lo que un cliente sin coincidencia produce NULL (no un error).

Los entrevistadores suelen querer cero en lugar de NULL para los informes. Envuelva el agregado en COALESCE para sustituirlo por un valor predeterminado.

SELECT c.name,
       COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 125
-- Bob   |  20
-- Carol |   0

Tabla izquierda frente a tabla derecha, explicado claramente

Cuando el entrevistador pregunte "¿qué tabla se conserva?", responda con seguridad: la que está a la izquierda de la palabra clave JOIN. Léalo de izquierda a derecha.

A LEFT JOIN B = conservar todo A. Para conservar todo B, invierta el orden con B LEFT JOIN A o use un RIGHT JOIN. La mayoría de los equipos prefieren usar exclusivamente LEFT JOIN por legibilidad, simplemente reordenando las tablas.

Lista mental de comprobación

Cuando vea un LEFT JOIN en una entrevista, siga esta lista en voz alta:

  • ¿Lado conservado? La tabla izquierda; se conservan todas sus filas.
  • ¿Filas sin coincidencia? Aparecen una vez con NULL procedentes de la derecha.
  • ¿Cuenta? Use COUNT(right_col) para obtener ceros reales.
  • ¿Suma? Envuélvala en COALESCE si necesita 0 en lugar de NULL.

Expresar esta lista indica un rigor propio de un perfil sénior.

Comprobación rápida

Ponga a prueba su intuición sobre LEFT JOIN al contar.

Recapitulación

LEFT JOIN conserva todas las filas de la tabla izquierda. Las filas izquierdas con coincidencia se emparejan con sus coincidencias derechas; las filas izquierdas sin coincidencia sobreviven una vez con NULL en todas las columnas de la tabla derecha.

  • La tabla izquierda es la que aparece antes de la palabra clave JOIN.
  • Los NULL generados señalan las filas sin coincidencia.
  • COUNT(right_col) proporciona ceros reales; COUNT(*) no.
  • COALESCE(SUM(...), 0) convierte los totales NULL en cero.

Esta es la base para encontrar datos faltantes y realizar anti-joins en las próximas lecciones.

Preguntas frecuentes

¿La lección «LEFT JOIN y conservación de filas sin coincidencia» es gratis?

Sí — el texto completo de «LEFT JOIN y conservación de filas sin coincidencia» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «LEFT JOIN y conservación de filas sin coincidencia»?

Descubra qué conserva LEFT JOIN y cómo aparecen los valores NULL en las filas sin coincidencia Practicas SQL Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar SQL Interview Prep?

No se requiere experiencia previa. SQL Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «LEFT JOIN y conservación de filas sin coincidencia»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de SQL Interview Prep?

Sí. Cada lección de SQL Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. LEFT JOIN y conservación de filas sin coincidencia
  2. Semántica de RIGHT y FULL OUTER JOIN
  3. Encontrar filas sin coincidencia (anti-join)
  4. La trampa de WHERE en un outer join
← Volver a SQL Interview Prep