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.
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:
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á:
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:
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:
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.
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
| 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 |