2013/10/08

15.プロシージャ(PROCEDURE)と関数(FUNCTION)

■プロシージャ(Procedure)とは?
 →特定の作業を実行する名前のあるPL/SQL BLOCKだ。
 →パラメーターを受けられ、繰り返し使用できるBLOCKだ。
 →通常、連続実行または複雑なトランザクションを実行するPL/SQL BLOCKをデータベースに
  保存するために作る。

■プロシージャの文法


CREATE OR REPLACE procedure name
    IN argument
    OUT argument
    IN OUT argument

IS

    [変数の宣言]

BEGIN  --->必須

    [PL/SQL Block]
    --SQL文、PL/SQL制御文

    [EXCEPTION] --->選択
    --errorが発生する時実行する文章

END;  --->必須

 ・CREATE OR REPLACEを使用して作る
 ・ISでPL/SQLのブロックを始める
 ・LOCAL変数はISとBEGINの間に宣言する



■プロシージャ作成例

--プロシージャの名前はupdate sal
--update salプロシージャは社員番号を受けて給与をアップさせる
--プロシージャの終わりは「/」を表記する
SQL> CREATE OR REPLACE PROCEDURE update_sal
  2  /* IN Parameter */
  3  (v_empno IN NUMBER)
  4
  5  IS
  6
  7  BEGIN
  8
  9   UPDATE emp
 10  set sal = sal * 1.1
 11  WHERE empno = v_empno;
 12
 13  COMMIT;
 14
 15  END update_sal;
 16  /

プロシージャが作成されました。

SQL>


■プロシージャ実行例  EXECUTEを使用してプロシージャを実行する

SQL> EXECUTE update_sal(7369);

PL/SQLプロシージャが正常に完了しました。

SQL>
--社員番号7369の社員の給与が10%アップされたか確認してみよう


■関数(Function)とは?
 →通常、計算後の値を返す為に関数を使用するケースが多い
 →構成はほとんどプロシージャと似ているが、INパラメータのみ使用できる
 →返すデータタイプをRETURN文に宣言しなければいけない
 →PL/SQLブロック内でRETURN文を通じて値を返す

■関数文法


--PL/SQLブロックには少なくとも1つのRETURN文が必要だ
--PL/SQL Blockは関数が実行する内容を定義した本体部分た

CREATE OR REPLACE FUNCTION function name
 [(argument...)]

 RETURN datatype
  --datatypeは返す値のdatatypeだ

IS

 [PL/SQL Block]

 --RETURN文必須
 RETURN 変数;

END;


■関数作成例


SQL> CREATE OR REPLACE FUNCTION FC_update_sal
  2  (v_empno IN NUMBER)
  3
  4  --RETURNされる変数のデータタイプ定義は必須
  5  RETURN NUMBER
  6
  7  IS
  8
  9  --%type変数を使用
 10  v_sal emp.sal%type;
 11
 12  BEGIN
 13
 14  UPDATE emp
 15  SET sal = sal * 1.1
 16  WHERE empno = v_empno;
 17
 18  COMMIT;
 19
 20  SELECT sal
 21  INTO v_sal
 22  FROM emp
 23  WHERE empno = v_empno;
 24
 25  --RETURNは必須
 26  RETURN v_sal;
 27
 28  END;
 29  /

ファンクションが作成されました。

SQL>


■関数実行例


--まず関数が返す値を保存する変数を宣言
SQL> VAR salary NUMBER;

--EXECUTEを使用して関数を実行する
SQL> EXECUTE :salary := FC_update_sal(7900);

PL/SQLプロシージャが正常に完了しました。

--PRINT文で出力
SQL> PRINT salary;

    SALARY
----------
    1149.5

SQL>

2013/10/01

14.PL/SQL概要

■PL/SQLとは?
 →PL/SQLはOracle's Procedural Language extension to SQLの訳
 →SQL文で変数定義、条件処理(IF)、反復処理(LOOP,WHILE,FOR)等を使え、
  オラクルに内蔵されているProcedure  Languageである
 →DEClARE文を利用して定義され、宣言文の使用は選択事項
 →PL/SQL文はブロック構造になっていて、PL/SQL自身がコンパイルエンジンを持っている

