Al terminar, podrás
- Decidir qué columnas deben tener la misma función antes de usar
UNION ALL. - Crear una etiqueta con
CASEdentro de cada consulta sin mezclar reglas de tablas distintas. - Aplicar
LOWER()para presentar texto con un formato común. - Comprobar el resultado compuesto antes de dar una consulta por terminada.
Recupera lo aprendido: ¿Por qué los dos SELECT de UNION ALL deben tener el mismo número de columnas?
La idea clave: diseña primero la forma del resultado
Cuando combinas consultas no basta con que cada SELECT funcione por separado. Los dos bloques deben devolver el mismo número de columnas y cada posición debe representar el mismo tipo de dato o un tipo compatible. Por eso conviene empezar dibujando el resultado que quieres obtener.
Queremos tres columnas: origen, nombre y grupo. El origen identifica de qué tabla procede la persona, el nombre se presenta en minúsculas y el grupo aplica una regla distinta según la fuente.
Planifica antes de escribir
- Fija las columnas finales. Ambos bloques devolverán origen, nombre y grupo, en ese orden.
- Resuelve cada fuente por separado. En clientes, el grupo depende de la ciudad; en empleados, del departamento.
- Normaliza la presentación.
LOWER(nombre)evita que un bloque entregue nombres con un formato distinto al otro. - Combina al final. Usa
UNION ALLporque quieres conservar todas las filas de las dos fuentes. - Ordena el resultado compuesto. El
ORDER BYfinal debe describir cómo quieres leer el informe completo.
Ejemplo guiado: comprueba primero la estructura
Antes de añadir clasificaciones y funciones, verifica que los dos bloques producen columnas equivalentes:
SELECT 'cliente' AS origen, nombre
FROM clientes
WHERE ciudad = 'Madrid'
UNION ALL
SELECT 'empleado' AS origen, nombre
FROM empleados
WHERE departamento = 'Ventas'
ORDER BY origen, nombre;| origen | nombre |
|---|---|
| cliente | Ana Torres |
| cliente | Marta Ruiz |
| cliente | Noa Vidal |
| cliente | Pablo Sanz |
| empleado | Alex Ramos |
| empleado | Bea Molina |
| empleado | Ismael Díaz |
Las dos consultas devuelven exactamente dos columnas con el mismo significado. Esa comprobación reduce mucho los errores cuando después añades expresiones más largas.
Un error habitual
Aplicar una regla después de perder su contexto
SELECT ...,
CASE WHEN ciudad = 'Madrid'
THEN 'prioridad'
ELSE 'resto'
END AS grupo
FROM clientes
UNION ALL
SELECT ...,
CASE WHEN departamento = 'Ventas'
THEN 'prioridad'
ELSE 'resto'
END AS grupo
FROM empleados;Si primero mezclas datos de clientes y empleados y después intentas evaluar ciudad o departamento, esas columnas ya no forman parte de una estructura común. Calcula el CASE dentro del bloque que conoce esa columna y combina después el valor resultante.
Practica con datos
Laboratorio SQL
Construye un directorio priorizado
Combina con UNION ALL todos los clientes y empleados. Devuelve origen ('cliente' o 'empleado'), nombre en minúsculas y grupo ('prioridad' para clientes de Madrid o empleados de Ventas, y 'resto' en los demás casos). Ordena por grupo, origen y nombre.
Resultado esperado: 22 filas con origen, nombre y grupo; 7 de prioridad y 15 del resto, ordenadas por grupo, origen y nombre.
Ver tablas y datos
Cargando la estructura del ejercicio…
Escribe primero el bloque de clientes con tres columnas: una constante para origen, LOWER(nombre) y un CASE para ciudad.
El segundo SELECT debe devolver las mismas tres posiciones, pero su CASE evalúa departamento = 'Ventas'.
Une con UNION ALL y coloca ORDER BY grupo, origen, nombre al final de toda la consulta.
Solución
SELECT 'cliente' AS origen,
LOWER(nombre) AS nombre,
CASE WHEN ciudad = 'Madrid'
THEN 'prioridad'
ELSE 'resto'
END AS grupo
FROM clientes
UNION ALL
SELECT 'empleado' AS origen,
LOWER(nombre) AS nombre,
CASE WHEN departamento = 'Ventas'
THEN 'prioridad'
ELSE 'resto'
END AS grupo
FROM empleados
ORDER BY grupo, origen, nombre;Cada bloque crea primero la misma estructura. CASE usa la regla propia de su tabla, LOWER() normaliza la salida y el ORDER BY final organiza el resultado compuesto completo.
Puedes consultar la solución y volver a intentarlo. La práctica se completa cuando tu consulta funciona.
La consulta usa datos ficticios y se ejecuta solo en este navegador.
Ronda autónoma: cambia la regla, conserva la estructura
Crea un directorio por área
Devuelve tipo, nombre y area. Para clientes, area será su ciudad; para empleados, su departamento. Convierte los nombres a mayúsculas con UPPER(), conserva todas las filas con UNION ALL y ordena por tipo y nombre.
Ver una pista
Las columnas ciudad y departamento tienen nombres distintos, pero en el resultado cumplen la misma función. El alias area puede definirse en el primer SELECT.
Ver una solución posible
SELECT 'cliente' AS tipo,
UPPER(nombre) AS nombre,
ciudad AS area
FROM clientes
UNION ALL
SELECT 'empleado',
UPPER(nombre),
departamento
FROM empleados
ORDER BY tipo, nombre;Lo importante es que cada posición conserve el mismo significado: tipo, nombre y área.
Si te bloqueas, vuelve a la pregunta “¿filas o columnas?”
- Si necesitas añadir columnas de tablas relacionadas, probablemente estás ante un JOIN.
- Si necesitas apilar filas que comparten una estructura, repasa UNION y UNION ALL.
- Si una columna depende de una condición, repasa CASE.
- Si solo quieres cambiar cómo se presenta un texto, vuelve a funciones de texto y fechas.
Separar estas decisiones evita consultas difíciles de leer: primero define la forma, después calcula cada columna y solo al final combina.
Fuentes técnicas consultadas
La práctica utiliza un subconjunto común y contrastado en documentación oficial. En particular, UNION ALL conserva las filas de ambos bloques; CASE es una expresión condicional; y LOWER() transforma texto según las reglas de cada motor.
- PostgreSQL 18: Combining Queries.
- PostgreSQL 18: Conditional Expressions.
- PostgreSQL 18: String Functions and Operators.
- SQLite: SELECT y consultas compuestas.
- MySQL 8.4: UNION Clause.
Comprueba si puedes explicarlo
Si una persona aparece como cliente y como empleado, ¿debemos eliminar una de las filas de este informe?
Ver respuesta razonada
No. Cada fila representa a una persona en un origen concreto. UNION ALL conserva ambas participaciones y origen permite distinguirlas. El criterio de duplicado depende de la pregunta.
Responde antes de abrir la explicación. Si necesitaste ayuda, cierra la respuesta y vuelve a explicarlo con tus palabras antes de dar la lección por aprendida.
Qué debes recordar
- Diseña primero las columnas finales y mantén el mismo significado en cada posición.
- Calcula las reglas específicas de cada fuente antes de combinar.
- Usa
UNION ALLcuando quieras conservar todas las filas. - Aplica el
ORDER BYal resultado compuesto, no a un bloque aislado. - Comprueba datos y orden: una consulta puede ser válida y aun así responder mal a la pregunta.