Thursday, October 23, 2008

Apa beda SQL Inner Join, Left Outer Join, Right Outer Join?

Mungkin kedengarannya lucu ya pertanyaan diatas(Hari gene masih binun ttg SQL Join)? tp mmg kalo ga sering pake kita bisa lupa prinsip tentang SQL join koq.Wajar...manusiawi:))
Selagi belum ada kerjaan yg di assign ke aq, sambil nunggu JIRA-nya diisi ama mas paddy bisa belajar n review2 hehehe
Sekarang mari kita coba mengingat-ingat lagi pelajaran SQl ini :
disini qta buat dulu 2 tabel yaitu
- tabel area, dengan 3 buah field : area_id, nama_area, luas_area
- tabel penduduk, dengan field 3 buah field : penduduk_id, nama_penduduk, area_id

kedua tabel diatas diilustrasikan dengan beberapa data sebagai berikut :

TABEL AREA
=====================================================
Area_ID || Nama_Area || Luas_Area
=====================================================
ARS01 Surabaya 1000
ARJ01 Jakarta 2000
ARY09 Yogya 4000
ARS02 Solo 3000
ARK01 Kediri null



TABEL PENDUDUK
=====================================================
Penduduk_ID || Nama_Penduduk || Area_ID
=====================================================
PDS01 Susanna ARS01
PDJ01 Jocki Hendry null
PDA01 Asrina Febyanti ARJ01
PDA02 Abi Anwari ARY01


I. Inner Join / Join :
Operasi Join tipe ini akan hanya menampilkan tabel sisi kiri yang datanya sama dengan data di pasangan joinnya yg disisi kanan.

dengan script sql berikut :

select d.Area_id, d.nama_area, d.luas_area, p.penduduk_id, p.nama_penduduk from area d
inner join penduduk p on (d.area_id=p.area_id);

script diatas ekivalen dengan script dibawah ini :

select d.Area_id, d.nama_area, d.luas_area, p.penduduk_id, p.nama_penduduk from penduduk p
inner join area d on (d.area_id=p.area_id);

akan menghasilkan :

AREA_ID NAMA_AREA LUAS_AREA PENDUDUK_ID NAMA_PENDUDUK
------- -------------------- ---------------------- ----------- --------------------
ARS01 Surabaya 1000 PDS01 Susanna
ARJ01 Jakarta 2000 PDA01 Asrina Febyanti

2 rows selected


II. Left Outer Join / Left Join :
Operasi Join tipe ini akan menampilkan semua isi tabel sisi kiri, walaupun data di pasangan joinnya yg disisi kanan nilainya tidak sama ataupun bernilai null.


dengan script sql berikut (Note => tabel sisi kiri : area; tabel sisi kanan : penduduk) :

select d.Area_id, d.nama_area, d.luas_area, p.penduduk_id, p.nama_penduduk from area d
left outer join penduduk p on (d.area_id=p.area_id);

akan menghasilkan :

AREA_ID NAMA_AREA LUAS_AREA PENDUDUK_ID NAMA_PENDUDUK
------- -------------------- ---------------------- ----------- --------------------
ARS01 Surabaya 1000 PDS01 Susanna
ARJ01 Jakarta 2000 PDA01 Asrina Febyanti
ARY09 Yogya 4000
ARS02 Solo 3000
ARK01 Kediri

5 rows selected

dengan script sql berikut (Note => tabel sisi kiri : penduduk; tabel sisi kanan : area) :

select d.Area_id, d.nama_area, d.luas_area, p.penduduk_id, p.nama_penduduk from penduduk p
left outer join area d on (d.area_id=p.area_id);

akan menghasilkan :

AREA_ID NAMA_AREA LUAS_AREA PENDUDUK_ID NAMA_PENDUDUK
------- -------------------- ---------------------- ----------- --------------------
ARS01 Surabaya 1000 PDS01 Susanna
PDJ01 Jocki Henry
ARJ01 Jakarta 2000 PDA01 Asrina Febyanti
PDA02 Abi Anwari

4 rows selected


III. Right Outer Join / Right Join :
Operasi Join tipe ini akan menampilkan semua isi tabel sisi Kanan, walaupun data di pasangan joinnya yg disisi kiri nilainya tidak sama ataupun bernilai null.

dengan script sql berikut (Note => tabel sisi kiri : area; tabel sisi kanan : penduduk) :

select d.Area_id, d.nama_area, d.luas_area, p.penduduk_id, p.nama_penduduk from area d
Right outer join penduduk p on (d.area_id=p.area_id);

akan menghasilkan :

