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.
      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 (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