Ejemplos de consultas de subselección
Los ejemplos siguientes ilustran la consulta de subselección.
- Ejemplo 1:
Selección de todas las columnas y filas de la tabla EMPLOYEE.
SELECT * FROM EMPLOYEE
- Ejemplo 2:
Una 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: Una las tablas EMPLOYEE y DEPARTMENT, seleccione
el número del 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 han nacido
(BIRTHDATE) con anterioridad a 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áximo y mínimo
(SALARY) de cada grupo de filas con el mismo código de trabajo en la tabla
EMPLOYEE, pero sólo para los grupos con más de una fila y con un salario
máximo mayor o igual que 27000.
SELECT JOB, MIN(SALARY), MAX(SALARY) FROM EMPLOYEE GROUP BY JOB HAVING COUNT(*) > 1 AND MAX(SALARY) >= 27000
- Ejemplo 5: Seleccionar todas las filas de la tabla EMP_ACT para los empleados (EMPNO) del 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 (SALARY) máximo del departamento para todos los departamentos
cuyo salario máximo sea menor que el 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 (SALARY) máximo del departamento para todos los departamentos
cuyo salario máximo sea menor que el salario medio de 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 de lo que sucede en el 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.DEPTNO
La 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:
Consultar la tabla EMP_ACT y devolver el número de los proyectos que tengan un empleado cuyo salario se encuentre entre los 10 más altos 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