Como se revisó de manera general, existen diversos operadores de conjuntos en SQL, pero en este artículo se detallará el primero operador, que es el UNION y UNION ALL del SELECT en SQL.
Datos de prueba para probar el operador UNION
Vamos a crear 3 tablas con algunos registros para poder hacer las pruebas y demostración de este operador de conjuntos.
CREATE TABLE A ( numero numeric NOT NULL, texto char(40) NOT NULL, fecha datetime PRIMARY KEY (numero) ); CREATE TABLE B ( numero numeric NOT NULL, texto char(40) NOT NULL, fecha datetime PRIMARY KEY (numero) ); CREATE TABLE C ( numero numeric NOT NULL, texto char(40) NOT NULL, fecha datetime PRIMARY KEY (numero) ); INSERT INTO A VALUES ('1','UNO' ,'2018-01-01 00:00:00.000'); INSERT INTO A VALUES ('2','DOS' ,'2018-02-01 00:00:00.000'); INSERT INTO A VALUES ('3','TRES' ,'2018-03-01 00:00:00.000'); INSERT INTO A VALUES ('4','CUATRO','2018-04-01 00:00:00.000'); INSERT INTO A VALUES ('5','CINCO' ,'2018-05-01 00:00:00.000'); INSERT INTO A VALUES ('6','SEIS' ,'2018-06-01 00:00:00.000'); INSERT INTO B VALUES ('1','UNO' ,'2018-01-01 00:00:00.000'); INSERT INTO B VALUES ('2','DOS' ,'2018-02-02 00:00:00.000'); INSERT INTO B VALUES ('3','III' ,'2018-03-03 00:00:00.000'); INSERT INTO B VALUES ('44','XLIV','2018-04-04 00:00:00.000'); INSERT INTO B VALUES ('54','LIV' ,'2018-05-05 00:00:00.000'); INSERT INTO B VALUES ('64','LXIV','2018-06-06 00:00:00.000'); INSERT INTO C VALUES ('11','11' ,'2018-01-11 00:00:00.000'); INSERT INTO C VALUES ('21','21' ,'2018-02-21 00:00:00.000'); INSERT INTO C VALUES ('31','31' ,'2018-03-31 00:00:00.000'); INSERT INTO C VALUES ('44','XLIV','2018-04-04 00:00:00.000'); INSERT INTO C VALUES ('54','LIV' ,'2018-05-05 00:00:00.000'); INSERT INTO C VALUES ('64','LXIV','2018-06-06 00:00:00.000');
Las tablas quedarán como se muestra a continuación
UNION y UNION ALL
Estos operadores permiten unir los registros de dos tablas, de tal manera que se tenga la totalidad de los registros de las dos tablas, pudiendo duplicar los registros (UNION ALL) o eliminando los duplicados (UNION)
UNION ALL
Para hacer la unión de dos tablas, se tiene que ejecutar el siguiente query
Primer SELECT
UNION ALL
Segundo SELECT;
Esta instrucción ejecutará el primer SELECT y le añadirá -al final- los registros resultantes del segundo SELECT. Para ejecutar esto los dos query’s deben tener la misma cantidad de campos y deben ser del mismo tipo, de tal manera que se puedan unir los registros de ambas instrucciones SELECT.
Utilizando las tablas que se crearon con las instrucciones SQL del inicio, se podrán unir los registros de dos tablas con la siguiente instrucción
SELECT * FROM a
UNION ALL
SELECT * FROM b;
El UNION ALL lo que hará es tomar todos los registros de la tabla A más todos los registros de la tabla B, y el resultado se dará en un solo conjunto de datos. En el UNION ALL el resultado final el número de registros totales será la suma de los registros de la primera tabla más el número de registros de la segunda tabla, de tal suerte que este query resultará en 12 registros finales (6 de la tabla A y 6 de la tabla B) tal y como se muestra a continuación
Si bien se puede utilizar un SELECT * (que no es lo recomendable) se puede escribir el query nombrando los campos que se requieren de cada tabla, siempre cuidando que el número de campos sea el mismo, y que el tipo de datos sea compatible entre si, por ejemplo:
SELECT texto, numero FROM a
UNION ALL
SELECT texto, numero FROM b
El resultado de este query es el siguiente:
UNION
Este es otro tipo de unión de tablas pero, a diferencia del UNION ALL, el UNION hace una verificación de los datos de las tablas a unir y verifica que no haya registros duplicados.
Para saber si dos registros están duplicados tienen que coincidir todos los campos de cada query y si soy iguales entonces solo se deja un registro en lugar de dos.
Probando con los mismos querys de prueba del UNION ALL, pero utilizando UNION quedará como
-- Primer ejemplo
SELECT * FROM a
UNION
SELECT * FROM b;
-- Segundo ejemplo
SELECT texto, numero FROM a
UNION
SELECT texto, numero FROM b;
Comparación de UNION y UNION ALL
Si bien la decisión de usar UNION o UNION ALL depende de la necesidad del usuario (si quiere o no los duplicados) el UNION ALL siempre será más rápido que el UNION porque el segundo tiene que hacer una validación al final para comparar todos los registros de un query y compararlos con los del segundo para comparar todos los campos de cada query y validar que no haya dos registros completamente iguales.
Esto se puede ver claramente al ejecutar dos querys (uno con UNION y el otro con UNION ALL) y viendo el costo de los planes de ejecución.