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.
      SELECT WORKDEPT, MAX(SALARY) 
        FROM EMPLOYEE 
        GROUP BY WORKDEPT  
        HAVING MAX(SALARY) < (SELECT AVG(SALARY)
                                  FROM EMPLOYEE)
    La subconsulta de la cláusula HAVING sólo se ejecuta una sola vez en este ejemplo.
  • 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.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: 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