Volver a la lista de artículos Artículos
Lectura de 10 minutos

Ejemplos prácticos de cuándo utilizar JOINs no iguales en SQL

Si cree que dos tablas en SQL sólo pueden unirse utilizando el campo común, le entusiasmará saber que existen otras formas de unión. Los JOINs no equitativos utilizan diferentes tipos de operadores de comparación en la condición de JOIN. En este artículo, le guiaré a través de ejemplos de JOIN no equis para mostrar los casos de uso comunes para este tipo de JOIN.

Equi JOIN vs. Non-Equi JOIN

¿Cómo suele unir dos tablas en SQL? Lo más probable es que seleccione el campo común en estas dos tablas y las una utilizando el signo de igualdad en la condición de unión. Por ejemplo, puede unir el ID del producto de la tabla de productos con el ID del producto de la tabla de pedidos o el apellido de la tabla de empleados con el apellido de la hoja de horas.

En estos casos, está utilizando un equi JOIN, que es sólo un nombre elegante para una unión con un signo igual en la condición de unión. Muchos principiantes en SQL usan equi JOINs y ni siquiera saben que se puede usar una condición de no igualdad en el JOIN.

Tales uniones se denominan JOINs no equis, y también son posibles en SQL. Cuando usted une dos tablas usando otros operadores condicionales, más allá del signo de igualdad, los JOINs no-equitativos entran en juego. Los operadores de comparación, como <, >, <=, >=, !=, y <> y el operador BETWEEN funcionan perfectamente para unir tablas en SQL.

Consulte esta guía ilustrada de los JOIN no equitativos de SQL para comprender mejor su funcionamiento.

Conociendo los datos

Antes de sumergirse en diferentes ejemplos de JOINs no-equi, veamos primero los datos que exploraremos en este artículo. Vamos a hacer un análisis de datos para una agencia inmobiliaria que tiene un negocio de alquiler. Tenemos tres tablas en nuestra base de datos imaginaria:

  • houses con el ID de la casa, el distrito, la dirección, el número de habitaciones y el alquiler
  • renters con el ID del inquilino, el nombre, el distrito preferido, el número mínimo de habitaciones requerido y el rango de alquiler aceptable
  • deals con el ID de la operación, la fecha, el ID del inquilino, el ID de la casa y los honorarios del agente recibidos de la operación correspondiente

Vea estas tres tablas a continuación.

Houses

iddistrictaddressbedroomsrent
1SouthRose Street, 543000.00
2NorthMain Street, 1232250.00
3SouthRose Street, 543000.00
4WestNice Street, 321750.00
5WestPark Avenue, 1043500.00
6SouthLittle Street, 743000.00
7NorthMain Street, 832100.00

Renters

idnamepreferred_districtmin_bedroomsmin_rentmax_rent
1Helen BossSouth32500.003200.00
2Michael LaneWest21500.002500.00
3Susan SandersWest42500.004000.00
4Tom WhiteNorth32200.002500.00
5Sofia BrownNorth31800.002300.00

Deals

iddaterenter_idhouse_idagent_fee
12020-01-3011600.00
22020-02-0324350.00
32020-03-1235700.00
42020-04-1042450.00

Ahora, estamos listos para pasar a los ejemplos de non-equi JOIN.

Casos de uso de los JOINs no equitativos

Si nunca ha utilizado JOINs no equitativos antes, puede preguntarse cuáles son los escenarios comunes para aplicar este tipo de JOIN no estándar. De hecho, hay bastantes. Puede utilizar los JOINs no-equitativos para listar todos los pares (únicos) de elementos, identificar duplicados, listar elementos dentro de un cierto rango de valores o entre ciertas fechas, calcular totales corridos, y más.

Vamos a empezar con los casos de uso más comunes para los JOINs no-equitativos.

Combinaciones de pares de listados

Imaginemos que nuestros inquilinos están dispuestos a considerar compartir una casa con otra familia. Así, queremos listar todas las posibles parejas de nuestros inquilinos junto con su distrito preferido para ver qué inquilinos podrían potencialmente alquilar una casa juntos. Esta es la consulta SQL que podría utilizar:

SELECT r1.name, r1.preferred_district, r2.name, r2.preferred_district
FROM renters r1
JOIN renters r2
ON r1.preferred_district = r2.preferred_district AND r1.id != r2.id;

Como puede ver en este ejemplo, hemos unido la tabla renters consigo misma. Hemos utilizado dos condiciones con diferentes operadores de comparación en nuestra sentencia JOIN:

  • El signo igual estándar asegura que emparejamos sólo los clientes con el mismo distrito preferido
  • El operador de comparación != asegura que el resultado incluirá todos los posibles pares de arrendatarios, excepto el emparejamiento de los arrendatarios consigo mismos