■PL/SQLの長所
 →PL/SQL文はBLOCK構造で多数のSQL文を纏めてQRACLE DBに送り処理するので、処理速度が早い
 →より強力なプログラムを作成するために大BLOCKの中に小BLOCKを持てる
 →VARIABLE,CONSTANT,CURSOR,EXCEPTIONを定義し、SQL文とProcedural文で使用する
 →単純、複雑なデータ形の変数を宣言する。
 →テーブルのデータ構造とコラム名に準じて動的変数を宣言できる
 →EXCEPTION処理ルーティンを利用してOracle Server Errorを処理する
 →ユーザー定義エラーを宣言し、EXCEPTION処理ルーティンで処理可能だ

■PL/SQL Block Structure
 →PL/SQLはプログラムを論理的なブロックに分ける構造化されているブロック言語だ
 →PL/SQLブロックは宣言部(オプション)、実行部(必須)、例外処理部(オプション)で構成され、
  BEGINとENDキーワードは必ず記述する
 →PL/SQLブロックで使用する便数はブロックに対して論理的に宣言し、使用出来る

 ・Declarative Section(宣言部)
  →変数、定数、CURSOR、USER_DEFINE Exception宣言

 ・Executable Section(実行部)
  →SQL、反復文、条件文実行
  →実行部はBEGINで始まりENDで終了する
  →実行文はプログラム内容が入る部分で必須

 ・Exception Handling Section(例外処理)
  →例外に関する処理
  →一般的にエラーを定義し処理する部分で選択事項

■PL/SQLプログラムの作成要領
 →PL/SQLブロック内では一文が終了するたびにセミコロン「;」を使用する
 →ENDの後にセミコロン「;」を使用し1ブロックの終わりを明記する
 →PL/SQLブロックの作成はエディターでファイルに作成出でき、SQLプロンプトで直接作成できる
 →SQL*PLUS環境ではDECLAREやBEGINのキーワードでPL/SQLブロックが始まる
 →1行コメント:--
 →複数行コメント:/* */
 →PL/SQLブロックは行に「/」が有ると終了される


■PL/SQLブロックの形

 ・Aninymous Block
  →名前の無いブロックを意味し、実行するためプログラム内で宣言され実行時には実行のため
   PL/SQLエンジンに送られる
  →先行コンパイラープログラムとSQL*Plusまたはサーバー管理者からブロックを内蔵できる。

 ・Procedure
  →特定の作業を実行出来る名前のあるPL/SQLブロックで、パラメーターを受けられ、
   繰り返し使用できる
  →通常、連続実行または複雑なトランザクションを実行するPL/SQLブロックをDBへ
   保存するために作る

 ・Function
  →通常、計算を行い結果を返す為に関数を使用する
  →大体の構成がプロシーザーと似ているが、INパラメーターのみ使用可能で、
   必ず返す値のデータタイプをRETURN文に宣言しなければならない
   またPL/SQLブロック内でRETURN文で必ず値を返す必要がある。

2013/08/30

13-01.データディクショナリ(Data Dictionary)とは

■データ・ディクショナリ(Data Dictionary)とは
 ・読み取り専用で提供されるテーブルやビューの集合でデータベース全般の情報を提供する。
 ・オラクルデータベースはコマンドが実行される毎にデータ・ディクショナリにアクセスする。
 ・DB作業の間、Oracleはデータ・ディクショナリを読みオブジェクトの存在とユーザーに適切なAccess権限が有るかを確認する。また、Oracleはデータ・ディクショナリを更新しながらDATABASE構造、監査、ユーザー権限、データ等の変更を反映していく。

 ・データ・ディクショナリに保存される内容
  -オラクルのユーザー情報
  -オラクル権限とロール情報
  -データベースのスキーマオブジェクト(TABLE, VIEW, INDEX, CLUSTER, SYNONYM, SEQUENCE...)情報
  -ユニーク制約条件に関する情報
  -オラクルデータベースの関数はプロシザー及びトリガーに関する情報
  -その他、一般DATABASE情報


■データ・ディクショナリの分類
 ・ALL_XXXX
  -ALL_で始まるデータ・ディクショナリで、特定ユーザーが検索可能なすべてのデータ・ディクショナリを意味する。
  -検索しようとするオブジェクトが自分のではなくても、そのオブジェクトにアクセスできる権限を持っているなら、ALL_XXXXビューで検索可能。


