副選択照会の例
以下の例は、副選択照会について説明しています。
- 例 1: EMPLOYEE 表からすべての列と行を選択します。
SELECT * FROM EMPLOYEE
- 例 2: EMP_ACT 表と EMPLOYEE 表を結合し、EMP_ACT 表からすべての列を選択し、従業員の姓 (LASTNAME) を EMPLOYEE 表から結果の各行に追加します。
SELECT EMP_ACT.*, LASTNAME FROM EMP_ACT, EMPLOYEE WHERE EMP_ACT.EMPNO = EMPLOYEE.EMPNO
- 例 3: EMPLOYEE 表と DEPARTMENT 表を結合し、1955 年より前に生まれたすべての従業員の従業員番号 (EMPNO)、従業員姓 (LASTNAME)、部門番号 (EMPLOYEE 表の WORKDEPT と DEPARTMENT 表の DEPTNO)、および部門名 (DEPTNAME) を選択します。
SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME FROM EMPLOYEE, DEPARTMENT WHERE WORKDEPT = DEPTNO AND YEAR(BIRTHDATE) < 1955
- 例 4: EMPLOYEE 表の同じジョブ・コードを持つ行のグループごとに、ジョブ (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: EMPLOYEE 表から、全従業員の平均給与よりも給与が高いすべての部門の部門番号 (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: 5 つの従業員のランダム・グループについて平均的な教育レベルと給与を表示します。この照会では、各従業員のランダム値を 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 は同じカーディナリティーの配列値を持つ 2 つの SQL 変数であると想定して、これらの配列を、3 つの列 (各配列に 1 つおよび位置用にもう 1 つ) および各配列エレメントにつき 1 つの行を持つ表に変換します。
SELECT T.PHONE, T.ID, T.INDEX FROM UNNEST(PHONES, IDS) WITH ORDINALITY AS T(PHONE, ID, INDEX) ORDER BY T.INDEX