La segunda condición con el operador != hace que este JOIN sea un JOIN no igual.

namepreferred_distirctnamepreferred_distirct
Michael LaneWestSusan SandersWest
Susan SandersWestMichael LaneWest
Tom WhiteNorthSofia BrownNorth
Sofia BrownNorthTom WhiteNorth

El resultado se ve bastante bien, excepto que tenemos los mismos pares de inquilinos listados dos veces en nuestra tabla. Tendría más sentido tener sólo pares únicos en nuestro resultado. Esta pequeña modificación de nuestra consulta es un truco útil:

SELECT r1.name, r1.preferred_district, r2.name, r2.preferred_district
FROM renters r1
JOIN renters r2
ON r1.preferred_district = r2.preferred_district AND r1.id < r2.id;
namepreferred_distirctnamepreferred_distirct
Michael LaneWestSusan SandersWest
Tom WhiteNorthSofia BrownNorth

Al cambiar el operador de comparación en la segunda condición de unión de != a <, estamos listando sólo los pares en los que el valor de ID del primer inquilino es menor que el valor de ID del segundo inquilino. Por lo tanto, ahora sólo tenemos la fila con Michael Lane (ID 2) en la primera columna y Susan Sanders (ID 3) en la tercera columna, y no la fila en la que Susan Sanders aparece en primer lugar.

Para listar todos los pares (únicos) de clientes, unimos la tabla de arrendatarios consigo misma, lo que es básicamente un self JOIN. Para obtener más información sobre las autouniones, consulte esta guía completa con ejemplos fáciles de seguir.

Identificación de duplicados

Otra aplicación común de los JOINs no equitativos es encontrar duplicados en un conjunto de datos. Por ejemplo, digamos que queremos comprobar si nuestra tabla de casas incluye algún duplicado, es decir, casas con la misma dirección pero con diferentes identificaciones.

Nuestra consulta será muy similar a la que utilizamos para listar los pares únicos, pero esta vez nos autouniremos con la tabla de casas:

SELECT h1.id, h1.address, h2.id, h2.address
FROM houses h1
JOIN houses h2
ON h1.address = h2.address AND h1.id < h2.id;

Volvemos a tener dos condiciones de unión: (1) para comprobar si la dirección es la misma, y (2) para asegurarnos de que listamos sólo los pares únicos con IDs diferentes.

idaddressidaddress
1Rose Street, 53Rose Street, 5

La tabla anterior muestra que hay un duplicado en nuestro conjunto de datos. La casa situada en la calle Rose, 5 se menciona dos veces en la tabla, con el ID 1 y el ID 3.

Unir tablas utilizando un rango de valores

Otras aplicaciones populares de los JOINs no equitativos incluyen la unión de dos tablas utilizando:

  • El operador BETWEEN para comprobar si un determinado valor/fecha está dentro de un rango especificado
  • Operadores de comparación como >= o <= para comprobar la capacidad

Para ver cómo funcionan estos JOINs no equitativos en la práctica, vamos a enumerar otras casas que podemos sugerir a nuestros arrendatarios como alternativa. Deberían ser casas (1) en su distrito preferido, (2) dentro de su rango de precios, (3) con su número de habitaciones requerido, y (4) no ocupadas (es decir, no listadas en nuestra tabla de ofertas). Esta es la consulta SQL que podemos utilizar:

SELECT r.id, r.name, h.id, h.address, h.rent, h.bedrooms
FROM renters r
JOIN houses h
ON h.district = r.preferred_district
    AND h.rent BETWEEN r.min_rent AND r.max_rent
    AND h.bedrooms >= r.min_bedrooms
WHERE h.id NOT IN (SELECT house_id FROM deals);

Aquí, en la condición JOIN, comprobamos las tres primeras condiciones mencionadas anteriormente:

  • Si el distrito de la casa corresponde al distrito preferido por el arrendatario (condición de igualdad)
  • Si el alquiler está dentro del rango aceptable del inquilino (condición de no igualdad con el rango de valores)
  • Si el número de dormitorios cumple los requisitos mínimos (condición de no igualdad para comprobar la capacidad)

A continuación, en la sentencia WHERE, utilizamos una subconsulta para filtrar sólo las viviendas que presumiblemente están libres, es decir, que aún no están en nuestra tabla deals.

Y aquí está la lista de casas que podemos sugerir a nuestros clientes (nótese que la casa con el ID 3 es sólo un duplicado de la casa que este cliente está alquilando ahora):

