Ejemplos de consultas de subselección
Los ejemplos siguientes ilustran la consulta de subselección.
- Ejemplo 1: Seleccione todas las columnas y filas de la tabla EMPLOYEE.
SELECT * FROM EMPLOYEE - Ejemplo 2: Únase a las tablas EMP_ACT y EMPLOYEE, seleccione todas las columnas de la tabla EMP_ACT y añada el apellido del empleado (LASTNAME) de la tabla EMPLOYEE a cada fila del resultado.
SELECT EMP_ACT.*, LASTNAME FROM EMP_ACT, EMPLOYEE WHERE EMP_ACT.EMPNO = EMPLOYEE.EMPNO - Ejemplo 3: Únase a las tablas EMPLOYEE y DEPARTMENT, seleccione el número de empleado (EMPNO), el apellido de empleado (LASTNAME), el número de departamento (WORKDEPT en la tabla EMPLOYEE y DEPTNO en la tabla DEPARTMENT) y el nombre de departamento (DEPTNAME) de todos los empleados que hayan nacido (BORN) antes de 1955.
SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME FROM EMPLOYEE, DEPARTMENT WHERE WORKDEPT = DEPTNO AND YEAR(BIRTHDATE) < 1955 - Ejemplo 4: Seleccione el trabajo (JOB) y los salarios mínimo y máximo (SALARY) para cada grupo de filas con el mismo código de trabajo en la tabla EMPLOYEE, pero sólo para grupos con más de una fila y con un salario máximo superior o igual a 27000.
SELECT JOB, MIN(SALARY), MAX(SALARY) FROM EMPLOYEE GROUP BY JOB HAVING COUNT(*) > 1 AND MAX(SALARY) >= 27000 - Ejemplo 5: Seleccione todas las filas de la tabla EMP_ACT para los empleados (EMPNO) en el departamento (WORKDEPT) 'E11'. (Los números del departamento del empleado se muestran en la tabla EMPLOYEE.)
SELECT * FROM EMP_ACT WHERE EMPNO IN (SELECT EMPNO FROM EMPLOYEE WHERE WORKDEPT = 'E11') - Ejemplo 6: En la tabla EMPLOYEE, seleccione el número de departamento (WORKDEPT) y el salario máximo departamental (SALARY) para todos los departamentos cuyo salario máximo sea inferior al salario medio de todos los empleados.
La subconsulta de la cláusula HAVING sólo se ejecuta una sola vez en este ejemplo.SELECT WORKDEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY WORKDEPT HAVING MAX(SALARY) < (SELECT AVG(SALARY) FROM EMPLOYEE) - Ejemplo 7: Utilizando la tabla EMPLOYEE, seleccione el número de departamento (WORKDEPT) y el salario máximo departamental (SALARY) para todos los departamentos cuyo salario máximo sea inferior al salario medio en todos los demás departamentos.
SELECT WORKDEPT, MAX(SALARY) FROM EMPLOYEE EMP_COR GROUP BY WORKDEPT HAVING MAX(SALARY) < (SELECT AVG(SALARY) FROM EMPLOYEE WHERE NOT WORKDEPT = EMP_COR.WORKDEPT)A diferencia del Ejemplo 6, la subconsulta de la cláusula HAVING se ejecuta para cada grupo.
- Ejemplo 8: Determine el número de empleado y el salario de los representantes de ventas junto con el salario medio y cuenta punta de sus departamentos.Esta consulta primero debe crear una expresión de tabla anidada (DINFO) para obtener las columnas AVGSALARY y EMPCOUNT y la columna DEPTNO que se utiliza en la cláusula WHERE.
SELECT THIS_EMP.EMPNO, THIS_EMP.SALARY, DINFO.AVGSALARY, DINFO.EMPCOUNT FROM EMPLOYEE THIS_EMP, (SELECT OTHERS.WORKDEPT AS DEPTNO, AVG(OTHERS.SALARY) AS AVGSALARY, COUNT(*) AS EMPCOUNT FROM EMPLOYEE OTHERS GROUP BY OTHERS.WORKDEPT ) AS DINFO WHERE THIS_EMP.JOB = 'SALESREP' AND THIS_EMP.WORKDEPT = DINFO.DEPTNOLa utilización de una expresión de tabla anidada para este caso ahorra los recursos de proceso que implica la creación de la vista DIFO como una vista normal. Durante la preparación de la sentencia, se evita el acceso al catálogo para la vista y, debido al contexto del resto de la consulta, la vista sólo considera las filas para el departamento de representantes de ventas.
- Ejemplo 9: Visualice el nivel de formación medio y el salario de 5 grupos de empleados al azar.Esta consulta necesita la utilización de una expresión de tabla anidada para establecer el valor aleatorio de cada empleado para que pueda utilizarse posteriormente en la cláusula GROUP BY.
SELECT RANDID , AVG(EDLEVEL), AVG(SALARY) FROM ( SELECT EDLEVEL, SALARY, INTEGER(RAND()*5) AS RANDID FROM EMPLOYEE ) AS EMPRAND GROUP BY RANDID - Ejemplo 10: Consulte la tabla EMP_ACT y devuelva los números de proyecto que tienen un empleado cuyo salario está entre los 10 primeros de todos los empleados.
SELECT EMP_ACT.EMPNO,PROJNO FROM EMP_ACT WHERE EMP_ACT.EMPNO IN (SELECT EMPLOYEE.EMPNO FROM EMPLOYEE ORDER BY SALARY DESC FETCH FIRST 10 ROWS ONLY) - Ejemplo 11: Partiendo de que PHONES e IDS son dos variables de SQL con valores de matriz de la misma cardinalidad, convierta estas matrices en una tabla con tres columnas (una por cada matriz y una por la posición) y una fila por elemento de la matriz.
SELECT T.PHONE, T.ID, T.INDEX FROM UNNEST(PHONES, IDS) WITH ORDINALITY AS T(PHONE, ID, INDEX) ORDER BY T.INDEX