SQL> SELECT table_name, tablespace_name
  2  FROM ALL_TABLES;

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
DUAL                           SYSTEM
SYSTEM_PRIVILEGE_MAP           SYSTEM
TABLE_PRIVILEGE_MAP            SYSTEM
STMT_AUDIT_OPTION_MAP          SYSTEM
AUDIT_ACTIONS                  SYSTEM
WRR$_REPLAY_CALL_FILTER        SYSAUX
HS_BULKLOAD_VIEW_OBJ           SYSTEM
HS$_PARALLEL_METADATA          SYSTEM
HS_PARTITION_COL_NAME          SYSTEM
HS_PARTITION_COL_TYPE          SYSTEM
HELP                           SYSTEM
....



 ・DBA_XXXX
  -DBA権限が有るユーザーのみ検索できるデータ・ディクショナリですべてのオラクルデータベースのオブジェクトの情報が見れる。

  -SELECT ANY TABLE権限があるユーザーも問合せ可能で、他のユーザーが問合せするには前に「SYS.」の接頭語をつけなければいけない。

--SYSユーザーで接続し、下記を実施してみよう
SQL> SELECT OWNER, OBJECT NAME
  2  FROM SYS.DBA_OBJECTS;



■V$_XXXX
 ・Dynamic Performance Viewとも言う。現在のDatabaseの状態に関する情報で、DBAのみアクセスが許可されている。
 ・主にDBAのモニタリング作業用情報を提供し、X$テーブルをベースとするビューである。

■X$_XXXX
 ・X$ビューはV$ビューで見れない情報を見せてくれる
 ・X$テーブルはオラクルメモリ情報を見られるSQLインターペースビューでOracleデータベースの隠れている領域の1つだ。

■Oracle Database全体データディクショナリ
 ・http://docs.oracle.com/cd/B28359_01/server.111/b28320/index.htm

12-02.階層クエリの活用

Oracle10gからCONNECT BYで提供するCONNECT_BY_ROOT, SYS_CONNECT_BY_PATH, CONNECT_BY_ISLEAF機能について…

■CONNECT_BY_ROOT
 ・階層構造クエリでLEVELが0の最上位ROWの情報を取得できる。

SQL> SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno,
  2  CONNECT_BY_ROOT empno "Root empno", level
  3  FROM emp
  4  START WITH job = 'PRESIDENT'
  5  CONNECT BY PRIOR empno = mgr;

ENAME                     EMPNO Root empno      LEVEL
-------------------- ---------- ---------- ----------
KING                       7839       7839          1
    JONES                  7566       7839          2
        SCOTT              7788       7839          3
            ADAMS          7876       7839          4
        FORD               7902       7839          3
            SMITH          7369       7839          4
    BLAKE                  7698       7839          2
        ALLEN              7499       7839          3
        MARTIN             7654       7839          3
        TURNER             7844       7839          3
        JAMES              7900       7839          3
    CLARK                  7782       7839          2
        MILLER             7934       7839          3

13行が選択されました。



■CONNECT_BY_ISLEAF
 ・階層構造クエリでROW最下位レベルかどうかを返す。最下位なら1、じゃなければ0

SQL> SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno,
  2         CONNECT_BY_ISLEAF "leaf", level
  3  from emp
  4  START WITH job = 'PRESIDENT'
  5  CONNECT BY NOCYCLE PRIOR empno = mgr;

ENAME                     EMPNO       leaf      LEVEL
-------------------- ---------- ---------- ----------
KING                       7839          0          1
    JONES                  7566          0          2
        SCOTT              7788          0          3
            ADAMS          7876          1          4
        FORD               7902          0          3
            SMITH          7369          1          4
    BLAKE                  7698          0          2
        ALLEN              7499          1          3
        MARTIN             7654          1          3
        TURNER             7844          1          3
        JAMES              7900          1          3
    CLARK                  7782          0          2
        MILLER             7934          1          3

13行が選択されました。



■SYS_CONNECT_BY_PATH
 ・階層構造クエリで現在のROWのPATH情報を簡単に検索できる。

--SQL*Plusできれいに見るために
SQL> COL PATH FORMAT A40

--SYS_CONNECT_BY_PATH例
SQL> SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename, empno,
  2         SYS_CONNECT_BY_PATH(ename, '/') "PATH"
  3    FROM emp
  4   START WITH job='PRESIDENT'
  5  CONNECT BY PRIOR empno=mgr;

