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

Una guía ilustrada de la unión no equitativa de SQL

¿Sabía que, en SQL, una unión no tiene por qué basarse en coincidencias idénticas? En este artículo, veremos la unión SQL no equi, que utiliza operadores "no iguales" para hacer coincidir los registros.

Ya hemos hablado de varios tipos de uniones, incluyendo las autouniones y las CROSS JOIN, INNER JOIN y OUTER JOIN. Estos tipos de uniones suelen aparecer con el signo de igualdad (=). Sin embargo, algunas uniones utilizan condiciones distintas al signo de igualdad (=). Este es un ejemplo de una unión no equi en SQL, y es de lo que hablaremos en este artículo.

¿Qué es un Non Equi Join en SQL?

Si ha leído los otros artículos de esta serie, ya sabe cómo utilizar las uniones SQL para combinar registros basados en coincidencias de valores exactos. ¿Pero qué pasa si busca un registro que no necesita una coincidencia exacta? Supongamos que quiere unir registros basándose en un rango de valores. O tal vez quiera todos los registros que no coincidan con algún valor. En estos casos, debe utilizar una unión SQL no equitativa.

Al igual que un self join, un SQL non equi join no tiene una palabra clave específica; nunca verá las palabras NON EQUI JOIN en el código SQL de nadie. En cambio, se definen por el tipo de operador en la condición de unión: cualquier cosa que no sea un signo de igualdad significa una unión no equi. Como verás en el cuadro siguiente, a veces el signo de igualdad forma parte del operador. Pero en una unión SQL no equi, nunca es el operador completo por sí mismo. A continuación, tenemos algunos operadores non equi join y sus significados:

Operator Meaning
“>” Greater than
“>=” Greater than or equal to
“<” Less than
“<=” Less than or equal to
“!=” Not equal to
”<>” Not equal to (ANSI Standard)
BETWEEN … AND Values in a range between x and y

Finalmente, es bueno saber que un SQL non equi join sólo puede ser usado con una o dos tablas.

Conociendo nuestros datos

Antes de comenzar a describir los non equi joins, vamos a familiarizarnos con algunos de los datos que vamos a utilizar. También revisaremos las uniones equi.

A continuación tenemos la tabla "person"que contiene los registros de las personas que participan en la compra de un apartamento (es decir, un condominio). Todas sus columnas se explican por sí mismas, pero fíjese en las columnas "min_price" y "max_price". Estas son el rango de precios de la persona para un apartamento. La columna "apartment_id" enlazará esta tabla con la tabla "apartment".

id first_name last_name rooms min_price max_price apartment_id
1 Anne Miller 2 40,000 150,000 2
2 John Harris 1 20,000 50,000 2
3 Michael Moore 2 200,000 300,000 6
4 Oliver Watson 4 30,000 100,000 7

La tabla "apartment" almacena información sobre los apartamentos, el número de habitaciones y la ciudad. Observe que los valores de la columna "id" son básicamente los mismos que los de la columna "apartment_id".

id rooms price city
1 2 30,000 Houston
2 2 45,000 Dallas
3 3 125,000 Chicago
4 5 245,000 Los Angeles
5 4 340,000 San Jose
6 4 220,000 San Diego
7 1 36,000 Cleveland

Ahora revisemos las uniones equis.

¿Qué es una unión equi de SQL?

La mayoría de las uniones SQL son uniones equis. Un equi join es cualquier operación JOIN que usa un signo de igual y sólo un signo de igual. Verá consultas que usan más de una condición de unión; si una condición es un signo igual y la otra no, se considera una unión no equi en SQL.

Como hemos dicho antes, las uniones equis necesitan una coincidencia exacta entre dos columnas. Echa un vistazo a la siguiente consulta:

SELECT first_name, last_name, price, city 
FROM person 
JOIN  apartment  ON   apartment.id = person.apartment_id ;

Esta consulta selecciona el nombre y el apellido del cliente, el precio del apartamento y la ciudad en la que se encuentra el apartamento. Utilizamos un JOIN (también conocido como INNER JOIN) para combinar los datos de las columnas "person" y "apartment". Esta unión sólo muestra los registros que pueden coincidir en ambas tablas. En la condición de unión, utilizamos el operador igual en la columna "apartment_id" de la tabla "person" y la columna "id" de la tabla "apartment" para encontrar una coincidencia exacta.

La tabla resultante contiene las siguientes filas:

first_name last_name price city
Anne Miller 30,000 Houston
John Harris 45,000 Dallas
Michael Moore 220,000 San Diego
Oliver Watson 36,000 Cleveland

Ya hemos visto cómo funciona un equi join. Ahora vamos a analizar las uniones SQL no equis.

Uso de una unión SQL no equi con dos tablas

SELECT first_name, last_name, min_price, max_price, price, city 
FROM person JOIN apartment ON apartment.id != person.apartment_id
    AND price BETWEEN min_price AND max_price
ORDER BY last_name;

Utilizamos el operador JOIN para combinar los registros de las tablas "person" y "apartment". Seleccionamos el nombre y el apellido de cada persona, los precios mínimos y máximos deseados, y el precio y la ciudad de todos los apartamentos no elegidos por el cliente. Utilizamos el operador BETWEEN... AND para cotejar los precios de los apartamentos. También utilizamos el operador "!=" en una condición con "apartment_id" de la tabla "person" y "id" de la tabla "apartment". Al hacerlo, eliminamos el apartamento elegido de la tabla de resultados.

La tabla resultante tiene el siguiente aspecto:

