2013/08/22

08-05.データー操作語(DML)【Join01--Equi Join, Non_Equi Join, Self Join】

■Joinとは?
 -2つ以上のテーブルを結合してデーターを検索する方法
 -通常2つ以上の行の共通値、Primary Key及びForeign Keyを利用して結合する
 -SELECT文でJoin結合するには最低1つのコラムがその2つのテーブルで共有されなければいけない

■Join方法と方式
 -方法:Equi Join(等結合、内部結合)、Nom-Equi Join、Self Join、Outer Join
 -方式:Nested Loop Join、Sort Merge Join、Hash Join

■Equi Join
 -一般的に使用されているEquality Condition(=)による結合
 -Equi Joinの性能を上げるにはIndex機能を使用する


--deptテーブルとempテーブルを結合
SQL> SELECT e.empno, e.ename, d.dname
  2  FROM dept d, emp e
  3  WHERE d.deptno = e.deptno;

     EMPNO ENAME      DNAME
---------- ---------- --------------
      7369 SMITH      RESEARCH
      7499 ALLEN      SALES
      7521 WARD       SALES
      7566 JONES      RESEARCH
      7654 MARTIN     SALES
      7698 BLAKE      SALES
      7782 CLARK      ACCOUNTING
      7788 SCOTT      RESEARCH
      7839 KING       ACCOUNTING
      7844 TURNER     SALES
      7876 ADAMS      RESEARCH

     EMPNO ENAME      DNAME
---------- ---------- --------------
      7900 JAMES      SALES
      7902 FORD       RESEARCH
      7934 MILLER     ACCOUNTING

14行が選択されました。


--INNER JOINを使用した結合
--「,」の代わりにINNER JOIN使用可能、INNERは省略可能。
 JOINの条件はON句に記載。

SQL> SELECT e.empno, e.ename, d.dname
  2  FROM dept d
  3  INNER JOIN emp e
  4  ON d.deptno = e.deptno;

     EMPNO ENAME      DNAME
---------- ---------- --------------
      7369 SMITH      RESEARCH
      7499 ALLEN      SALES
      7521 WARD       SALES
      7566 JONES      RESEARCH
      7654 MARTIN     SALES
      7698 BLAKE      SALES
      7782 CLARK      ACCOUNTING
      7788 SCOTT      RESEARCH
      7839 KING       ACCOUNTING
      7844 TURNER     SALES
      7876 ADAMS      RESEARCH

     EMPNO ENAME      DNAME
---------- ---------- --------------
      7900 JAMES      SALES
      7902 FORD       RESEARCH
      7934 MILLER     ACCOUNTING

14行が選択されました。



--NATURAL JOINでの結合
--NATURAL JOINは同一コラムを内部的にすべて結合するのでON句は省略可能
SQL> SELECT e.empno, e.ename, d.dname
  2  FROM dept d
  3  NATURAL JOIN emp e;

     EMPNO ENAME      DNAME
---------- ---------- --------------
      7369 SMITH      RESEARCH
      7499 ALLEN      SALES
      7521 WARD       SALES
      7566 JONES      RESEARCH
      7654 MARTIN     SALES
      7698 BLAKE      SALES
      7782 CLARK      ACCOUNTING
      7788 SCOTT      RESEARCH
      7839 KING       ACCOUNTING
      7844 TURNER     SALES
      7876 ADAMS      RESEARCH

     EMPNO ENAME      DNAME
---------- ---------- --------------
      7900 JAMES      SALES
      7902 FORD       RESEARCH
      7934 MILLER     ACCOUNTING

14行が選択されました。



--JOIN~USINGを使用した結合
--NATURAL JOINはUSING文を使用することにより、コラムを選択し結合できる。
SQL> SELECT e.empno, e.ename, deptno
  2  FROM emp e
  3  JOIN dept d
  4  USING (deptno);

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7369 SMITH              20
      7499 ALLEN              30
      7521 WARD               30
      7566 JONES              20
      7654 MARTIN             30
      7698 BLAKE              30
      7782 CLARK              10
      7788 SCOTT              20
      7839 KING               10
      7844 TURNER             30
      7876 ADAMS              20

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7900 JAMES              30
      7902 FORD               20
      7934 MILLER             10