ENAME                     EMPNO PATH
-------------------- ---------- ----------------------------------------
KING                       7839 /KING
    JONES                  7566 /KING/JONES
        SCOTT              7788 /KING/JONES/SCOTT
            ADAMS          7876 /KING/JONES/SCOTT/ADAMS
        FORD               7902 /KING/JONES/FORD
            SMITH          7369 /KING/JONES/FORD/SMITH
    BLAKE                  7698 /KING/BLAKE
        ALLEN              7499 /KING/BLAKE/ALLEN
        MARTIN             7654 /KING/BLAKE/MARTIN
        TURNER             7844 /KING/BLAKE/TURNER
        JAMES              7900 /KING/BLAKE/JAMES
    CLARK                  7782 /KING/CLARK
        MILLER             7934 /KING/CLARK/MILLER

13行が選択されました。


 ・下記のようにLeaf Nodeだけ、全体PATH情報が出るように作成できる。

SQL> SELECT LEVEL, SUBSTR(SYS_CONNECT_BY_PATH(ename, ','), 2) path
  2  FROM emp
  3  WHERE CONNECT_BY_ISLEAF = 1
  4  START WITH mgr IS NULL
  5  CONNECT BY PRIOR empno = mgr;

     LEVEL PATH
---------- ----------------------------------------
         4 KING,JONES,SCOTT,ADAMS
         4 KING,JONES,FORD,SMITH
         3 KING,BLAKE,ALLEN
         3 KING,BLAKE,MARTIN
         3 KING,BLAKE,TURNER
         3 KING,BLAKE,JAMES
         3 KING,CLARK,MILLER

7行が選択されました。



■ORDER SIBLINGS BY ・階層構造クエリで相関関係を維持しながら整列させる

SQL> COL ename FORMAT A25
SQL> COL ename2 FORMAT A10

--ORDER SIBLINGS BY例
SQL> SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename,
  2         ename ename2, empno, level
  3  FROM emp
  4  START WITH job = 'PRESIDENT'
  5  CONNECT BY NOCYCLE PRIOR empno = mgr
  6  ORDER SIBLINGS BY ename2;

ENAME                     ENAME2          EMPNO      LEVEL
------------------------- ---------- ---------- ----------
KING                      KING             7839          1
    BLAKE                 BLAKE            7698          2
        ALLEN             ALLEN            7499          3
        JAMES             JAMES            7900          3
        MARTIN            MARTIN           7654          3
        TURNER            TURNER           7844          3
    CLARK                 CLARK            7782          2
        MILLER            MILLER           7934          3
    JONES                 JONES            7566          2
        FORD              FORD             7902          3
            SMITH         SMITH            7369          4
        SCOTT             SCOTT            7788          3
            ADAMS         ADAMS            7876          4

13行が選択されました。

--きれいに整列された。



--ORDER BY例
SQL> SELECT LPAD(' ', 4*(LEVEL-1)) || ename ename,
  2         ename ename2, empno, level
  3  FROM emp
  4  START WITH job = 'PRESIDENT'
  5  CONNECT BY NOCYCLE PRIOR empno = mgr
  6  ORDER BY ename2;

ENAME                     ENAME2          EMPNO      LEVEL
------------------------- ---------- ---------- ----------
            ADAMS         ADAMS            7876          4
        ALLEN             ALLEN            7499          3
    BLAKE                 BLAKE            7698          2
    CLARK                 CLARK            7782          2
        FORD              FORD             7902          3
        JAMES             JAMES            7900          3
    JONES                 JONES            7566          2
KING                      KING             7839          1
        MARTIN            MARTIN           7654          3
        MILLER            MILLER           7934          3
        SCOTT             SCOTT            7788          3
            SMITH         SMITH            7369          4
        TURNER            TURNER           7844          3

13行が選択されました。

--変な整列になっている。

12-01.階層クエリ(hierarchical query)とは

■階層クエリ(Hierarchical Queries)とは?
 -またの名を再帰クエリ (recursive query)と言う。
 -再帰的な問い合わせを行う SELECT ステートメントである。階層構造を持つデータなどに使う。
  って言ってもよく分かんないんで、実例で見てみよう。

 -scottユーザーのempテーブルを見ると、empnoとmgrコラムがあり、
  mgrコラムのデータは各社員の管理者empnoを意味する。

