0Pricing
SQL Interview Prep · Lección

ON frente a WHERE en los joins

Sepa cuándo una condición debe ir en ON o en WHERE y por qué influye en los resultados

ON frente a WHERE en los joins es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 2 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.

Un predicado puede aparecer en dos lugares

Una vez que sepa escribir un INNER JOIN, la siguiente pregunta de entrevista es más precisa: ¿debe esta condición estar en ON o en WHERE?

En un INNER JOIN, la respuesta a menudo es «el resultado no cambia». Pero en cuanto cambia a una unión externa, la elección modifica completamente la respuesta. Los entrevistadores preguntan esto precisamente porque los principiantes ponen todo en WHERE por costumbre.

Esta lección presenta la regla con claridad.

Qué hace ON

La cláusula ON define cómo se emparejan las filas. Se aplica mientras se construye la unión y decide qué fila de la tabla izquierda coincide con cuál de la tabla derecha.

Considere ON como la respuesta a la pregunta: «para estas dos filas, ¿pertenecen juntas?»

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

Qué hace WHERE

La cláusula WHERE se aplica después de que la unión haya producido sus filas combinadas. Filtra ese conjunto de resultados y descarta las filas que no superan la prueba.

Considere WHERE como la respuesta a la pregunta: «ahora que he unido las filas, ¿cuáles quiero conservar?»

SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;   -- filter after pairing

En INNER JOIN suelen dar el mismo resultado

En un INNER JOIN, un filtro adicional produce el mismo resultado tanto si lo coloca en ON como en WHERE. Ambas consultas siguientes devuelven únicamente el pedido de 50 $ de Ada y el de 99 $ de Bob.

Como una unión interna ya descarta las filas sin coincidencia, mover el predicado no cambia qué filas sobreviven.

-- predicate in ON
SELECT c.name, o.amount FROM customers c
JOIN orders o
  ON o.customer_id = c.id AND o.amount > 30;

-- predicate in WHERE -- same result here
SELECT c.name, o.amount FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;

Por qué el estilo sigue prefiriendo ON para las claves de unión

Aunque los resultados coincidan, la convención indica: coloque las condiciones de la relación entre tablas en ON y los filtros de negocio en WHERE.

  • ON: o.customer_id = c.id (cómo se relacionan las tablas)
  • WHERE: o.amount > 30 (qué resultados desea)

Esta separación deja clara la intención para la siguiente persona que lea el código y para el entrevistador que evalúe su estilo.

Dónde importa realmente: las uniones externas

La diferencia se vuelve decisiva con un LEFT JOIN, que conserva cada fila izquierda aunque no coincida ninguna fila derecha. Veamos una vista previa rápida con clientes y pedidos, donde Cleo no tiene pedidos.

Un LEFT JOIN conserva a Cleo con valores NULL en las columnas del pedido. Ahora observe qué efecto tienen ON y WHERE sobre ella.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
-- keeps Ada, Bob, AND Cleo (NULL amount)

Filtro en ON: se conservan las filas

Coloque la condición amount > 30 en ON de un LEFT JOIN y solo afectará a qué filas derechas se adjuntan. Las filas izquierdas sin coincidencia se siguen conservando, simplemente con valores NULL.

Cleo sobrevive. Cualquier pedido que no supere la prueba simplemente no se adjunta y deja un NULL.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
  ON o.customer_id = c.id AND o.amount > 30;
-- Ada 50, Bob 99, Cleo NULL  (3 rows, Cleo kept)

Filtro en WHERE: la unión externa desaparece

Mueva la misma condición a WHERE y filtrará el resultado unido. La fila de Cleo tiene amount = NULL, y NULL > 30 no es verdadero, por lo que se elimina.

El LEFT JOIN se comporta silenciosamente como un INNER JOIN. Esta es la trampa de las uniones más conocida en las entrevistas.

SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;
-- Ada 50, Bob 99  (Cleo GONE -> back to inner-join behavior)

La regla que debe memorizar

Expréselo así con claridad en una entrevista:

  • Una condición en ON decide si la fila derecha se adjunta; las filas izquierdas se conservan.
  • Una condición en WHERE filtra las filas finales y puede eliminar filas izquierdas conservadas cuando afecta a una columna que podría contener NULL.

Por tanto, en las uniones externas: los predicados sobre la tabla opcional deben ir en ON, salvo que quiera eliminar intencionadamente las filas sin coincidencia.

El uso legítimo de WHERE con NULL

Hay un caso en el que filtrar en WHERE una columna de una unión externa es exactamente lo correcto: el anti-join. Comprobar IS NULL encuentra las filas izquierdas que no tuvieron coincidencia.

Aquí WHERE conserva deliberadamente solo las filas sin coincidencia y devuelve los clientes con cero pedidos. La mecánica es la misma, pero la intención es opuesta.

SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL;   -- customers with no orders -> Cleo

Prueba mental rápida

Antes del cuestionario, siga esta lista de comprobación cuando vea una condición de unión:

  • ¿Es una clave de unión que relaciona las tablas? -> ON.
  • ¿Es un filtro sobre la tabla obligatoria? -> WHERE u ON son válidos.
  • ¿Es un filtro sobre la tabla opcional (externa) y quiere conservar las filas sin coincidencia? -> ON.
  • ¿Quiere encontrar las filas sin coincidencia? -> WHERE ... IS NULL.

Comprobación rápida

Aplique la regla de ON frente a WHERE a una unión externa.

Resumen: ON frente a WHERE

Ideas clave que debe llevar a la entrevista:

  • ON controla el emparejamiento y, en las uniones externas, si se adjunta la fila opcional, mientras conserva el lado que debe mantenerse.
  • WHERE filtra el resultado ya unido y puede eliminar filas conservadas.
  • En un INNER JOIN suelen ser intercambiables; en las uniones externas no lo son.
  • Los filtros sobre la tabla externa deben ir en ON, salvo que pretenda realizar un anti-join con IS NULL en WHERE.

Preguntas frecuentes

¿La lección «ON frente a WHERE en los joins» es gratis?

Sí — el texto completo de «ON frente a WHERE en los joins» 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 «ON frente a WHERE en los joins»?

Sepa cuándo una condición debe ir en ON o en WHERE y por qué influye en los resultados 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 2 de 4.

¿Cuánto tiempo toma la lección «ON frente a WHERE en los joins»?

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. Cómo INNER JOIN hace coincidir las filas
  2. ON frente a WHERE en los joins
  3. Expansión de joins y multiplicación de filas
  4. Unir tres o más tablas
← Volver a SQL Interview Prep