14行が選択されました。



■Non-Equi Join
 -テーブルのどのcolumnも結合するテーブルのcolumnと一致しない場合使用。
 -演算子は「=」以外を使う(BETWEEN AND, IS NULL, IS NOT NULL, IN, NOT IN)
 -ほぼ使用しない。

--empテーブルとsalgradeテーブルのNon-Equi Join
SQL> SELECT e.ename, e.sal, s.grade
  2  FROM emp e, salgrade s
  3  WHERE e.sal
  4  BETWEEN s.losal
  5  AND s.hisal;

ENAME             SAL      GRADE
---------- ---------- ----------
SMITH             800          1
JAMES             950          1
ADAMS            1100          1
WARD             1250          2
MARTIN           1250          2
MILLER           1300          2
TURNER           1500          3
ALLEN            1600          3
CLARK            2450          4
BLAKE            2850          4
JONES            2975          4

ENAME             SAL      GRADE
---------- ---------- ----------
SCOTT            3000          4
FORD             3000          4
KING             5000          5

14行が選択されました。

SQL>


■Self Join
 -Equi Joinと同じだが、1つのテーブル内で結合するのが違い。
 -1つのテーブルに対して2つのaliasを使用し、FROM句に2つのテーブルを使用するように結合

--社員の担当マネージャを検索するSelf Join
SQL> SELECT e.ename, a.ename "Manager"
  2  FROM emp e, emp a
  3  WHERE e.empno = a.mgr;

ENAME      Manager
---------- ----------
FORD       SMITH
BLAKE      ALLEN
BLAKE      WARD
KING       JONES
BLAKE      MARTIN
KING       BLAKE
KING       CLARK
JONES      SCOTT
BLAKE      TURNER
SCOTT      ADAMS
BLAKE      JAMES

ENAME      Manager
---------- ----------
JONES      FORD
CLARK      MILLER

13行が選択されました。

SQL>



■Cartesian Product「直積結合
 -AとB、2つのテーブルを結合する時、JOIN条件を省略しAテーブルの全ての行がBテーブルの全ての行と結合される事
 -可能な全ての行の結合が出力され、過負荷の危険もある
 -テーブルの数がNならCartesian Productを避けるためには最低N-1の等条件をSELECT文に入れ、各テーブルのコラムが最低一回は条件句に参照されなければいけない。
 -CROSS JOIN使用でCartesian Product値を得られる。

--CROSS JOINを使用してCartesian Product値を得る。
SQL> SELECT e.empno, e.ename, d.dname
  2  FROM dept d CROSS JOIN emp e;

     EMPNO ENAME      DNAME
---------- ---------- --------------
      7369 SMITH      ACCOUNTING
      7499 ALLEN      ACCOUNTING
      7521 WARD       ACCOUNTING
      7566 JONES      ACCOUNTING
      7654 MARTIN     ACCOUNTING
      7698 BLAKE      ACCOUNTING
      7782 CLARK      ACCOUNTING
      7788 SCOTT      ACCOUNTING
      7839 KING       ACCOUNTING
      7844 TURNER     ACCOUNTING
      7876 ADAMS      ACCOUNTING

     EMPNO ENAME      DNAME
---------- ---------- --------------
      7900 JAMES      ACCOUNTING
      7902 FORD       ACCOUNTING
      7934 MILLER     ACCOUNTING
      7369 SMITH      RESEARCH
      7499 ALLEN      RESEARCH
      7521 WARD       RESEARCH
      7566 JONES      RESEARCH

.........

56行が選択されました。

SQL>

0 件のコメント:

コメントを投稿

QLOOKアクセス解析