UNION, INTERSECT, EXCEPT
Operaciones de conjuntos y comportamiento de deduplicación. Patrones prácticos de PostgreSQL para consultas de producción.
Receta
SELECT email FROM app.customers
UNION
SELECT contact_email FROM app.suppliers;
SELECT email FROM app.customers
INTERSECT
SELECT email FROM app.newsletter_subscribers;
SELECT email FROM app.customers
EXCEPT
SELECT email FROM app.unsubscribed;Cuándo usar esto: Este patrón aparece en SQL de aplicaciones o informes que mantienes.
Ejemplo práctico
SELECT email, 'customer' AS source FROM app.customers
UNION ALL
SELECT contact_email, 'supplier' FROM app.suppliers;Lo que esto demuestra:
- UNION elimina duplicados (costo de ordenación/hash para deduplicación)
- UNION ALL mantiene duplicados, es más rápido
- INTERSECT y EXCEPT comparan filas completas
Profundización
Compatibilidad
- Los recuentos y tipos de columnas deben coincidir; pueden ser necesarios casts.
- ORDER BY se aplica al resultado final; usa paréntesis externos.
- Se prefiere UNION ALL cuando los duplicados son imposibles o aceptables.
Errores comunes
- SELECT * en aplicaciones - Las nuevas columnas rompen los serializadores. Solución: Enumera las columnas explícitamente.
- Comparaciones NULL - = NULL siempre es desconocido. Solución: Usa IS NULL o IS DISTINCT FROM.
- Casts implícitos - Escaneos secuenciales inesperados en tipos no coincidentes. Solución: Haz coincidir los tipos de predicado con los tipos de columna.
- Consultas sin límites - Falta LIMIT en tablas grandes. Solución: Paginación o agregación intencional.
- Estadísticas obsoletas - Planes incorrectos después de una carga masiva. Solución: Ejecuta ANALYZE en las tablas afectadas.
Alternativas
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| Constructor de consultas ORM | El equipo se estandariza en una pila | El SQL complejo se vuelve opaco |
| Vista materializada | Repetir agregaciones costosas | Necesita estrategia de actualización |
| Réplica de almacén de datos | Escaneos pesados de BI | No para latencia OLTP |
Preguntas frecuentes
¿Debo formatear SQL en cadenas de aplicación?
Usa cadenas de plantilla multilínea o archivos SQL; usa lint en CI.
¿Cuándo es suficiente DISTINCT?
Cuando necesitas filas únicas sin agregaciones.
¿ORDER BY perjudica a los índices?
La ordenación puede usar el orden del índice si la consulta coincide con las columnas del índice.
Relacionado
- Conceptos básicos de consulta SQL - proyecciones
- Expresiones Comunes de Tabla - pipelines legibles
Versiones de la pila: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x y PostGIS 3.5+.