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

UNION y UNION ALL en SQL: Qué hacen y en qué se diferencian

En este artículo, exploraremos las cláusulas SQL UNION y UNION ALL. Aprende lo que hacen y cuando usar cada una.

Yo había sido analista durante probablemente cuatro años antes de conocer la cláusula SQL UNION ALL. Utilizaba UNION con regularidad, pero nunca había oído hablar de su homóloga. Un día oí a un compañero hablar de ella. Pensé: "¿De qué está hablando? ¿Es algo nuevo?" Así que hice lo que haría cualquier buen analista y lo busqué en Google. Me dio un vuelco el corazón. Probablemente, en más de una ocasión, había utilizado la cláusula incorrecta en mis análisis.

Después de la universidad, aprendí SQL por mi cuenta. El resultado fue una comprensión incompleta de la sintaxis que estaba utilizando. A medida que vayas aprendiendo, te recomiendo encarecidamente que tomes cursos formales para que puedas estar seguro de que tienes una comprensión completa de las consultas que estás escribiendo. Una gran manera de hacer esto es tomando el SQL para principiantes curso. No cometas los mismos errores que yo cometí al principio de mi carrera. Toma clases de profesionales y adquiere un sólido conocimiento básico de SQL.

Me estoy adelantando un poco. Demos un paso atrás y hablemos de lo que hacen UNION y UNION ALL en SQL.

UNIÓN

Habrá ocasiones en las que un analista necesite combinar los resultados de varias consultas. Esto puede deberse a que los datos se encuentran en diferentes tablas o a que ya existen consultas que ahora necesita convertir en una sola. Sea cual sea el motivo, la solución más sencilla es utilizar UNION. Veámoslo con un ejemplo.

Ejemplo nº 1 - UNION

En este ejemplo, imaginemos que estamos analizando los datos de un sitio web. Una de las tablas con las que trabajaremos se llama button_clicks. Esta tabla contiene todos los eventos de clic que estamos rastreando en nuestro sitio web. Su aspecto es el siguiente:

user_idtimestamplabel
1364782022-12-01 09:15:34continue
1364782022-12-01 09:15:34continue
1827362022-12-01 09:17:03submit
2736472022-12-01 09:18:00back
3475892022-12-01 09:21:48continue

También trabajaremos con una tabla llamada : navigation_clicks. Esta tabla contiene todos los eventos de clic que ocurren en el menú de navegación del sitio web. Su aspecto es el siguiente:

user_idtimestampnavigation_link
1364782022-12-01 09:10:15home
1364782022-12-01 09:12:12about_us
1827362022-12-01 09:17:59store
2736472022-12-01 09:21:30home
3475892022-12-01 09:18:17blog

Digamos que nuestro gerente viene a nosotros y dice que necesita una lista de todos los clics de botón en el sitio web. Eso es bastante fácil. Simplemente lo haremos:

SELECT *
FROM button_clicks

Sin embargo, vuelven unos minutos más tarde y nos piden que incluyamos los clics de navegación en nuestro informe. Parece sencillo, pero ¿cómo lo hacemos? Utilizando la cláusula UNION. Para combinar los resultados de estas dos consultas, vamos a ejecutar:

SELECT *
FROM button_clicks
	
	UNION

SELECT *
FROM navigation_clicks

Como puede ver, la cláusula UNION va entre las dos consultas SELECT. La consulta a cada lado de la cláusula UNION debe ejecutarse como una consulta independiente. Esta consulta devolverá lo siguiente:

user_idtimestamplabel
1364782022-12-01 09:15:34continue
1827362022-12-01 09:17:03submit
2736472022-12-01 09:18:00back
3475892022-12-01 09:21:48continue
1364782022-12-01 09:10:15home
1364782022-12-01 09:12:12about_us
1827362022-12-01 09:17:59store
2736472022-12-01 09:21:30home
3475892022-12-01 09:18:17blog

Lo que hemos hecho es tomar los resultados de dos consultas separadas y colocarlas una encima de la otra. Vemos que las primeras 4 filas contienen los resultados de la primera consulta y las siguientes 5 filas contienen los resultados de la segunda consulta.

Pero espera... nuestras tablas combinadas contienen 10 filas, ¿por qué sólo devolvemos 9? Esto se debe a que UNION eliminará los duplicados de los resultados. Las dos primeras filas de la tabla button_clicks son exactamente iguales, por lo que nuestro UNION sólo ha devuelto una de ellas.

Renombrar columnas en UNION

En el conjunto de resultados anterior, observe los nombres de las columnas. En la tabla button_clicks, la tercera columna es label, pero en la tabla navigation_clicks la tercera columna es navigation_label. Cuando utilicemos UNION, los nombres de las columnas provendrán de los nombres de las columnas de la primera consulta, que es lo que vemos arriba. Si quieres, siempre puedes añadir alias a las columnas para renombrarlas a tu gusto.

Por ejemplo, si queremos cambiar el nombre de la tercera columna a button_or_navigation_label, deberíamos ejecutar:

SELECT user_id, 
	 timestamp,
       label AS button_or_navigation_label
FROM button_clicks
	
	UNION

SELECT user_id, 
	 timestamp,
       navigation_label AS button_or_navigation_label
