Join adalah menampilkan data dari beberapa tabel.
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;
------------
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