AREA_ID NAMA_AREA LUAS_AREA PENDUDUK_ID NAMA_PENDUDUK
------- -------------------- ---------------------- ----------- --------------------
ARS01 Surabaya 1000 PDS01 Susanna
PDJ01 Jocki Henry
ARJ01 Jakarta 2000 PDA01 Asrina Febyanti
PDA02 Abi Anwari

4 rows selected


dengan script sql berikut (Note => tabel sisi kiri : penduduk; tabel sisi kanan : area) :

select d.Area_id, d.nama_area, d.luas_area, p.penduduk_id, p.nama_penduduk from penduduk p
Right outer join area d on (d.area_id=p.area_id);

akan menghasilkan :

AREA_ID NAMA_AREA LUAS_AREA PENDUDUK_ID NAMA_PENDUDUK
------- -------------------- ---------------------- ----------- --------------------
ARS01 Surabaya 1000 PDS01 Susanna
ARJ01 Jakarta 2000 PDA01 Asrina Febyanti
ARY09 Yogya 4000
ARS02 Solo 3000
ARK01 Kediri

5 rows selected


IV. Cross Join :
Operasi Join tipe ini akan menampilkan semua isi tabel sisi Kiri akan memiliki pasangan semua data disisi kanan.
Banyaknya Record Cross Join = jumlah record tabel pertama x jumlah record tabel kedua

dengan script sql berikut :

select d.Area_id, d.nama_area, d.luas_area, p.penduduk_id, p.nama_penduduk from area d
cross JOIN penduduk p

akan menghasilkan :

AREA_ID NAMA_AREA LUAS_AREA PENDUDUK_ID NAMA_PENDUDUK
------- -------------------- ---------------------- ----------- --------------------
ARS01 Surabaya 1000 PDS01 Susanna
ARJ01 Jakarta 2000 PDS01 Susanna
ARS02 Solo 3000 PDS01 Susanna
ARY09 Yogya 4000 PDS01 Susanna
ARK01 Kediri PDS01 Susanna
ARS01 Surabaya 1000 PDJ01 Jocki Henry
ARJ01 Jakarta 2000 PDJ01 Jocki Henry
ARS02 Solo 3000 PDJ01 Jocki Henry
ARY09 Yogya 4000 PDJ01 Jocki Henry
ARK01 Kediri PDJ01 Jocki Henry
ARS01 Surabaya 1000 PDA01 Asrina Febyanti
ARJ01 Jakarta 2000 PDA01 Asrina Febyanti
ARS02 Solo 3000 PDA01 Asrina Febyanti
ARY09 Yogya 4000 PDA01 Asrina Febyanti
ARK01 Kediri PDA01 Asrina Febyanti
ARS01 Surabaya 1000 PDA02 Abi Anwari
ARJ01 Jakarta 2000 PDA02 Abi Anwari
ARS02 Solo 3000 PDA02 Abi Anwari
ARY09 Yogya 4000 PDA02 Abi Anwari
ARK01 Kediri PDA02 Abi Anwari

20 rows selected


script diatas ekivalen dengan script dibawah ini :

select * from area d, penduduk p;


V. Full Outer Join / Full Join :
Operasi Join tipe ini akan menampilkan semua isi tabel sisi kiri, walaupun data di pasangan joinnya yg disisi kanan nilainya null.dan sebaliknya.

dengan script sql berikut :

select d.Area_id, d.nama_area, d.luas_area, p.penduduk_id, p.nama_penduduk from area d
full join penduduk p on (d.area_id=p.area_id);

akan menghasilkan :

AREA_ID NAMA_AREA LUAS_AREA PENDUDUK_ID NAMA_PENDUDUK
------- -------------------- ---------------------- ----------- --------------------
ARS01 Surabaya 1000 PDS01 Susanna
ARJ01 Jakarta 2000 PDA01 Asrina Febyanti
ARY09 Yogya 4000
ARS02 Solo 3000
ARK01 Kediri
PDJ01 Jocki Henry
PDA02 Abi Anwari

7 rows selected

dengan script sql berikut :

select d.Area_id, d.nama_area, d.luas_area, p.penduduk_id, p.nama_penduduk from penduduk p
full join area d on (d.area_id=p.area_id);

akan menghasilkan :

AREA_ID NAMA_AREA LUAS_AREA PENDUDUK_ID NAMA_PENDUDUK
------- -------------------- ---------------------- ----------- --------------------
ARS01 Surabaya 1000 PDS01 Susanna
PDJ01 Jocki Henry
ARJ01 Jakarta 2000 PDA01 Asrina Febyanti
PDA02 Abi Anwari
ARY09 Yogya 4000
ARS02 Solo 3000
ARK01 Kediri

7 rows selected



