子查询示例

以下示例说明了 susbelect 查询。

  • 示例1——选择雇员表中的所有列和行。
      SELECT * FROM EMPLOYEE
  • 示例 2 - 连接 EMP_ACT 和 EMPLOYEE 表,选择 EMP_ACT 表中的所有列,并将 EMPLOYEE 表中的员工姓氏(LASTNAME)添加到结果的每一行中。
       SELECT EMP_ACT.*, LASTNAME
         FROM EMP_ACT, EMPLOYEE
         WHERE EMP_ACT.EMPNO = EMPLOYEE.EMPNO
  • 示例 3 - 连接 EMPLOYEE 和 DEPARTMENT 表,选择所有出生日期(BIRTHDATE)早于 1955 年的员工的员工编号(EMPNO)、员工姓氏(LASTNAME)、部门编号(EMPLOYEE 表中的 WORKDEPT 和 DEPARTMENT 表中的 DEPTNO)和部门名称(DEPTNAME)。
      SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME 
         FROM EMPLOYEE, DEPARTMENT                     
         WHERE WORKDEPT = DEPTNO     
         AND YEAR(BIRTHDATE) < 1955
  • 示例4——在雇员表中,为具有相同职位代码的每组行选择职位(JOB)和最低及最高工资(SALARY),但仅限于多行且最高工资大于或等于27000的组。
       SELECT JOB, MIN(SALARY), MAX(SALARY)
         FROM EMPLOYEE
         GROUP BY JOB
         HAVING COUNT(*) > 1 
         AND MAX(SALARY) >= 27000
  • 示例 5 - 选择部门(WORKDEPT)为 E11 的员工(EMPNO)的 EMP_ACT 表的所有行。 (员工部门编号显示在 EMPLOYEE 表中。)
      SELECT *
        FROM EMP_ACT  
        WHERE EMPNO IN
                 (SELECT EMPNO 
                     FROM EMPLOYEE  
                     WHERE WORKDEPT = 'E11')
  • 示例 6 - 从雇员表中,选择部门编号(WORKDEPT)和部门最高工资(SALARY),这些部门的所有最高工资都低于所有雇员的平均工资。
      SELECT WORKDEPT, MAX(SALARY) 
        FROM EMPLOYEE 
        GROUP BY WORKDEPT  
        HAVING MAX(SALARY) < (SELECT AVG(SALARY)
                                  FROM EMPLOYEE)
    在这个例子中,HAVING子句中的子查询只运行一次。
  • 示例7——使用EMPLOYEE表,选择部门编号(WORKDEPT)和部门最高工资(SALARY),这些部门的所有最高工资均低于所有其他部门的平均工资。
      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)

    示例6 不同,HAVING子句中的子查询是针对每个组运行的。

  • 例8——确定销售代表的员工编号和工资,以及他们所在部门的平均工资和员工数量。
    此查询必须首先创建嵌套表表达式 (DINFO) 以获取 AVGSALARY 和 EMPCOUNT 列以及 WHERE 子句中使用的 DEPTNO 列。
     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

    将嵌套表表达式用于此案例会将创建 DINFO 视图的处理资源保存为常规视图。 在报表准备期间,避免访问目录视图。 由于查询其余部分的内容,视图仅考虑销售代表部门的行。

  • 示例9——显示五个随机员工组的平均教育水平和工资。
    此查询需要使用嵌套表表达式为每位员工设置一个随机值,以便以后在GROUP BY子句中使用。
      SELECT RANDID , AVG(EDLEVEL), AVG(SALARY)
        FROM ( SELECT EDLEVEL, SALARY, INTEGER(RAND()*5) AS RANDID
                 FROM EMPLOYEE
             ) AS EMPRAND
        GROUP BY RANDID
  • 示例10——查询EMP_ACT表,并返回那些员工工资在所有员工中排名前10的项目编号。
      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)
  • 例11——假设PHONES和IDS是两个具有相同基数数组的SQL变量,将这些数组转换为具有三列的表格(每个数组一列,位置一列),每个数组元素一行。
       SELECT T.PHONE, T.ID, T.INDEX FROM UNNEST(PHONES, IDS)
         WITH ORDINALITY AS T(PHONE, ID, INDEX)
         ORDER BY T.INDEX