Usando los operadores SET (Conjunto)

Anuncio
Parcial II: 2
Lección 15
Usando los operadores SET (Conjunto)
Objetivos del capítulo
• Describir los operadores SET (Conjunto)
• Usar un operador SET (Conjunto) para combinar múltiples consultas en
una consulta simple
• Controlar el orden de las filas obtenidas
Operadores SET (Conjunto)
Los operadores SET (Conjunto) combinan los resultados de dos o más
consultas en un único resultado. Las consultas que contienen operadores SET
(Conjunto) son llamadas consultas compuestas (compound queries).
Operador
UNION
UNION ALL
INTERSECT
MINUS
Obtiene
Todas las filas distintas seleccionadas por ambas consultas
Todas las filas seleccionadas por ambas consultas,
incluyendo todos los duplicados
Todas las filas distintas seleccionadas por ambas consultas
Todas las filas distintas seleccionadas por la primera
sentencia SELECT que no se encuentren en la segunda
sentencia SELECT
Todos los operadores SET tienen la misma precedencia. Si una sentencia SQL
contiene múltiples operadores SET, el servidor de Oracle evalúa estos de
izquierda a derecha. Se puede hacer uso de los paréntesis para especificar un
orden explicito de evaluación como pueden ser las consultas que usan el
operador INTERSECT con operadores SET.
Nota: En el diagrama, el color claro representa el resultado de la consulta.
1
Parcial II: 2
Lección 15
Tablas usadas en este capítulo
• EMPLOYEES: Proporciona los detalles de todos los empleados actuales
• JOB_HISTORY: Registra los detalles de inicio y fin de los empleados en
cada puesto y el número de departamento en el que se cambio.
2
Parcial II: 2
Lección 15
Operador UNION
El operador UNION obtiene todas las filas seleccionadas por ambas consultas.
Use el operador UNION para obtener todas las filas de múltiples tablas y
eliminar cualquier fila duplicada.
Normas a seguir
• El número de columnas y tipo de datos deben ser idénticos en todas las
sentencias SELECT usadas en las consultas. Los nombres de las
columnas no necesitan ser idénticas.
• La UNION opera sobre todas las columnas inicialmente seleccionadas.
• Los valores NULOS no son ignorados durante la verificación de
duplicados
• El operador IN tiene una mayor precedencia que el operador UNION
• Por defecto, el resultado es ordenado ascendentemente por la primera
columna de la cláusula SELECT
3
Parcial II: 2
Lección 15
Usando el operador UNION
El operador UNION elimina cualquier registro duplicado. Si ahí registros
idénticos en las tablas EMPLOYEES y JOB_HISTORY los registros se
muestran una sola vez. Observe en el ejemplo anterior que el registro donde
EMPLOYEE_ID es igual a 200 aparece dos veces con un diferente JOB_ID en
cada fila.
Considere el siguiente ejemplo:
En el ejemplo anterior el empleado 200 aparece 3 veces, ¿Por qué? Note los
valores de DEPARTMENT_ID para el empleado 200. Una fila tiene un
DEPARTMENT_ID de 90, otro 10 y el tercero 90. Puesto que de esa
combinación única de JOB_ID y DEPARTMENT_ID, cada fila para el empleado
200 es única, por consiguiente no considera duplicados. Observe que el
resultado es clasificado en un orden ascendente de la primera columna de la
cláusula SELECT, EMPLOYEE_ID en este caso.
4
Parcial II: 2
Lección 15
Operador UNION ALL
Use el operador UNION ALL para obtener todas las filas de múltiples consultas.
Normas a seguir
• Diferente a UNION, las filas duplicadas no son eliminadas y el resultado
no es ordenado por defecto.
• La palabra reservada DISTINCT no puede ser usada
Nota: Con excepción de las normas anteriores, UNION y UNION ALL es lo
mismo.
5
Parcial II: 2
Lección 15
En el ejemplo anterior, 30 filas son seleccionadas. La combinación de las dos
tablas totaliza 30 filas. El operador UNION ALL no elimina filas duplicadas. Las
filas duplicadas se encuentran identificadas en el ejemplo anterior. UNION
obtiene todas las filas distintas seleccionadas por ambas consultas. UNION
ALL obtiene todas las filas seleccionadas por ambas consultas, incluyendo
todas las duplicadas. Considere la consulta del ejemplo anterior, pero ahora
con la cláusula UNION.
La consulta anterior obtiene 29 filas. Esto es debido a que se elimina la
siguiente fila que esta duplicada.
Operador INTERSECT
Use el operador INTERSECT para obtener todas las filas comunes de múltiples
consultas.
Normas a seguir
• El número de columnas y tipos de datos de las columnas seleccionadas
inicialmente por la sentencia SELECT, deben ser idénticos en todas las
6
Parcial II: 2
•
•
Lección 15
sentencias SELECT usadas en la consulta. El nombre de las consultas
no necesita ser idéntico.
Invertir el orden de las tablas intersectadas no modifica el resultado
INTERSECT no ignora los valores NULOS
En el ejemplo anterior, la consulta obtiene solo los registros que tienen los
mismos valores en las columnas seleccionadas de ambas tablas.
¿Cual puede ser el resultado si se añade la columna DEPARTMENT_ID en la
sentencia SELECT de la tabla EMPLOYEES y la columna DEPARTMENT_ID a
la sentencia SELECT de la tabla JOB_HISTORY y se ejecuta la consulta? El
resultado puede ser diferente por la introducción de otra columna cuyos valores
pueden o no ser duplicados.
Ejemplo
El empleado 200 no es parte del resultado puesto que el valor de
EMPLOYEES.DEPARTMENT_ID
es
diferente
del
valor
JOB_HISTORY.DEPARTMENT_ID.
7
Parcial II: 2
Lección 15
Operador MINUS
Use el operador MINUS para obtener las filas de la primera consulta que no
estén presentes en la segunda consulta (la primera sentencia SELECT MENOS
la segunda sentencia SELECT)
Normas a seguir
• El número de columnas y tipos de datos de las columnas de la sentencia
SELECT inicial deben ser idénticas en todas las sentencias SELECT
usadas en la consulta. Los nombres de las columnas no necesitan ser
idénticas.
• Todas las columnas en la cláusula WHERE deben estar en la cláusula
SELECT para que el operador MINUS trabaje.
8
Parcial II: 2
Lección 15
En el ejemplo anterior los identificadores de empleados y puestos en la tabla
JOB_HISTORY son restados de la tabla EMPLOYEES. EL resultado despliega
el resto de los empleados después de la resta; esto es representado por las
filas que existen en la tabla EMPLOYEES pero que no existen en la tabla
JOB_HISTORY.
Normas del operador SET (Conjunto)
• Las expresiones en las listas de las cláusulas SELECT de las consultas
deben corresponder en el número de elementos y tipo de datos. Las
consultas que usen los operadores de conjunto UNION, UNION ALL,
INTERSECT y MINUS en sus cláusulas WHERE deben tener el mismo
número y tipo de columnas que en su lista del SELECT. Por ejemplo:
•
•
•
La cláusula ORDER BY:
o Puede aparecer solamente hasta el final de la sentencia
o Puede aceptar el nombre de columnas, alias o notación posicional
El nombre de la columna o alias, si es usado en la cláusula ORDER BY,
debe ser el primero de la lista del SELECT
Los operadores SET pueden ser usados en sub consultas
9
Parcial II: 2
Lección 15
El servidor de Oracle y los operadores SET (Conjunto)
Cuando una consulta usa operadores SET, el servidor de Oracle elimina las
filas duplicadas automáticamente con excepción del caso del operador UNION
ALL. El nombre de las columnas resultantes se decide por la lista de columnas
de la primera sentencia SELECT. Por defecto, la salida es ordenada
ascendentemente por la primera columna de la cláusula SELECT.
Las expresiones correspondientes en la lista SELECT de las consultas deben
corresponder en el número de columnas y tipos de dato. Si los componentes de
la consulta seleccionan datos de tipo carácter, el tipo de dato de los valores
resultantes se determina como sigue:
• Si ambas consultas seleccionan valores del tipo de dato CHAR, el
resultado será un tipo de dato CHAR
• Si alguna o ambas consultas seleccionan valores del tipo de dato
VARCHAR2 el resultado será un tipo de dato VARCHAR2
Emparejando las sentencias SELECT
Como las expresiones en las listas seleccionadas de las consultas deben
corresponder en número, se puede hacer uso de columnas ficticias o vacías y
de las funciones de conversión de tipos de dato para cumplir con esta regla. En
el ejemplo anterior, el nombre location es dado como encabezado a una
columna ficticia. La función TO_NUMBER es usada en la primera consulta para
que el tipo de dato NUMBER de la columna LOCATION_ID recuperada por la
segunda consulta corresponda con la primera. De forma similar, la función
TO_DATE en la segunda consulta es usada para que el tipo de dato DATE de
la columna HIRE_DATE obtenida por la segunda consulta, corresponda con la
primera.
10
Parcial II: 2
Lección 15
Ejemplo
Las tablas EMPLOYEES y JOB_HISTORY tienen varias columnas en común;
por ejemplo EMPLOYEE_ID, JOB_ID y DEPARTMENT_ID. ¿Pero que sucede
si quieres una consulta para desplegar EMPLOYEE_ID, JOB_ID y SALARY
usando el operador UNION, conociendo que el salario solo existe en la tabla
EMPLOYEES?
El ejemplo anterior muestra como las columnas EMPLOYEE_ID y JOB_ID
corresponden en las tablas EMPLOYEES y JOB_HISTORY. Un valor literal de
0 es agregado a la sentencia SELECT de JOB_HISTORY para que la columna
numérica SALARY de la sentencia SELECT de EMPLOYEES corresponda.
En el resultado anterior, cada fila mostrada correspondiente a un registro de la
tabla JOB_HISTORY, contiene 0 en la columna SALARY.
11
Parcial II: 2
Lección 15
Controlando el orden de las filas
Por defecto, el resultado es ordenado ascendentemente por la primera
columna. Se puede usar la cláusula OREDER BY para cambiar esto.
Usando ORDER BY para ordenar filas
La cláusula ORDER BY puede ser usada solo en una de las consultas
compuestas. Si es usado, la cláusula ORDER BY debe ser puesta al final de la
consulta. La cláusula OREDER BY acepta el nombre de la columna, alias o
notación posicional. Sin una cláusula ORDER BY, el código del ejemplo
anterior produciría el siguiente resultado en el orden alfabético de la primera
columna:
Nota: Considere una consulta compuesta donde el operador UNION es usado
mas de una ocasión. En este caso la cláusula ORDER BY puede usar mejor
solo posiciones que expresiones explicitas.
12
Parcial II: 2
Lección 15
Resumen
En este capítulo se ha visto:
• El operador UNION obtiene todas las filas seleccionadas por ambas
consultas. Use el operador UNION para obtener todas las filas de
múltiples tablas y eliminar las filas duplicadas
• Use el operador UNION ALL para obtener todas las filas de múltiples
consultas. A diferencia del operador UNION, las filas duplicadas no son
eliminadas y el resultado no es ordenado
• Use el operador INTERSECT para obtener todas las filas comunes de
múltiples tablas
• Use el operador MINUS para obtener las filas de la primera consulta que
no estén presentes en la segunda consulta
• Recuerde usar la cláusula ORDER BY solo al final de la última sentencia
compuesta
• Asegúrese de que las expresiones correspondan en las listas de las
sentencias SELECT en el número y tipo de dato.
13
Descargar