VI. Lain-lain
Kadang ada yang terbiasa/lebih suka dengan menggunakan left outer join untuk menghasilkan data seperti yang dihasilkan perintah di inner join. bisa juga sich. caranya filter data sisi kanan yang bernilai null.

dengan script sql berikut :

select d.Area_id, d.nama_area, d.luas_area, p.penduduk_id, p.nama_penduduk from area d
left outer join penduduk p on (d.area_id=p.area_id)
where p.area_id is not null;

akan menghasilkan :

AREA_ID NAMA_AREA LUAS_AREA PENDUDUK_ID NAMA_PENDUDUK
------- -------------------- ---------------------- ----------- --------------------
ARS01 Surabaya 1000 PDS01 Susanna
ARJ01 Jakarta 2000 PDA01 Asrina Febyanti

2 rows selected

atau ada yang suka pake right outer join juga bisa lho.

scriptnya sebagai berikut

select d.Area_id, d.nama_area, d.luas_area, p.penduduk_id, p.nama_penduduk from area d
Right outer join penduduk p on (d.area_id=p.area_id)
where d.area_id is not null;

akan menghasilkan :

AREA_ID NAMA_AREA LUAS_AREA PENDUDUK_ID NAMA_PENDUDUK
------- -------------------- ---------------------- ----------- --------------------
ARS01 Surabaya 1000 PDS01 Susanna
ARJ01 Jakarta 2000 PDA01 Asrina Febyanti

2 rows selected

10 comments:

Anonymous said...

tq ya tutornya, keep spirit bwt terus ngeblog untuk mencerdaskan bagi yang belum bisa,

terutama pake bahasa indonesia

regards

W017917D350

Anonymous said...

Belum jelas tentang pengertian "p" dan "d" pada penjelasan di atas.

Anonymous said...

p atau d itu hanya sebuah perwakilan dari field table tersebut . tapi kalo gak mau pake juga gak apa-apa contoh :

sebelumnnya seperti ini :
select d.Area_id, d.nama_area, d.luas_area, p.penduduk_id, p.nama_penduduk from area d
Right outer join penduduk p on (d.area_id=p.area_id)
where d.area_id is not null;

setelahnnya :
select area.Area_id, area.nama_area, area.luas_area, penduduk.penduduk_id, penduduk.nama_penduduk from area
Right outer join penduduk on (area.area_id=penduduk.area_id)
where area.area_id is not null;

Nah udah paham belum?? tapi sekirannya seperti itu.. menggunakan perwakilan seperti itu akan lebih mudah dan dapat mengurangi script..

Anonymous said...

ka2 makasih banyak ya, aku bisa belajar dari blok ka2

Sampaikan Aja said...

Manta bro, lanjutkan

bkddompu said...
This comment has been removed by the author.
bkddompu said...

mo nanya Gan, kalo untuk dua tabel newbi udah paham (ex. Dua table newbi adalah DBPNS dan AGaMA) queryx seperti ini dan berhasil :
SELECT Count(dbPNS.KD_AGAMA) AS JML_PENGIKUT, AGAMA.KD_AGAMA, AGAMA.NM_AGAMA
FROM dbPNS RIGHT JOIN AGAMA ON dbPNS.KD_AGAMA = AGAMA.KD_AGAMA
GROUP BY AGAMA.KD_AGAMA, AGAMA.NM_AGAMA;

tapi untuk tiga tabel (ex, DB, AGAMA, UNITKERJA) gimana cara dengan right outer join bisa muncul data null (kosong) group by unker,
untuk 3 tabel query :

SELECT DBPNS.KD_UNOR, UNKERBARU.NM_UNOR, AGAMA.NM_AGAMA, Count(DBPNS.KD_AGAMA) AS jumlah_pns
FROM UNKERBARU RIGHT JOIN (DBPNS RIGHT JOIN AGAMA ON DBPNS.KD_AGAMA = AGAMA.KD_AGAMA) ON UNKERBARU.KD_UNOR = DBPNS.KD_UNOR
GROUP BY DBPNS.KD_UNOR, UNKERBARU.NM_UNOR, AGAMA.NM_AGAMA
ORDER BY DBPNS.KD_UNOR;

Newbi monya agama yang kosong tampil jg di tiap NM_unor
mudah2an AGAN paham dengan maksud saya (maaf bahasanya agak amburadul) Salam hangat
muhammad rifansyah

Anonymous said...

makasih ngebantu bgt gan buat uas besok

information technology science said...

Bang... Perbedaannya left join sama right join itu apa yah... Kok outputnya left dan right joinnya itu sama?

Mohon penjelasannya...!!!

information technology science said...

Bang... Perbedaannya left join sama right join itu apa yah... Kok outputnya left dan right joinnya itu sama?

Mohon penjelasannya...!!!