Está en la página 1de 6

7.

- SUBCO SLUTAS MULTICOLIM A


7.1.- Definicin 7.2.- Comparacin entre columnas 7.3.- Uso de una subconsulta en la clusula FROM 7.4.- Union entre dos SELECT

7.1.- DEFI ICI


Se usan para comparar dos o ms columnas de la QUERY a la SUBQUERY, y normalmente se escribe en la clusula where utilizando los operadores lgicos conocidos. Sintaxis: Select column1, column2,... From tabla Where (Column1, column ... ) in ( select column1, colimn2,... From tabla Where condicion)

Ejemplo: visualizar el nombre el numero de departamento el salario y la comisin de cualquier empleado cuyo salario y comisin se corresponden ambos con la comisin y el salario de cualquier empleado del departamento 30.

SELECT ENAME,DEPTNO, SAL, COMM FROM EMP WHERE (SAL, NVL(COMM,0)) IN (SELECT SAL, NVL(COMM,0) FROM EMP WHERE DEPTNO = 30)

## Las subconsultas ignoran los nulos pues, no tienen con que compararlos.

7.2.- COMPARACI E TRE COLUM AS.


PAIRWAISE: consiste en comparar simultneamente en la where las columnas las columnas que estn antes del operador con las que estn en las subconsulta. Un ejemplo de este tipo es el descrito anteriormente.

O PAIRWAIR: compara una columna que est antes del operador con otra que est dentro de la SUBQUERY y as continuamente. Ej: SELECT ENAME, DEPTNO, SAL, COMM FROM EMP WHERE SAL IN (SELECT SAL FROM EMP WHERE DEPTNO=30) AND NVL(COMM,0) IN (SELECT NVL(COMM,0) FROM EMP WHERE DEPTNO= 30);

7.3.- USO DE U A CO SULTA E LA CLAUSULA FROM.


Las subconsultas incluidas en la clusula from, son tratadas como si fueran tablas. Por lo que en la select principal se trata como si fuese una consulta de varias tablas (Joins) Ejemplo: visualizar los nombres los salarios , el numero de departamento y la media de todos los salarios por departamento de todos los empleados que cobran ms que la media de su departamento.

SQL> SELECT A.ENAME,A.SAL,A.DEPTNO,B.SALAVG 2 FROM EMP A, (SELECT DEPTNO,AVG(SAL) SALAVG 3 FROM EMP 4 GROUP BY DEPTNO) B 5 WHERE A.DEPTNO= B.DEPTNO 6 AND A.SAL > B.SALAVG;

SQL> SELECT DEPTNO,AVG(SAL) SALAVG 2 FROM EMP 3 GROUP BY DEPTNO;

7.4.- U IO E TRE DOS SELECT


Operaciones con conjuntos.

SQL permite tres tipos de operaciones con conjuntos:

UNION, disponible en todas las versiones de SQL minus, nuevo en SQL INTERSECT, nuevo en SQL

Para utilizar operaciones de conjuntos debemos cumplir una serie de normas.


Las consultas a unir deben tener el mismo nmero campos, y adems los campos deben ser del mismo tipo. Slo puede haber una nica clausula ORDER BY al final de la sentencia (2 SELECT), REFERIDA AL NOMBRE O ALIAS DE LOS CAMPOS DE LA PRIMERA SELECT,

UNION

U IO devuelve la suma de dos o ms conjuntos de resultados. El conjunto obtenido como resultado de U IO tiene la misma estructura que los conjuntos originales. El siguiente ejemplo muestra el uso de U IO
SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento FROM EMPLEADOS UNION SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento FROM CLIENTES

Cuando realizamos una consulta con U IO internamente se realiza una operacion DISTI CT sobre el conjunto de resultados final. Si queremos obtener todos los valores debemos utiliza U IO ALL.
SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento FROM EMPLEADOS UNION ALL SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento FROM CLIENTES
minus devuelve la diferencia (resta) de dos o ms conjuntos de resultados. El conjunto obtenido como resultado de minus tiene la misma estructura que los conjuntos originales.