FROM navigation_clicks

Ejemplo #2 - Usando el mismo número de columnas en UNION

Veamos otro ejemplo utilizando UNION. Primero, haremos una pequeña modificación a nuestra tabla navigation_clicks tabla. Vamos a añadir una columna más para que nuestra tabla tenga este aspecto:

user_idtimestampnavigation_linknavigation_level
1364782022-12-01 09:10:15homemain
1364782022-12-01 09:12:12about_ussub
1827362022-12-01 09:17:59storesub
2736472022-12-01 09:21:30homemain
3475892022-12-01 09:18:17blogsub

Si intentamos ejecutar nuestra consulta original UNION de nuevo, obtendremos un error que dice Each UNION query must have the same number of columns. Esto se debe a que estamos seleccionando todas las columnas de cada tabla, pero el número de columnas de las tablas es ahora diferente. Para solucionarlo, tendremos que nombrar explícitamente las columnas que deseamos devolver. Además, el número de columnas devueltas por cada consulta debe ser el mismo y el tipo debe coincidir. Si la tercera columna de la primera consulta es una cadena, la tercera columna de la otra consulta también debe ser una cadena.

Para evitar errores, ejecutaremos:

SELECT user_id, 
 timestamp,
 label
FROM button_clicks
	
	UNION

SELECT user_id, 
 timestamp,
 	 navigation_label
FROM navigation_clicks

Esto devolverá los mismos resultados que nuestro primer ejemplo UNION.

Ejemplo nº 3 - UNION ALL

Ahora que entendemos UNION, veamos un ejemplo utilizando UNION ALL. Como se mencionó anteriormente, UNION elimina los duplicados de los resultados de la consulta. UNION ALL no hará esto.

Continuemos con nuestro ejemplo anterior. Nuestro director ha acudido a nosotros para pedirnos un informe que contenga todos los clics en botones y navegación del sitio web. A continuación, confirmamos que el informe debe incluir los duplicados.

Puesto que ya sabe cómo utilizar UNION, ¿puede adivinar cómo lo haríamos? Así es - simplemente sustituiremos UNION por UNION ALL:

SELECT user_id, 
 timestamp,
 label
FROM button_clicks
	
	UNION ALL

SELECT user_id, 
 timestamp,
 	 navigation_label
FROM navigation_clicks
user_idtimestamplabel
1364782022-12-01 09:15:34continue
1364782022-12-01 09:15:34continue
1827362022-12-01 09:17:03submit
2736472022-12-01 09:18:00back
3475892022-12-01 09:21:48continue
1364782022-12-01 09:10:15home
1364782022-12-01 09:12:12about_us
1827362022-12-01 09:17:59store
2736472022-12-01 09:21:30home
3475892022-12-01 09:18:17blog

Ahí están las 10 filas. Como puede ver, UNION ALL ha conservado todos los resultados, aunque haya duplicados.

Nuestros ejemplos sólo han incluido una sentencia UNION o UNION ALL, pero no hay límite en el número de consultas que se pueden unir.

Por último, supongamos que también queremos incluir una tabla llamada form_clicks. No nos preocupan los duplicados, así que seguiremos utilizando UNION ALL:

SELECT user_id, 
 timestamp,
 label
FROM button_clicks
	
	UNION ALL

SELECT user_id, 
 timestamp,
 	 navigation_label
FROM navigation_clicks

UNION ALL

SELECT user_id, 
 timestamp,
 	 form_label
FROM form_clicks

Como puede ver, se trata exactamente de la misma sintaxis; simplemente seguimos añadiendo a nuestra consulta existente. Si estás interesado en aprender más sobre UNION ALL, asegúrate de leer nuestro artículo SQL Union All.

UNION vs. UNION ALL - Cómo Elegir Cuál Usar

Es importante entender que una consulta que utilice UNION ALL se ejecutará más rápido que si utilizara UNION. Esto se debe a que la cláusula UNION ordena los datos y elimina los duplicados. Dependiendo de la cantidad de datos que estés consultando, esto podría añadir una buena cantidad de tiempo de ejecución a tu consulta.

Para decidir qué cláusula utilizar, basta con hacerse la siguiente pregunta:

  1. ¿Necesito eliminar valores duplicados?
    1. En caso afirmativo, utilice UNION.
    2. Si no (o si no importa), utilice UNION ALL.

Eso ha sido mucho, así que vamos a repasarlo un poco. Tanto UNION como UNION ALL son cláusulas utilizadas para combinar múltiples consultas en un conjunto de resultados. UNION eliminará los duplicados, mientras que UNION ALL no lo hará. UNION ALL se ejecuta más rápido debido a esto. Aquí hay otro gran artículo sobre Operaciones de Conjuntos SQL para ayudarte a reforzar y expandir lo que acabas de aprender.

¡Buen trabajo! Ahora tiene una comprensión firme tanto de UNION como de UNION ALL y puede tomar una decisión informada sobre cuál usar en sus análisis. ¡Ya estás varios pasos por delante de donde yo estaba cuando estaba aprendiendo! No deje de consultar nuestro SQL para principiantes y continúa tu viaje para convertirte en un experto escritor de SQL.