joins

INNER JOIN o LEFT JOIN: ¿cuál elegir?

La elección depende primero de qué líneas deben permanecer visibles, no de una preferencia de sintaxis.

Equipo de SQL.tn8 min
Dos joins comparan coincidencias y líneas izquierdas sin equivalente

¿Qué población deberías mantener?

INNER JOIN devuelve solo filas que coinciden. LEFT JOIN mantiene todas las filas de la tabla de la izquierda y completa las columnas que faltan con NULL.

Para encontrar clientes sin pedido, hay que dejar clientes. Para analizar solo los pedidos vinculados a un cliente válido, INNER JOIN expresa mejor la necesidad.

Los nombres, cantidades y datos utilizados en este artículo son ficticios y creados con fines de aprendizaje.

La consulta explicada

Empieza por definir qué debe representar una fila del resultado. Esta decisión determina las columnas, agrupaciones y controles necesarios.

El siguiente ejemplo aísla el mecanismo principal. Ejecútelo, observe el resultado y luego cambie una cláusula a la vez para comprender su efecto.

Cuenta los pedidos sin perder clientes inactivos
SELECT c.nom, COUNT(co.id_commande) AS commandes
FROM clients c
LEFT JOIN commandes co ON co.id_client = c.id_client
GROUP BY c.id_client, c.nom;

Lea el resultado como un analista.

COUNT es para el ID de comando que admite valores NULL, no para *. Por lo tanto, un cliente no igualado obtiene cero.

Un filtro de pedidos realizados en WHERE podría eliminar las líneas NULL y cancelar el efecto de LEFT JOIN; colóquelo en ON si la población izquierda debe permanecer completa.

  • Nombra la población de referencia.
  • Planifique líneas inigualables.
  • Cuenta una columna en el lado derecho.
  • Verificar los filtros colocados en ON o WHERE.

Errores que distorsionan el análisis

Una consulta puede ser válida sin responder correctamente a la pregunta. Los errores más costosos suelen ser silenciosos: perímetro incorrecto, línea multiplicada o valor faltante interpretado como cero.

Antes de compartir el resultado, compáralo con una pequeña muestra calculada manualmente y mantén la definición del alcance con la consulta.

  • Elige INNER JOIN por costumbre.
  • Coloque un filtro derecho en WHERE después de LEFT JOIN.
  • Cuenta * y muestra 1 para una ausencia.
  • Agrupa solo por nombre y fusiona homónimos.

Ponte en practica

Haga el ejercicio de los clientes sin un pedido y luego vuelva a escribirlo con NOT EXISTS.

El simulador SQL de SQL.tn solo ejecuta consultas de lectura sobre datos ficticios en su navegador. Puede probar varias escrituras y comparar sus resultados sin instalar ningún software.

Comprueba la diferencia con datos concretos

La tienda quiere ver a todos sus clientes, incluso sin pedidos. Emma tiene dos pedidos, James uno y Olivia ninguno. ¿Qué join conservará a Olivia?

Datos ficticios del ejemplo — customers
customer_idcustomer_name
1Emma
2James
3Olivia
Datos ficticios del ejemplo — orders
order_idcustomer_id
1011
1021
1032
Consulta para probar
SELECT c.customer_name, o.order_id
FROM customers AS c
LEFT JOIN orders AS o ON o.customer_id = c.customer_id
ORDER BY c.customer_id, o.order_id;

Ejecuta LEFT JOIN y sustitúyelo por INNER JOIN. Olivia desaparece. Las dos filas de Emma no son duplicados accidentales: representan dos pedidos diferentes.

Comprueba el resultado: cuatro filas, incluida Olivia con un número de pedido NULL. Un filtro posterior en WHERE sobre una columna de orders puede excluir al cliente sin pedidos.

Entorno SQL en el navegador

Comprueba la diferencia con datos concretos

Ejecuta una consulta de lectura sobre los datos ficticios de este ejercicio. No se envía nada a SQL.tn.

Local y privado
Atajo: Ctrl/⌘ + Intro
El entorno SQL se preparará cuando ejecutes la consulta por primera vez.

Continúa con un ejercicio relacionado con esta guía