• Saltar a la navegación principal
  • Saltar al contenido principal

DBA dixit

Recursos para el administrador y el desarrollador de bases de datos

  • Lo básico
  • SQL
  • Administración
  • Herramientas
  • Buenas prácticas
  • Performance & Tuning
Usted está aquí: Inicio / Buenas prácticas / UNION y UNION ALL

UNION y UNION ALL

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

3 tablas de prueba para el UNION y el UNION ALL

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

Ejemplo de UNION ALL

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:

Nuevo ejemplo de UNION ALL

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;

 

Ejemplo de UNION
Resultado del primer UNION
Resultado del segundo UNION

 

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.

Comparativo de planes de ejecución de UNION vs UNION ALL

 

 

Publicado en: Buenas prácticas, Lo básico, SQL

  • Lo básico
  • SQL
  • Administración
  • Herramientas
  • Buenas prácticas
  • Performance & Tuning

Copyright © 2025 · Wellness Pro on Genesis Framework · WordPress · Acceder