You are on page 1of 13

Parcial II: 2

Leccin 15

Usando los operadores SET (Conjunto)


Objetivos del captulo Describir los operadores SET (Conjunto) Usar un operador SET (Conjunto) para combinar mltiples 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 ms 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 mltiples operadores SET, el servidor de Oracle evala estos de izquierda a derecha. Se puede hacer uso de los parntesis para especificar un orden explicito de evaluacin 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

Leccin 15

Tablas usadas en este captulo 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 nmero de departamento en el que se cambio.

Parcial II: 2

Leccin 15

Operador UNION El operador UNION obtiene todas las filas seleccionadas por ambas consultas. Use el operador UNION para obtener todas las filas de mltiples tablas y eliminar cualquier fila duplicada. Normas a seguir El nmero de columnas y tipo de datos deben ser idnticos en todas las sentencias SELECT usadas en las consultas. Los nombres de las columnas no necesitan ser idnticas. La UNION opera sobre todas las columnas inicialmente seleccionadas. Los valores NULOS no son ignorados durante la verificacin 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 clusula SELECT

Parcial II: 2

Leccin 15

Usando el operador UNION El operador UNION elimina cualquier registro duplicado. Si ah registros idnticos 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 combinacin 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 clusula SELECT, EMPLOYEE_ID en este caso.

Parcial II: 2

Leccin 15

Operador UNION ALL Use el operador UNION ALL para obtener todas las filas de mltiples 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 excepcin de las normas anteriores, UNION y UNION ALL es lo mismo.

Parcial II: 2

Leccin 15

En el ejemplo anterior, 30 filas son seleccionadas. La combinacin 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 clusula 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 mltiples consultas. Normas a seguir El nmero de columnas y tipos de datos de las columnas seleccionadas inicialmente por la sentencia SELECT, deben ser idnticos en todas las 6

Parcial II: 2

Leccin 15

sentencias SELECT usadas en la consulta. El nombre de las consultas no necesita ser idntico. 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 aade 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 introduccin 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

Leccin 15

Operador MINUS Use el operador MINUS para obtener las filas de la primera consulta que no estn presentes en la segunda consulta (la primera sentencia SELECT MENOS la segunda sentencia SELECT) Normas a seguir El nmero de columnas y tipos de datos de las columnas de la sentencia SELECT inicial deben ser idnticas en todas las sentencias SELECT usadas en la consulta. Los nombres de las columnas no necesitan ser idnticas. Todas las columnas en la clusula WHERE deben estar en la clusula SELECT para que el operador MINUS trabaje.

Parcial II: 2

Leccin 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 despus 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 clusulas SELECT de las consultas deben corresponder en el nmero de elementos y tipo de datos. Las consultas que usen los operadores de conjunto UNION, UNION ALL, INTERSECT y MINUS en sus clusulas WHERE deben tener el mismo nmero y tipo de columnas que en su lista del SELECT. Por ejemplo:

La clusula ORDER BY: o Puede aparecer solamente hasta el final de la sentencia o Puede aceptar el nombre de columnas, alias o notacin posicional El nombre de la columna o alias, si es usado en la clusula ORDER BY, debe ser el primero de la lista del SELECT Los operadores SET pueden ser usados en sub consultas

Parcial II: 2

Leccin 15

El servidor de Oracle y los operadores SET (Conjunto) Cuando una consulta usa operadores SET, el servidor de Oracle elimina las filas duplicadas automticamente con excepcin 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 clusula SELECT. Las expresiones correspondientes en la lista SELECT de las consultas deben corresponder en el nmero de columnas y tipos de dato. Si los componentes de la consulta seleccionan datos de tipo carcter, 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 nmero, se puede hacer uso de columnas ficticias o vacas y de las funciones de conversin 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 funcin 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 funcin 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 Ejemplo

Leccin 15

Las tablas EMPLOYEES y JOB_HISTORY tienen varias columnas en comn; 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 numrica 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

Leccin 15

Controlando el orden de las filas Por defecto, el resultado es ordenado ascendentemente por la primera columna. Se puede usar la clusula OREDER BY para cambiar esto. Usando ORDER BY para ordenar filas La clusula ORDER BY puede ser usada solo en una de las consultas compuestas. Si es usado, la clusula ORDER BY debe ser puesta al final de la consulta. La clusula OREDER BY acepta el nombre de la columna, alias o notacin posicional. Sin una clusula ORDER BY, el cdigo del ejemplo anterior producira el siguiente resultado en el orden alfabtico de la primera columna:

Nota: Considere una consulta compuesta donde el operador UNION es usado mas de una ocasin. En este caso la clusula ORDER BY puede usar mejor solo posiciones que expresiones explicitas.

12

Parcial II: 2

Leccin 15

Resumen En este captulo se ha visto: El operador UNION obtiene todas las filas seleccionadas por ambas consultas. Use el operador UNION para obtener todas las filas de mltiples tablas y eliminar las filas duplicadas Use el operador UNION ALL para obtener todas las filas de mltiples 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 mltiples tablas Use el operador MINUS para obtener las filas de la primera consulta que no estn presentes en la segunda consulta Recuerde usar la clusula ORDER BY solo al final de la ltima sentencia compuesta Asegrese de que las expresiones correspondan en las listas de las sentencias SELECT en el nmero y tipo de dato.

13

You might also like