Aprende SQL

Combinando resultados: UNION, INTERSECT y EXCEPT

SQL permite combinar los resultados de dos o más consultas SELECT en uno solo. Esto es muy útil cuando necesitas unir datos de distintas consultas o comparar conjuntos de resultados.

Consulta A
Nintendo
Square Enix
Rockstar Games
Consulta B
Rockstar Games
FromSoftware
Valve
UNION
Nintendo Square Enix Rockstar Games FromSoftware Valve
Sin duplicados
INTERSECT
Rockstar Games
Solo en ambas
EXCEPT
Nintendo Square Enix
Solo en A

UNION

UNION combina los resultados de dos consultas y elimina duplicados automáticamente:

SELECT columnas FROM tabla1
UNION
SELECT columnas FROM tabla2;

Ambos SELECT deben tener el mismo número de columnas y tipos de datos compatibles. Por ejemplo, para obtener una lista de desarrolladores que tienen juegos antiguos o juegos largos:

SELECT developer FROM videogames WHERE year < 2000
UNION
SELECT developer FROM videogames WHERE playtime_hours > 50;

Rockstar Games aparece en ambas consultas, pero UNION lo muestra una sola vez:

Consulta A
Nintendo
Square Enix
Rockstar
UNION
Consulta B
Rockstar
FromSoftware
Valve
Resultado 5 filas
NintendoSquare EnixRockstarFromSoftwareValve
Todo, sin duplicados

UNION ALL

UNION ALL funciona igual pero conserva los duplicados. Es más rápido porque no necesita comparar filas:

SELECT developer FROM videogames WHERE year < 2000
UNION ALL
SELECT developer FROM videogames WHERE playtime_hours > 50;

Si un valor aparece en ambos SELECT, saldrá repetido en el resultado. Usa UNION ALL cuando los duplicados no importen o cuando estés seguro de que no habrá:

Consulta A
Nintendo
Square Enix
Rockstar
UNION ALL
Consulta B
Rockstar
FromSoftware
Valve
Resultado 6 filas
NintendoSquare EnixRockstarRockstarFromSoftwareValve
Todo, con duplicados

INTERSECT

INTERSECT devuelve solo las filas que aparecen en ambos resultados:

SELECT developer FROM videogames WHERE year < 2015
INTERSECT
SELECT developer FROM videogames WHERE playtime_hours > 50;

Esto devuelve los desarrolladores que tienen juegos anteriores a 2015 y también juegos con más de 50 horas de juego. Solo los que están en las dos consultas a la vez:

Consulta A
Nintendo
Square Enix
Rockstar
INTERSECT
Consulta B
Rockstar
FromSoftware
Valve
Resultado 1 fila
Rockstar
Solo lo que está en ambas

EXCEPT

EXCEPT devuelve las filas del primer SELECT que no están en el segundo:

SELECT developer FROM videogames WHERE year < 2015
EXCEPT
SELECT developer FROM videogames WHERE playtime_hours > 50;

Esto devuelve los desarrolladores con juegos anteriores a 2015, excluyendo los que también tienen juegos con más de 50 horas. Se descarta todo lo que aparece en B:

Consulta A
Nintendo
Square Enix
Rockstar
EXCEPT
Consulta B
Rockstar
FromSoftware
Valve
Resultado 2 filas
NintendoSquare Enix
En A pero no en B

Reglas clave

  • Todos los SELECT deben tener el mismo número de columnas.
  • Los tipos de datos deben ser compatibles entre sí.
  • UNION elimina duplicados; UNION ALL los mantiene.
  • El ORDER BY va al final de todo y ordena el resultado combinado.
  • Los nombres de columna se toman del primer SELECT.

ORDER BY con UNION

Si quieres ordenar el resultado combinado, coloca ORDER BY al final:

SELECT title, year FROM videogames WHERE year < 2000
UNION
SELECT title, year FROM videogames WHERE year > 2015
ORDER BY year;

El ORDER BY no puede ir dentro de los SELECT individuales, solo al final.

Nuestra tabla

Nombre de la Tabla: videogames
idtitledeveloperyearplaytime_hours
1The Legend of ZeldaNintendo198620
2Super Mario Bros.Nintendo198510
3Final Fantasy VIISquare Enix199740
4The Witcher 3CD Projekt Red2015100
5MinecraftMojang Studios20119999
6Grand Theft Auto VRockstar Games201380
7Dark SoulsFromSoftware201160
8Portal 2Valve20118
9Red Dead Redemption 2Rockstar Games201870
10The Last of UsNaughty Dog201315
11Halo: Combat EvolvedBungie200110
12God of WarSanta Monica Studio201825

Ejercicios