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
SELECTdeben tener el mismo número de columnas. - Los tipos de datos deben ser compatibles entre sí.
UNIONelimina duplicados;UNION ALLlos mantiene.- El
ORDER BYva 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
Estructura
Datos de ejemplo (5 filas)
| 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 |
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.
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?
Usa INTERSECT para encontrar los desarrolladores que tienen juegos publicados entre 2010 y 2015 Y también juegos publicados después de 2015.
Usa EXCEPT para encontrar los desarrolladores con juegos anteriores a 2015 que NO tengan juegos con más de 60 horas de juego.