SQL> SELECT empno, ename, sal, mgr FROM emp;

     EMPNO ENAME             SAL        MGR
---------- ---------- ---------- ----------
      7369 SMITH             800       7902
      7499 ALLEN            1600       7698
....

13行が選択されました。

--社員SMITHの管理者の社員番号は7902
--社員ALLENの管理者の社員番号は7698


この上位階層と下位階層の関係をORACLEではSTART WITHとCONNECT BYを使って
簡単に検索できる。

■階層構造クエリSynctax
・START WITH
 -階層問合せ文のルートで使用される行を指定する。
 -サブクエリを使用できる。

・CONNECT BY
 -階層クエリで上位階層と下位階層の関係を定義できる。
 -PRIOR演算子と一緒に使用して階層構造で表現できる。
 -CONNECT BY PRIOR 下位コラム=上位コラム:上位から下位へのツリー構造(Top Down)
 -CONNECT BY 下位コラム=PRIOR 上位コラム:下位から上位へのツリー構造(Bottom Up)
 -CONNECT BY NOCYCLE PRIOR:NOCYCLEパラメータを利用してループ防止
 -サブクエリを使えない

・LEVEL Pseudocoolumn
 -LEVELは階層構造クエリ結果のDepthを表現するコラム

・ORDER SIBLINGS BY
 -ORDER SIBLINGS BYを使用すると階層構造クエリで簡単に整列できる。

・CONNECT BY実行順番は以下になる。
 -1.START WITH
 -2.CONNECT BY
 -3.WHERE

■階層構造クエリ例
 -基本例:職業PRESIDENTを基準に階層構造で検索する例。

--LEVELコラムでdepthが見れる
--JONESの管理者はKINGでSCOTTの管理者はJONES
--上下の階層構造を検索できる
SQL> SELECT LEVEL, empno, ename, mgr
  2  FROM emp
  3  START WITH job = 'PRESIDENT'
  4  CONNECT BY PRIOR empno = mgr;

     LEVEL      EMPNO ENAME             MGR
---------- ---------- ---------- ----------
         1       7839 KING
         2       7566 JONES            7839
         3       7788 SCOTT            7566
         4       7876 ADAMS            7788
         3       7902 FORD             7566
         4       7369 SMITH            7902
         2       7698 BLAKE            7839
         3       7499 ALLEN            7698
         3       7654 MARTIN           7698
         3       7844 TURNER           7698
         3       7900 JAMES            7698
         2       7782 CLARK            7839
         3       7934 MILLER           7782

13行が選択されました。


■LEVELの活用  
 -LEVEL Pseudocolumnを利用すると階層構造クエリを様々に活用できる。
 -下記例は、LEVELに空白を追加し、階層構造を一目で見れるようにした例

--SQL*PLUSできれいに見るための設定
SQL> COL ename FORMAT A20;

--左にLEVEL程の空白を追加して階層構造を検索
SQL> SELECT LEVEL, LPAD(' ', 4 * (LEVEL-1)) || ename ename, empno, mgr, job
  2  FROM emp
  3  START WITH job = 'PRESIDENT'
  4  CONNECT BY PRIOR empno = mgr;

     LEVEL ENAME                     EMPNO        MGR JOB
---------- -------------------- ---------- ---------- ---------
         1 KING                       7839            PRESIDENT
         2     JONES                  7566       7839 MANAGER
         3         SCOTT              7788       7566 ANALYST
         4             ADAMS          7876       7788 CLERK
         3         FORD               7902       7566 ANALYST
         4             SMITH          7369       7902 CLERK
         2     BLAKE                  7698       7839 MANAGER
         3         ALLEN              7499       7698 SALESMAN
         3         MARTIN             7654       7698 SALESMAN
         3         TURNER             7844       7698 SALESMAN
         3         JAMES              7900       7698 CLERK
         2     CLARK                  7782       7839 MANAGER
         3         MILLER             7934       7782 CLERK

13行が選択されました。


■以下はLEVEL別で給与合計と社員数を検索する例

SQL> SELECT LEVEL, SUM(sal) total, COUNT(empno) cnt
  2  FROM emp
  3  START WITH job = 'PRESIDENT'
  4  CONNECT BY PRIOR empno = mgr
  5  GROUP BY LEVEL
  6  ORDER BY LEVEL;

     LEVEL      TOTAL        CNT
