usando los operadores set (conjunto) una sentencia sql ... el servidor de oracle evalúa estos de...

13
Parcial II: 2 Lección 15 1 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 Obtiene UNION Todas las filas distintas seleccionadas por ambas consultas UNION ALL Todas las filas seleccionadas por ambas consultas, incluyendo todos los duplicados INTERSECT Todas las filas distintas seleccionadas por ambas consultas MINUS 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.

Upload: phungthuan

Post on 15-Jul-2018

231 views

Category:

Documents


0 download

TRANSCRIPT

Parcial II: 2 Lección 15

1

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 Obtiene UNION Todas las filas distintas seleccionadas por ambas consultas UNION ALL Todas las filas seleccionadas por ambas consultas,

incluyendo todos los duplicados INTERSECT Todas las filas distintas seleccionadas por ambas consultas

MINUS 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.

Parcial II: 2 Lección 15

2

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.

Parcial II: 2 Lección 15

3

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

Parcial II: 2 Lección 15

4

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.

Parcial II: 2 Lección 15

5

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.

Parcial II: 2 Lección 15

6

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

Parcial II: 2 Lección 15

7

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.

Parcial II: 2 Lección 15

8

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.

Parcial II: 2 Lección 15

9

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

Parcial II: 2 Lección 15

10

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.

Parcial II: 2 Lección 15

11

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.

Parcial II: 2 Lección 15

12

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.

Parcial II: 2 Lección 15

13

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.