子查询示例
以下示例说明了 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),这些部门的所有最高工资都低于所有雇员的平均工资。
在这个例子中,HAVING子句中的子查询只运行一次。SELECT WORKDEPT, MAX(SALARY) FROM EMPLOYEE GROUP BY WORKDEPT HAVING MAX(SALARY) < (SELECT AVG(SALARY) FROM EMPLOYEE) - 示例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