---------- ---------- ----------
         1       5000          1
         2       8275          3
         3      12600          7
         4       1900          2



■PRIORの活用
 ・PRIOR演算子をSELECTで使用してみよう。

 ・下記は社員の管理者をPRIOR演算子を利用して検索する例

--SQL*PLUSできれいに見るための設定
SQL> COL mgrname FORMAT A10;

--SELECTで"PRIOR ename mgrname"を確認してみる
SQL> SELECT LEVEL, LPAD(' ', 4*(LEVEL-1)) || ename ename,
  2         PRIOR ename mgrname,
  3  empno, mgr, job
  4  FROM emp
  5  START WITH job = 'PRESIDENT'
  6  CONNECT BY PRIOR empno = mgr;

     LEVEL ENAME                MGRNAME         EMPNO        MGR JOB
---------- -------------------- ---------- ---------- ---------- ---------
         1 KING                                  7839            PRESIDENT
         2     JONES            KING             7566       7839 MANAGER
         3         SCOTT        JONES            7788       7566 ANALYST
         4             ADAMS    SCOTT            7876       7788 CLERK
         3         FORD         JONES            7902       7566 ANALYST
         4             SMITH    FORD             7369       7902 CLERK
         2     BLAKE            KING             7698       7839 MANAGER
         3         ALLEN        BLAKE            7499       7698 SALESMAN
         3         MARTIN       BLAKE            7654       7698 SALESMAN
         3         TURNER       BLAKE            7844       7698 SALESMAN
         3         JAMES        BLAKE            7900       7698 CLERK
         2     CLARK            KING             7782       7839 MANAGER
         3         MILLER       CLARK            7934       7782 CLERK

13行が選択されました。



■Bottom Up検索例
 ・上の例を逆順(下位から上位へのツリー構造、Bottom Up)で検索する。

--SQL*PLUSできれいに見るための設定
SQL> COL ename FORMAT A20;

--enameを基準にBottom Upで検索する例
SQL> SELECT LEVEL, LPAD(' ', 4*(LEVEL-1)) || ename ename, empno, mgr, job
  2  FROM emp
  3  START WITH ename = 'SMITH'   --最下位ノード値を記載
  4  CONNECT BY empno = PRIOR mgr;

     LEVEL ENAME                     EMPNO        MGR JOB
---------- -------------------- ---------- ---------- ---------
         1 SMITH                      7369       7902 CLERK
         2     FORD                   7902       7566 ANALYST
         3         JONES              7566       7839 MANAGER
         4             KING           7839            PRESIDENT


2013/08/28

11-07.サブクエリ(Subquery)【UNION [ALL], INTERSECT, MINUS演算子】

■UNION [ALL]、INTERSECT、MINUS演算子
 -UNIONとUNION ALLの違いは整列作業があるか、ないか。
 -UNIONは重複を除去のため整列を実行するので性能が落ちる
 -UNION、MINUS、INTERSECTは全体範囲をアクセスする整列作業を実行するので一部範囲の処理が不可能。

■UNION
 -UNIONは2つのテーブル結合で、結合する2つのテーブルの重複しない値を返す。

--部署番号を検索するUNION例
SQL> SELECT deptno FROM emp
  2  UNION
  3  SELECT deptno FROM dept;

    DEPTNO
----------
        10
        20
        30
        40



■UNION ALL
 -UNIONと同じだけど、重複する値も返す。

--部署番号を検索するUNION ALL例
SQL> SELECT deptno FROM emp
  2  UNION ALL
  3  SELECT deptno FROM dept;

    DEPTNO
----------
        20
        30
        20
        30
        30
        10
        20
        10
        30
        20
        30
        20
        10
        10
        20
        30
        40

17行が選択されました。



■INTERSECT
 -INTERSECTは2行の集合で共通の行を返す

--部署番号を検索するINTERSECT例
SQL> SELECT deptno FROM emp
  2  INTERSECT
  3  SELECT deptno FROM dept;

    DEPTNO
----------
        10
        20
        30



■MINUS
 -MINUSは最初のSELECT文による結果行の中で、2つ目のSELECT文による結果行に存在しない行を返す。

--社員がいない部署を検索するMINUS例
SQL> SELECT deptno FROM dept
  2  MINUS
  3  SELECT deptno FROM emp;

    DEPTNO
----------
        40

QLOOKアクセス解析