Aprende SQL

Combinando resultados: UNION, INTERSECT y EXCEPT

Lección 02 · SQL avanzado

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.

Diagrama: “Consulta A” (Nintendo, Square Enix, Rockstar Games) y “Consulta B” (Rockstar Games, FromSoftware, Valve) → UNION (sin duplicados), INTERSECT (solo en ambas), EXCEPT (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:

Diagrama: Consulta A (Nintendo, Square Enix, Rockstar) + Consulta B (Rockstar, FromSoftware, Valve) → Resultado 5 filas (Nintendo, Square Enix, Rockstar, FromSoftware, Valve) — “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á:

Diagrama: Consulta A (Nintendo, Square Enix, Rockstar) + Consulta B (Rockstar, FromSoftware, Valve) → Resultado 6 filas (Nintendo, Square Enix, Rockstar, Rockstar, FromSoftware, Valve) — “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:

Diagrama: Consulta A + Consulta B → 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:

Diagrama: Consulta A + Consulta B → Resultado 2 filas (Nintendo, Square Enix) — “En A pero no en B”.

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.

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.

Nuestra tabla

Nombre de la Tabla: videogames

id title developer year playtime_hours
1 The Legend of Zelda Nintendo 1986 20
2 Super Mario Bros. Nintendo 1985 10
3 Final Fantasy VII Square Enix 1997 40
4 The Witcher 3 CD Projekt Red 2015 100
5 Minecraft Mojang Studios 2011 9999
6 Grand Theft Auto V Rockstar Games 2013 80
7 Dark Souls FromSoftware 2011 60
8 Portal 2 Valve 2011 8
9 Red Dead Redemption 2 Rockstar Games 2018 70
10 The Last of Us Naughty Dog 2013 15
11 Halo: Combat Evolved Bungie 2001 10
12 God of War Santa Monica Studio 2018 25

Tablas de esta lección

videogames5 cols

Estructura

🔑idINTEGERtitleTEXTdeveloperTEXTyearINTEGERplaytime_hoursINTEGER

Datos de ejemplo (5 filas)

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

Usa UNION para obtener una lista sin duplicados de todos los años anteriores a 2000 y posteriores a 2015. Muestra solo la columna year.

sql

Usa UNION ALL para combinar los títulos de juegos con más de 50 horas y los títulos de juegos publicados antes del 2000. ¿Hay duplicados?

sql

Usa INTERSECT para encontrar los desarrolladores que tienen juegos publicados entre 2010 y 2015 Y también juegos publicados después de 2015.

sql

Usa EXCEPT para encontrar los desarrolladores con juegos anteriores a 2015 que NO tengan juegos con más de 60 horas de juego.

sql