idnameidaddressrentbedrooms
1Helen Boss6Little Street, 730004
1Helen Boss3Rose Street, 530004
5Sofia Brown7Main Street, 821003

Obtenga más práctica con estos tipos de SQL non-equi JOINs en nuestro curso completo sobre Tipos de JOIN en SQL.

Escenarios avanzados para el uso de JOINs no equitativos

Además de las aplicaciones comunes de los JOINs no equitativos mencionados anteriormente, existen algunos escenarios más avanzados para aplicar este tipo de JOINs. Veamos dos ejemplos.

Cálculo de los totales de la carrera

Un JOIN no equitativo puede usarse para calcular un total continuo de una columna en particular. Por ejemplo, digamos que después de cada transacción completada, queremos saber el total de los honorarios del agente recibidos hasta el momento. Esta es la consulta SQL que podemos utilizar:

SELECT d1.date, d1.agent_fee, SUM(d2.agent_fee) AS total_agent_fee
FROM deals d1
JOIN deals d2
ON d1.date >= d2.date
GROUP BY d1.agent_fee, d1.date
ORDER BY d1.date;

Auto-unimos la tabla deals y utilizamos una condición non-equi JOIN para sumar todos los honorarios de los agentes recibidos hasta la fecha de la operación. Este es el resultado.

dateagent_feetotal_agent_fee
2020-01-30600.00600.00
2020-02-03350.00950.00
2020-03-12700.001650.00
2020-04-10450.002100.00

Tenga en cuenta que una mejor manera de calcular un total acumulado es utilizando funciones de ventana. Nuestra guía correspondiente explica lo que es un total en curso y cómo escribir una consulta SQL para calcularlo. Para practicar, consulte el curso interactivo LearnSQL.es Funciones de ventana.

Resolución de conflictos entre LEFT JOINs y WHERE

Los JOINs no-equi también pueden ser útiles en algunas situaciones cuando LEFT JOIN combinado con la sentencia WHERE no funciona como se pretende. En particular, a menudo ocurre que la condición WHERE "cancela" el LEFT JOIN, haciendo que funcione como un INNER JOIN en su lugar.

Por ejemplo, digamos que queremos listar todas las casas de nuestra base de datos junto con la fecha de la operación correspondiente, si es que ocurrió. También queremos tener en cuenta sólo las operaciones que se produjeron después del 1 de marzo.

Dado que estamos interesados en listar todas las casas, sin importar si tienen un acuerdo que coincida, utilizaremos un LEFT JOIN en nuestra consulta SQL. También añadiremos una condición WHERE para considerar sólo las operaciones realizadas después de una fecha determinada:

SELECT h.id, h.address, d.date
FROM houses h
LEFT JOIN deals d
ON h.id = d.house_id
WHERE d.date >= '2020-03-01';
idaddressdate
5Park Avenue, 102020-03-12
2Main Street, 122020-04-10

Como puede ver, el resultado no es exactamente lo que queríamos. La tabla incluye sólo las casas que se alquilaron después del 1 de marzo en lugar de todas las casas.

Una solución es mover la condición WHERE a ON y hacerla una condición JOIN. Esto será un JOIN no equitativo ya que utiliza un operador de comparación >=.

SELECT h.id, h.address, d.date
FROM houses h
LEFT JOIN deals d
ON h.id = d.house_id AND d.date >= '2020-03-01';
idaddressdate
5Park Avenue, 102020-03-12
2Main Street, 122020-04-10
6Little Street, 7NULL
4Nice Street, 3NULL
1Rose Street, 5NULL
3Rose Street, 5NULL
7Main Street, 8NULL

Ahora vemos todas las casas en el resultado, aunque no tengan tratos coincidentes.

¡Es hora de practicar los JOINs no-equitativos!

Ha aprendido que los JOINs no equitativos pueden ser muy útiles en diferentes escenarios. Puede listar pares únicos dentro de una tabla, identificar duplicados, unir tablas usando un rango de valores y fechas, calcular totales corridos sin usar funciones de ventana, y más.

Ahora, ¿cuál es la mejor manera de practicar Tipos de JOIN en SQL? Definitivamente, escribiendo código. Así que, ¡pasemos a los ejercicios interactivos!

El curso LearnSQL.es Tipos de JOIN en SQL cubre diferentes tipos de JOIN, incluyendo los JOINs no equitativos. Tendrá la oportunidad de practicar los JOINs no equitativos en varios casos de uso. Además, el curso completo SQL para principiantes curso ofrece práctica adicional sobre JOINs no-equi al explicar la consulta de más de una tabla y explorar temas más profundos sobre JOINs.

¡Feliz aprendizaje!