first_name last_name min_price max_price price city
John Harris 20,000 50,000 30,000 Houston
John Harris 20,000 50,000 36,000 Cleveland
Anne Miller 40,000 150,000 125,000 Chicago
Michael Moore 200,000 300,000 245,000 Los Angeles
Oliver Watson 30,000 100,000 45,000 Dallas
Oliver Watson 30,000 100,000 30,000 Houston

El apartamento de Dallas elegido por John Harris no aparece. Observe que podría haber elegido un piso en Houston (30.000 dólares) o en Cleveland (36.000 dólares). Ambos apartamentos entran en su rango de precios de 20.000 a 50.000 dólares.

SQL Non Equi Join en Self Join

Ahora vamos a ver cómo funciona un join SQL no equi cuando una tabla se une a sí misma. Nuestros ejemplos se basarán en la tabla "playing_cards" que se muestra a continuación. Contiene las siguientes columnas: "id" (un identificador interno), "rank" (el rango o valor facial de la carta), y "suit" (el palo de la carta).

id rank suit
1 A Hearts
2 A Spades
3 A Clubs
4 K Spades
5 K Diamonds
6 Q Clubs
7 J Spades

Estas son las cartas almacenadas en la tabla "playing_cards":

Tenga en cuenta que sólo tenemos siete cartas en el conjunto.

Veamos tres formas en las que podemos utilizar los non equi joins en estas circunstancias.

1. Encontrar todas las parejas de cartas

A partir del conjunto de cartas de la tabla "playing_cards", encontraremos todos los pares de cartas posibles.

Eche un vistazo a la consulta:

SELECT c1.rank, c1.suit, c2.rank,c2.suit
FROM playing_cards c1 
JOIN playing_cards c2 ON c1.id != c2.id 
ORDER BY c1.rank;

En la consulta anterior, hemos unido la tabla "playing_cards" a sí misma utilizando los alias c1 y c2. (Para más información sobre las autouniones y los alias, consulte nuestro artículo anterior.) A continuación, utilizamos el operador de desigualdad "!=", creando una unión SQL no equi, para obtener todos los pares de cartas posibles. Este operador muestra los pares de cartas en orden variable y elimina los pares de cartas idénticas al mismo tiempo.

La siguiente tabla muestra algunas de las filas resultantes. Hemos resaltado las filas que contienen pares duplicados.

rank suit rank suit
A Spades A Hearts
A Spades A Clubs
A Spades K Spades
A Spades K Diamonds
A Spades Q Clubs
A Spades J Spades
A Clubs A Hearts
A Clubs A Spades
A Clubs K Spades
A Clubs K Diamonds
A Clubs Q Clubs
A Clubs J Spades

Vemos los primeros 12 de un total de 42 registros. La imagen de abajo muestra estos pares seleccionados:

2. Eliminación de pares de cartas duplicados

Los pares de cartas devueltos por la última consulta no eran únicos porque el resultado de la consulta incluía pares mostrados en orden inverso, es decir, "As de picas con As de tréboles" y "As de tréboles con As de picas".

En la siguiente consulta, sólo devolveremos los pares únicos. La posición de las cartas en el par no importa.

SELECT c1.rank, c1.suit,c2.rank,c2.suit
FROM playing_cards c1 
JOIN playing_cards c2 ON c1.id < c2.id 
ORDER BY c1.rank;

Como ve, utilizamos una unión SQL no equi con el operador "<" en lugar de "!=". Como resultado, obtuvimos pares de tarjetas únicas.

Y estos son los resultados:

rank suit rank suit
A Spades A Hearts
A Clubs A Hearts
A Clubs A Spades
J Spades A Hearts
J Spades A Spades
J Spades A Clubs
J Spades K Spades
J Spades K Diamonds
J Spades Q Clubs
K Spades A Hearts
K Spades A Spades
K Spades A Clubs
K Diamonds A Hearts
K Diamonds A Spades
K Diamonds A Clubs
K Diamonds K Spades
Q Clubs A Hearts
Q Clubs A Spades
Q Clubs A Clubs
Q Clubs K Spades
Q Clubs K Diamonds

En este caso, 21 registros coincidían con la condición, y todos los pares resultantes aparecían una sola vez.

3. Encontrar pares de cartas con el mismo palo

En la siguiente consulta, seleccionaremos parejas únicas de cartas con el mismo palo (Corazones, Picas, Tréboles y Diamantes). ¿Puede encontrar el operador non equi que hemos utilizado?

SELECT c1.rank, c1.suit,c2.rank,c2.suit
FROM playing_cards c1 
JOIN playing_cards c2 ON c1.rank < c2.rank AND c1.suit = c2.suit ;

La consulta anterior utiliza dos condiciones: una que compara el "rango" de las cartas y otra que compara la columna "suit".

Observe el resultado de la consulta.

rank suit rank suit
A Spades K Spades
J Spades K Spades
A Clubs Q Clubs
A Spades J Spades

Sólo cuatro registros coinciden con las condiciones de JOIN. La situación se ilustra a continuación.

Más información sobre SQL

Ahora ya sabe lo que es una unión SQL no equitativa y cómo funciona. Si está interesado en aprender más sobre SQL, consulte los cursos de LearnSQL.es. Puedes practicar tus nuevos conocimientos con ejercicios interactivos. También puedes aprender más sobre las uniones SQL en nuestros posts, Uniones SQL y Aprendiendo Tipos de JOIN en SQL usando situaciones de la vida real.