副選択照会の例

以下の例は、副選択照会について説明しています。

  • 例 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) を選択します。
      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: 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