Cerrar

Enviar mensaje

twitter FaceBook You Tube Git Hub Docs.com Enviar email

Manual de SQL (Oracle SQL)

[10]
Consultas con operadores de conjuntos

Publicidad

[10.1] introducción

Estas consultas utilizan al menos dos SELECT cuyos resultados se pueden combinar para formar una única consulta. Se basan en los operadores matemáticos de conjuntos (unión, intersección y diferencia).

El funcionamiento es el mismo que con los conjuntos. Lo más importante a tener en cuenta es que en estas operaciones: el número de columnas, el tipo y el orden de dichas columnas debe de ser el mismo en todas las consultas que se combinan. Por ejemplo:

SELECT nombre FROM personas
UNION
SELECT edad FROM personas;

Este código daría lugar a un error, ya que las columnas nombre (normalmente de tipo VARCHAR2) y edad (normalmente de tipo NUMBER) no son del mismo tipo, lo que provocaría un error.

En este otro código:

SELECT nombre,edad FROM clientes
UNION
SELECT edad,nombre FROM socios;

Aunque ambas consultas a unir tienen las mismas columnas y del mismo tipo, no están el mismo orden por lo que tendremos un nuevo error.

[10.2] uniones

La palabra UNION permite añadir el resultado de un SELECT a otro SELECT. Para ello ambas instrucciones tienen que utilizar el mismo número y tipo de columnas. Ejemplo:

SELECT nombre FROM provincias
UNION
SELECT nombre FROM comunidades

El resultado es una tabla que contendrá nombres de provincia y de comunidades. Es decir, UNION, retorna una consulta en la que el resultado son las filas de ambas consultas.

[10.2.1]manejo de los duplicados en las uniones

El operador UNION une los resultados de varios SELECT. Pero si hay datos duplicados en ellos, elimina los mismos. Ejemplo:

SELECT nif, nombre,apellido1,apellido2 
FROM clientes
UNION
SELECT nif, nombre,apellido1,apellido2 
FROM socios;

Si hay alguna persona que es cliente y socio a la vez solo aparecería una vez.

Por ello SQL aporta otro operador, UNION ALL:

SELECT nif, nombre,apellido1,apellido2 
FROM clientes
UNION ALL
SELECT nif, nombre,apellido1,apellido2 
FROM socios;

El funcionamiento y uso es similar, pero UNION ALL no elimina los datos repetidos.

[10.3] intersecciones

De la misma forma, la palabra INTERSECT permite unir dos consultas SELECT de modo que el resultado serán las filas que estén presentes en ambas consultas.

Ejemplo; tipos y modelos de piezas que se encuentren sólo en los almacenes 1 y 2:

SELECT tipo,modelo FROM existencias
WHERE n_almacen=1 
INTERSECT
SELECT tipo,modelo FROM existencias
WHERE n_almacen=2

[10.4] diferencias

Con MINUS también se combinan dos consultas SELECT de forma que aparecerán los registros del primer SELECT que no estén presentes en el segundo.

Ejemplo; tipos y modelos de piezas que se encuentren el almacén 1 y no en el 2

SELECT tipo,modelo FROM existencias
WHERE n_almacen=1
MINUS
SELECT tipo,modelo FROM existencias
WHERE n_almacen=2;

[10.5] combinación de operaciones

Se pueden hacer varias combinaciones anidadas, lo que permite realizar consultas muy complejas. Para aclarar qué operaciones deseamos realizar primero es conveniente utilizar paréntesis. Ejemplo:

(SELECT tipo,modelo FROM existencias
WHERE n_almacen=1
INTERSECT
SELECT tipo,modelo FROM existencias
WHERE n_almacen=2)
MINUS
SELECT tipo,modelo FROM existencias
WHERE n_almacen=3;

Este código devuelve los tipos y modelos de piezas que están en los almacenes 1 y 2, pero no en el almacén número 3.

[10.6] ordenación de consultas combinadas

Si deseamos que el resultado de los operaciones UNION, INTERSECT o MINUS salga ordenado, hay que tener en cuenta que la cláusula ORDER BY se debe indicar al final de la instrucción. El problema es que el nombre de la columna puede ser distinto en los diferentes SELECT que usa la consulta, como en:

SELECT apellido1
FROM alumnos
UNION
SELECT apellido2
FROM alumnos;

La solución es utilizar el nombre dado a las columnas en el primer SELECT de la instrucción. Ejemplo:

SELECT apellido1
FROM alumnos
UNION
SELECT apellido2
FROM alumnos
ORDER BY apellido1;

No funcionaría este otro código:

SELECT apellido1
FROM alumnos
UNION
SELECT apellido2
FROM alumnos
ORDER BY apellido2; //error

También, como siempre, podemos indicar el número de la columna por la que deseamos ordenar:

SELECT apellido1
FROM alumnos
UNION
SELECT apellido2
FROM alumnos
ORDER BY 1;

Además, hay que tener muy en cuente que la cláusula ORDER BY solo se puede utilizar al final de todos los SELECT que se han combinado. Es incorrecto el código:

SELECT nif, nombre,apellido1,apellido2 
FROM clientes
ORDER BY apellido1,apellido2,nombre --Error
UNION ALL
SELECT nif, nombre,apellido1,apellido2 
FROM socios;

También lo es:

SELECT nif, nombre,apellido1,apellido2 
FROM clientes
ORDER BY apellido1,apellido2,nombre --Error
UNION ALL
SELECT nif, nombre,apellido1,apellido2 
FROM socios
ORDER BY apellido1,apellido2,nombre;

Solo es correcto:

SELECT nif, nombre,apellido1,apellido2 
FROM clientes
UNION ALL
SELECT nif, nombre,apellido1,apellido2 
FROM socios
ORDER BY apellido1,apellido2,nombre; --Correcto