Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


Intro a SQL y MySQL - Tema 12 - Union

12.1. Unión de dos consultas

Se puede unir dos consultas en una, empleando la palabra "UNION". El requisito es que ambas consultas deben devolver campos "similares" (mismo nombre y tipo de datos). Como primer ejemplo (un tanto innecesario), podríamos crear una consulta que muestre las personas cuyo nombre contiene una "o" y aquellas cuyo nombre tiene una "e":

select nombre from persona
where nombre like '%o%'
union
select nombre from persona
where nombre like '%e%';

que mostraría como resultado:

+--------+
| nombre |
+--------+
| Jose   |
| Javier |
| Jesus  |
+--------+

(Como has podido observar, "Jose" no aparece repetido, porque el operador "UNION" elimina duplicados).

En este caso, el uso de "UNION" es poco razonable porque se trata de dos consultas casi idénticas, que se podían haber realizado simplemente con un "OR" y se obtendrá el mismo resultado (quizá en distinto orden, ya que no hemos utilizado "ORDER BY"):

select nombre from persona
where nombre like '%o%' 
or nombre like '%e%';

+--------+
| nombre |
+--------+
| Javier |
| Jesus  |
| Jose   |
+--------+

La verdadera utilidad de "UNION" aparece cuando se trabaja sobre conjuntos de datos diferentes, incluso distintas tablas. Por ejemplo, podríamos obtener los nombres de todos las personas y los de todas las capacidades en una misma consulta:

select nombre from persona
union
select nombre from capacidad;

que mostraría:

+-----------------+
| nombre          |
+-----------------+
| Javier          |
| Jesus           |
| Jose            |
| Juan            |
| Progr.C         |
| Progr.Java      |
| Progr.Pascal    |
| Bases datos SQL |
+-----------------+

E incluso se podrían mostrar datos originalmente muy distintos, si se renombran empleando un alias:

select concat('Persona: ', nombre) as detalle
from persona
union
select concat('Habilidad: ', upper(nombre)) as detalle
from capacidad;

+----------------------------+
| detalle                    |
+----------------------------+
| Persona: Javier            |
| Persona: Jesus             |
| Persona: Jose              |
| Persona: Juan              |
| Habilidad: PROGR.C         |
| Habilidad: PROGR.JAVA      |
| Habilidad: PROGR.PASCAL    |
| Habilidad: BASES DATOS SQL |
+----------------------------+

12.2. Imitando un FULL OUTER JOIN

En el apartado anterior comentábamos que la versión actual de MySQL no permite usar "full outer join" para mostrar todos los datos que hay en dos tablas enlazadas, aunque alguno de esos datos no tenga equivalencia en la otra tabla.

También decíamos que se podría imitar haciendo a la vez un "right join" y un "left join".

En general, tenemos la posibilidad de unir dos consultas en una usando "union", así:

select persona.nombre, capacidad.nombre
from persona right outer join capacidad
on persona.codcapac = capacidad.codigo
union
select persona.nombre, capacidad.nombre
from persona left outer join capacidad
on persona.codcapac = capacidad.codigo;

+--------+-----------------+
| nombre | nombre          |
+--------+-----------------+
| Javier | Progr.Pascal    |
| Juan   | Progr.C         |
| NULL   | Progr.Java      |
| NULL   | Bases datos SQL |
| Jesus  | NULL            |
| Jose   | NULL            |
+--------+-----------------+

Los datos no aparecen ordenados. Si se desea que lo estén, se puede incluir la "UNION" dentro de una subconsulta (será necesario usar un "alias" para la subconsulta), así:

select * from
(
select persona.nombre , capacidad.nombre habilidad
from persona right outer join capacidad
on persona.codcapac = capacidad.codigo
union
select persona.nombre, capacidad.nombre
from persona left outer join capacidad
on persona.codcapac = capacidad.codigo
) resultado
order by nombre;

+--------+-----------------+
| nombre | habilidad       |
+--------+-----------------+
| NULL   | Progr.Java      |
| NULL   | Bases datos SQL |
| Javier | Progr.Pascal    |
| Jesus  | NULL            |
| Jose   | NULL            |
| Juan   | Progr.C         |
+--------+-----------------+

(Como puedes ver, al ordenar resultados, los datos nulos aparecen antes de los que sí tienen valor).

Nota: en algunos gestores de bases de datos, podemos no sólo crear "uniones" entre dos tablas, sino también realizar otras operaciones habituales entre conjuntos, como calcular su intersección ("intersection") o ver qué elementos hay en la primera pero no en la segunda (diferencia, "difference"). Estas posibilidades no están disponibles en la versión actual de MySQL.

 

12.3. Ejercicios propuestos