16 December 2011

Join di SQL Oracle

Join adalah menampilkan data dari beberapa tabel.
 Diminta untuk membuat daftar pegawai per department dengan menampilkan nama department, nama pegawai, salary dan tgl masuk.
 Kolom dname ada di tabel DEPT sedangkan kolom ename, sal dan hiredate ada di tabel EMP. untuk itu maka harus dilakukan join antara tabel EMP dan DEPT.

Perintahnya :
SELECT dept.dname,
       emp.ename,
       emp.sal,
       emp.hiredate
FROM emp, dept
WHERE emp.deptno=dept.deptno;

DNAME          ENAME             SAL HIREDATE
-------------- ---------- ---------- ---------
ACCOUNTING     CLARK            2450 09-JUN-81
ACCOUNTING     KING             5000 17-NOV-81
ACCOUNTING     MILLER           1300 23-JAN-82
RESEARCH       JONES            2975 02-APR-81
RESEARCH       FORD             3000 03-DEC-81
RESEARCH       ADAMS            1100 23-MAY-87
RESEARCH       SMITH             800 17-DEC-80
RESEARCH       SCOTT            3000 19-APR-87
SALES          WARD             1250 22-FEB-81
SALES          TURNER           1500 08-SEP-81
SALES          ALLEN            1600 20-FEB-81
SALES          JAMES             950 03-DEC-81
SALES          BLAKE            2850 01-MAY-81
SALES          MARTIN           1250 28-SEP-81


JOIN harus diberi kondisi join. kondisi join ditulis di klausa WHERE.

Bagaimana jika JOIN tidak ada kondisi joinnya ?
SELECT dept.dname,
       emp.ename,
       emp.sal,
       emp.hiredate
FROM emp, dept;
--> Akan menghasilkan Cartesian Product.

Tabel Alias
------------
SELECT b.dname,
       a.ename,
       a.sal,
       a.hiredate
FROM emp a, dept b
WHERE a.deptno=b.deptno;

 NATURAL JOIN
------------
SELECT b.dname,
       a.ename,
       a.sal,
       a.hiredate
FROM emp a NATURAL JOIN dept b;

Join dengan USING
-----------------
SELECT b.dname,
       a.ename,
       a.sal,
       a.hiredate
FROM emp a JOIN dept b
USING(deptno);

Join dengan klausa ON
---------------------
SELECT b.dname,
       a.ename,
       a.sal,
       a.hiredate
FROM emp a JOIN dept b
ON (a.deptno=b.deptno);

Dari ketiga join diatas hasilnya sama. Kalau hasilnya sama, ngapain ada tiga cara join. Sebenarnya apa perbedaan mendasar dari ketiga join diatas. Point 75.

Kapan harus pakai Natural Join
Kapan harus pakai USING
Kapan harus pakai ON

-----------------------
Self Join
-----------------------
Join yang dilakukan antar kolom dalam satu tabel.

Perhatikan data berikut :

SELECT empno, ename, mgr
FROM emp;

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

Tampilkan daftar pegawai diikuti dengan nama managernya.
Select dilakukan terhadap satu tabel EMP yg alias-kan seolah-menjadi dua tabel. Perintahnya sbb:

SELECT s.empno "IdPeg",
       s.ename "NamaPeg",
       a.ename "NamaMgr"
FROM emp s, emp a
WHERE s.mgr=a.empno;

  IdPeg NamaPeg    NamaMgr
------- ---------- ---------
   7902 FORD       JONES
   7788 SCOTT      JONES
   7844 TURNER     BLAKE
   7499 ALLEN      BLAKE
   7521 WARD       BLAKE
   7900 JAMES      BLAKE
   7654 MARTIN     BLAKE
   7934 MILLER     CLARK
   7876 ADAMS      SCOTT
   7698 BLAKE      KING
   7566 JONES      KING
   7782 CLARK      KING
   7369 SMITH      FORD

Non-Equi JOIN
-------------
Join yg tanda pembanding d kondisinya menggunakan tanda sama dengan disebut Equi Join.
Contoh :
SELECT s.empno "IdPeg",
       s.ename "NamaPeg",
       a.ename "NamaMgr"
FROM emp s, emp a
WHERE s.mgr=a.empno;

Join yang kondisinya/tanda pembanding yang digunaan selain tanda sama dengan "=".

Perhatikan data di tabel SALGRADE dan EMP
SELECT * FROM salgrade;
   GRADE      LOSAL      HISAL
-------- ---------- ----------
       1        700       1200
       2       1201       1400
       3       1401       2000
       4       2001       3000
       5       3001       9999

Diminta, buatlah daftar gaji pegawai berdasarkan GRADE yang ada di tabel SALGRADE

Untk itu per dilakukan join antara tabel EMP dengan SALGRADE menggunakan pembanding BETWEEN, caranya :

SELECT e.empno,
       e.ename,
       e.sal,
       s.grade
FROM emp e, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;

    EMPNO ENAME             SAL      GRADE
--------- ---------- ---------- ----------
     7369 SMITH             800          1
     7900 JAMES             950          1
     7876 ADAMS            1100          1
     7521 WARD             1250          2
     7654 MARTIN           1250          2
     7934 MILLER           1300          2
     7844 TURNER           1500          3


Join dengan tiga tabel
----------------------
Diminta untuk membuat daftar pegawai yang lengkap ada nama pegawai, nama department dan grade pegawai berdasarkan salarynya.
Gunakan tabel EMP (e), DEPT (d) dan SALGRADE (s)

SELECT e.empno,
       e.ename,
       d.dname,
       e.sal,
       s.grade
FROM emp e, dept d, salgrade s
WHERE e.deptno=d.deptno
      AND
      e.sal BETWEEN s.losal AND s.hisal;


Outer Join
----------
Join secara default adalah INNER JOIN. Join yg menampilkan data yang ada pasangannya di tabel lawan joinnya.

SELECT b.dname,
       a.ename,
       a.sal,
       a.hiredate
FROM emp a JOIN dept b
USING(deptno);

SELECT b.dname,
       a.ename,
       a.sal,
       a.hiredate
FROM emp a INNER JOIN dept b
USING(deptno);

Outer join adalah join yang menampilkan data yang ada pasangannya maupun data yang tidak ada pasangannya.

UPDATE emp SET deptno=NULL
WHERE ename in ('JONES','WARD');

Dengan INNER JOIN maka JONES dan WARD tidak akan muncul.
Dengan OUTER JOIN keduanya tetap muncul.

SELECT a.ename,
       a.sal,
       b.dname
FROM emp a FULL OUTER JOIN dept b
USING(deptno);

FULL OUTER JOIN : Pegawai yg tidak ada deptno-nya dan deptno yg belum ada pegawainya semua dimunculkan.

Untuk menampilkan disisi pegawai yang tidak punya department, gunakan LEFT OUTER JOIN, caranya :
SELECT a.ename,
       a.sal,
       b.dname
FROM emp a LEFT OUTER JOIN dept b
USING(deptno);

Sebaliknya jika ingin menampilkan department yg belum punya pegawai gunakan RIGHT OUTER JOIN, caranya :
SELECT a.ename,
       a.sal,
       b.dname
FROM emp a RIGHT OUTER JOIN dept b
USING(deptno);

Cross Join
----------
Join yang menghasilkan Cartesian Product

SELECT a.ename,
       a.sal,
       b.dname
FROM emp a CROSS JOIN dept b;
-- Sama saja
SELECT a.ename,
       a.sal,
       b.dname
FROM emp a, dept b;

No comments:

Post a Comment