El siguiente ejemplo muestra el uso de minus


SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento FROM EMPLEADOS minus SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento FROM CLIENTES

El uso de minus, como norma general, es mucho ms rpido que utilizar condiciones OT I o EXISTS en la clausula WHERE.
INTERSECT

Devuelve la interseccin entre dos o ms conjuntos de resultados en uno. El conjunto obtenido como resultado de I TERSECT tiene la misma estructura que los conjuntos originales. El siguiente ejemplo muestra el uso de I TERSECT
SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento FROM EMPLEADOS INTERSECT SELECT Nombre, Apellido1 , Apellido2, NifCif, FxNacimiento FROM CLIENTES

Se trata de unir dos select independientes Se utilizan dos clusulas UNION y UNION ALL Si especificamos la clusula U IO no aparecern dos veces los registros que estn repetidos , mientras que con la Clusula U IO ALL, si aparecern los registros repetidos.

Ejemplo. SELECT NOMEM, SALAR, 'SIN' "COMISION" FROM TEMPLE WHERE COMIS IS NULL AND NUMDE = 112

UNION SELECT NOMEM, SALAR + COMIS, ' CON' FROM TEMPLE WHERE COMIS IS NOT NULL AND NUMDE=112

SELECT NOMEM, SALAR, 'SIN' "COMISION" FROM TEMPLE WHERE COMIS IS NULL AND NUMDE = 112 UNION ALL SELECT NOMEM, SALAR + COMIS, ' CON' FROM TEMPLE WHERE COMIS IS NOT NULL AND NUMDE =112

CORRESPO DE CIAS E TRE JOI S Y SUBCO SULTAS: Normalmente cualquier consulta entre varias tablas se puede obtener de dos formas, bien combinando ambas tablas mediante un Join o bien como subconsultas. Para que esta correspondencia pueda darse es necesario que exista un EQUIJOIN, es decir que las claves principales de las tablas sean claves ajenas de otras. Se puede decir entonces que:

Si existe una condicin de EQUIJOIN, cualquier join se puede expresar como una subconsulta. Por lo tanto obtendremos el Mismo resultado en ambos casos. Ejemplo: A los departamentos que son directores en funciones se asignar una gratificacin de 5% del salario. Hallar por orden alfabtico los nombres de estos empleados y la gratificacin correspondiente a cada uno de ellos. COMO SUBCO SULTA: SELECT NOMEM, 0.05*SALAR FROM TEMPLE WHERE NUMEM IN (SELECT DIREC FROM TDEPTO WHERE TIDIR = 'F') ORDER BY NOMEM

COMO JOI :

SELECT NOMEM, 0.05* SALAR FROM TDEPTO D, TEMPLE E WHERE D. DIREC= E. NUMEM AND TIDIR = 'F' ORDER BY 1; La combinacin de tablas mediante subconsultas se le conoce con el nombre de consultas correlacionadas . es decir consultas a otras tablas las cuales devuelven un o unos valores a la consulta principal pues existe comunicacin entre alguna clave de las otras dos tablas. Ejemplo: obtener por orden alfabtico los nombres de los departamentos cuyo presupuesto es inferior a la mitad de la suma de los salarios anuales de sus empleados.

Solucin subordinada correlacionada: SELECT NOMDE FROM TDEPTO WHERE PRESU < (SELECT 0.5 * SUM (SALAR* 4)/ 1000 FROM TEMPLE WHERE NUMDE = TDEPTO. UMDE) ORDER BY 1

Solucin join correlacionado

SELECT NOMDE FROM TEMPLE, TDEPTO WHERE TEMPLE. UMDE=TDEPTO. UMDE GROUP BY TDEPTO.NUMDE, NOMDE, RESU HAVING PRESU< 0.5 * (SUM (SALAR* 4) / 1000) ORDER BY 1;

También podría gustarte