SQL 解説書

副選択の例

例 A1: EMPLOYEE 表の列および行をすべて選択します。

    SELECT * FROM EMPLOYEE

例 A2: EMP_ACT 表および EMPLOYEE 表を結合し、 EMP_ACT 表からすべての列を選択して、 EMPLOYEE 表の従業員の姓 (LASTNAME) を結果の各行に追加します。

    SELECT EMP_ACT.*, LASTNAME      
   FROM EMP_ACT, EMPLOYEE             
   WHERE EMP_ACT.EMPNO = EMPLOYEE.EMPNO

例 A3: EMPLOYEE 表と DEPARTMENT 表を結合し、 1930 年よりも前に生まれた (BIRTHDATE) 従業員すべての従業員番号 (EMPNO)、 従業員の姓 (LASTNAME)、部門番号 (EMPLOYEE 表の WORKDEPT と DEPARTMENT 表の DEPTNO)、 および部門名 (DEPTNAME) を選択します。

    SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME 
     FROM EMPLOYEE, DEPARTMENT                     
     WHERE WORKDEPT = DEPTNO     
     AND YEAR(BIRTHDATE) < 1930

例 A4: EMPLOYEE 表の中で同じジョブ・コードをもつ行のグループごとに、 ジョブ (JOB) と給与 (SALARY) の最低額と最高額を選択します。 ただし、グループの中でも、複数の行が含まれ、 給与の最高額が 27000 以上のグループについてのみ選択を行います。

SELECT JOB, MIN(SALARY),  MAX(SALARY)
   FROM EMPLOYEE
   GROUP BY JOB
   HAVING COUNT(*) > 1 
   AND MAX(SALARY) >= 27000

例 A5: EMP_ACT 表の中から、 部門 (WORKDEPT) 'E11' の従業員 (EMPNO) についてのすべての行を選択します。 (従業員部門番号は、EMPLOYEE 表に示されています。)

  SELECT *
    FROM EMP_ACT
    WHERE EMPNO IN
             (SELECT EMPNO
                 FROM EMPLOYEE
                 WHERE WORKDEPT = 'E11')

例 A6: EMPLOYEE 表から、給与の最高額が従業員全体の平均給与に満たないすべての部門について、 部門番号 (WORKDEPT) と部門別給与 (SALARY) の最高額を選択します。

  SELECT WORKDEPT, MAX(SALARY) 
    FROM EMPLOYEE
    GROUP BY WORKDEPT
    HAVING MAX(SALARY) < (SELECT AVG(SALARY)
                              FROM EMPLOYEE)

この例では、HAVING 文節の副照会は 1 度だけ実行されることになります。

例 A7: 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)

例 A6 とは反対に、HAVING 文節の副照会は、 各グループごとに実行する必要があります。

例 A8: セールス担当員の従業員番号と給与、およびその部門の給与平均額と人数とを調べます。

この照会では、まずネストされた表式 (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 視点を正規の視点として作成することによりオーバーヘッドを軽減することができます。 ステートメントの準備中に、視点のカタログにはアクセスされません。 これは、照会の残りの部分の文脈により、 視点によって考慮する必要があるのはセールス担当の部門の行だけだからです。

例 A9: 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


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]