Beranda > basis data > Join Table di MySQL

Join Table di MySQL

setelah mengisi praktikum basisdata kemarin, saya berjanji untuk membuat materi ini… baiklah ini nih.
saya ambil langsung terjemahan dari MySQL 5.0 reference, biar cepet.. hehe…
post ini menjelaskan tentang
(cross join, inner join, right join, left join, natural join, join using)
yang berlaku di MySQL 5

pada suatu kasus, terdapat tabel sederhana pengguna dengan struktur dan data sebagai berikut
tabel pengguna

CREATE TABLE `pengguna` (
`id_pengguna` int(11) NOT NULL auto_increment,
`nama` varchar(20) NOT NULL,
PRIMARY KEY (`id_pengguna`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

tabel pengguna_lengkap

CREATE TABLE `pengguna_lengkap` (
`id_pengguna` int(11) NOT NULL,
`alamat` varchar(50) NOT NULL,
`telepon` varchar(15) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

data:

INSERT INTO `pengguna` (`id_pengguna`, `nama`) VALUES
(1, 'khalifavi'),
(2, 'silvershade'),
(3, 'kaelina');
INSERT INTO `pengguna_lengkap` (`id_pengguna`, `alamat`, `telepon`) VALUES
(1, 'cigiringsing', '081910435544'),
(2, 'cijambe', '022 7815913'),
(4, 'tubagus ismail', '022 91724325');

dari data tersebut, dapat kita lihat bahwa pada tabel pengguna, tidak terdapat record dengan id 4, dan begitu pula pada tabel pengguna_lengkap tidak terdapat record dengan id 3.
apabila dilakukan join biasa maka beberapa record tidak akan tampil seperti yang kita mau

SELECT *
FROM pengguna p, pengguna_lengkap pk
WHERE p.id_pengguna = pk.id_pengguna;

hanya akan menampilkan

id_pengguna nama id_pengguna alamat telepon
1 khalifavi 1 cigiringsing 081910435544
2 silvershade 2 cijambe 022 7815913

2 rows in set (0.01 sec)

lalu dimana yang memiliki id_pengguna 3 dan 4?, untuk itulah ada beberapa join khusus…

untuk menampilkan semua yang terdapat di tabel pengguna namun tidak terdapat di tabel pengguna_lengkap kita bisa menggunakan LEFT JOIN

SELECT *
FROM pengguna p LEFT JOIN pengguna_lengkap pk
ON p.id_pengguna = pk.id_pengguna;

maka akan menghasilkan

id_pengguna nama id_pengguna alamat telepon
1 khalifavi 1 cigiringsing 081910435544
2 silvershade 2 cijambe 022 7815913
3 kaelina NULL NULL NULL

3 rows in set (0.01 sec)

pada penggunaan LEFT JOIN ini, record yang ada di kedua tabel atau hanya di tabel kiri akan selalu ditampilkan, dan akan menghasilkan nilai NULL pada tabel di kanan

begitu pula sebaliknya dengan RIGHT JOIN query ini

SELECT *
FROM pengguna p RIGHT JOIN pengguna_lengkap pk
ON p.id_pengguna = pk.id_pengguna;

akan menghasilkan

id_pengguna nama id_pengguna alamat telepon
1 khalifavi 1 cigiringsing 081910435544
2 silvershade 2 cijambe 022 7815913
NULL NULL 4 tubagus ismail 022 91724325

3 rows in set (0.02 sec)

digunakan untuk menampilkan record yang ada di kedua tabel atau hanya terdapat di tabel kanan

Note: penggunaan SELECT * pada LEFT atau RIGHT join akan menampilkan column yang redundansi. jadi?? kita lanjut…kan

namun mari kita bandingkan dengan penggunaan NATURAL JOIN
SELECT *
FROM pengguna p NATURAL JOIN pengguna_lengkap pk;


id_pengguna nama alamat telepon
1 khalifavi cigiringsing 081910435544
2 silvershade cijambe 022 7815913

2 rows in set (0.00 sec)
hey, ini sama dengan query pertama
SELECT *
FROM pengguna p, pengguna_lengkap pk
WHERE p.id_pengguna = pk.id_pengguna;


id_pengguna nama id_pengguna alamat telepon
1 khalifavi 1 cigiringsing 081910435544
2 silvershade 2 cijambe 022 7815913

2 rows in set (0.01 sec)
jadi bisa dikatakan bahwa ini penyederhanaan query pertama, namun menghapus column yang redundansi, hmmm, solusi yang bagus juga…

Note: hasil NATURAL JOIN sama dengan JOIN … USING
SELECT *
FROM pengguna p NATURAL JOIN pengguna_lengkap pk;

akan menghasilkan output yang sama dengan penggunaan JOIN … USING ini
SELECT *
FROM pengguna p JOIN pengguna_lengkap pk USING (id_pengguna);

ok, sekarang kita kombinasikan NATURAL JOIN dengan RIGHT JOIN
SELECT *
FROM pengguna p NATURAL RIGHT JOIN pengguna_lengkap pk;

id_pengguna nama alamat telepon
1 khalifavi cigiringsing 081910435544
2 silvershade cijambe 022 7815913
4 NULL tubagus ismail 022 91724325

3 rows in set (0.00 sec)
hmmm, untuk yang ini silahkan bandingkan sendiri…

dan mari kita coba INNER JOIN
SELECT *
FROM pengguna p INNER JOIN pengguna_lengkap pk
ON p.id_pengguna = pk.id_pengguna;


id_pengguna nama id_pengguna alamat telepon
1 khalifavi 1 cigiringsing 081910435544
2 silvershade 2 cijambe 022 7815913

2 rows in set (0.00 sec)
yang satu ini benar-benar mirip dengan query pertama, dan tanpa perbedaan sama sekali…

Note: di MySQL, INNER JOIN dan CROSS JOIN ini serupa (dapat saling menggantikan). namun di SQL Standar ini tidak serupa, INNER JOIN dapat menggunakan ON, tapi tidak dengan CROSS JOIN.

Categories: basis data Tag:,
  1. Januari 11, 2009 pukul 6:08 am | #1

    alhamdulilllaaaahhh…akhirnya d kasih contoh juga,,,

    mau tanya,
    ko join…using d access ko incorrect d ‘join’-nya ya??
    trus berarti join using itu bukan pengganti inner join ya?tpi pengganti natural join gitu??

    trus berarti join itu emang cuma buat 2 table ya??

    nuhuun…

    • Januari 11, 2009 pukul 4:16 pm | #2

      yup, di MySQL 5 memang ada beberapa sintaks yang berbeda dengan SQL standar…
      jadi perlu ada beberapa penyesuaian.., tapi semua contoh disini sudah lolos uji coba menggunakan MySQL 5,
      tapi saya tidak tahu kalo di Access ada sintaks JOIN USING, atau mungkin memang tidak ada… (tidak ketemu di help…)

  2. Februari 11, 2009 pukul 9:22 am | #3

    Ukh Akhirnya……

    saya ga ngerti gimana caranya menggabungkan 2 tabel…
    n kata guru sy harus pke join…

    nanya ke guru.. eh.. trnyata dy jg ga bisa…

    UMm.. mkasih eA…

    mau tnya donk…
    JOIn hanya bisa di gunakan untuk 2 tabel?

    ad postingan tentang normalisasi & relasi antar tabel g?

    mkci….^_^

    • Februari 11, 2009 pukul 10:50 am | #4

      syukurlah kalau bisa membantu mbak,
      ga juga, join tabel bisa digunakan untuk lebih dari 2 tabel…
      contoh query: SELECT * FROM tbla NATURAL JOIN tblb NATURAL JOIN tblc;
      yang seperti di atas juga jalan, dan mengikuti aturan natural join yang membandingkan field dengan nama serupa. join biasa juga bisa digunakan…
      untuk normalisasi dan relasi antar tabel, kebetulan belum saya buat :D ,
      jadi silahkan untuk mereferensi ke om Wikipedia
      model relasional, database relasional(lebih teknis), normalisasi database/tabel

      semoga membantu… :)

  3. Lukman
    Februari 12, 2009 pukul 8:53 am | #5

    saya mau minta tolong,
    queri untuk input data (insert) dari beberapa tabel sekaligus. ???

    • Mei 7, 2009 pukul 3:52 pm | #6

      wah mas Lukman, kalau insert tabel setahu saya hanya untuk satu tabel, namun bisa sekaligus banyak row. di MySQL bisa gunakan sintaks
      INSERT INTO tabel(id, deskripsi) VALUES (1, 'isi row pertama'), (2, 'isi kedua'), dst...

  4. Mei 1, 2009 pukul 1:35 pm | #7

    ass.tolong beri contoh mySQL pront tenteng RELASI 2 TABEL DAN 3 TABEL…. d tggu????

    • Mei 7, 2009 pukul 4:48 pm | #8

      MySQL saja mungkin mas, querynya seperti ini, jika ditemukan 3 tabel :
      t_pegawai – id_pegawai, nama, alamat; –tabel pegawai
      t_perusahaan – id_perusahaan, nama, alamat; –tabel perusahaan
      t_jabatan – id_jabatan, deskripsi, gaji; –tabel jabatan

      untuk menghubungkannya bisa dengan menentukan jenis relasi antar tabel terlebih dahulu (one2one, one2many, many2many).
      Dalam kasus ini, bila satu perusahaan dapat memiliki banyak pegawai, dan satu jabatan bisa dimiliki oleh banyak pegawai. maka kondisi one2many ditetapkan. dan pada tabel t_pegawai perlu ditambahkan id milik t_perusahaan, begitu juga dengan id dari t_jabatan.
      Struktur t_pegawai jadi seperti ini
      t_pegawai – id_pegawai, id_perusahaan, id_jabatan, nama, alamat; –tabel pegawai

      dan untuk menampilkan nama pegawai, nama perusahaan, jabatan, dan alamat pegawai bisa menggunakan query ini
      SELECT t_pegawai.nama, t_perusahaan.nama, t_jabatan.deskripsi, t_pegawai.alamat
      FROM t_pegawai, t_perusahaan, t_jabatan
      WHERE t_pegawai.id_perusahaan = t_perusahaan.id_perusahaan AND t_pegawai.id_jabatan = t_jabatan.id_jabatan;

      atau bila menggunakan klausa join, bisa digunakan query yang lebih sederhana
      SELECT t_pegawai.nama, t_perusahaan.nama, t_jabatan.deskripsi, t_pegawai.alamat
      FROM t_pegawai JOIN t_perusahaan USING (id_perusahaan) JOIN t_jabatan USING (id_jabatan)

      semoga membantu mas willi…

  5. r3q
    Mei 22, 2009 pukul 3:33 am | #9

    untuk jumlah row yang sedikit memang tidak berpengaruh, bagaimana kalau jumlah record table a=1021 dan table b=166841?

    rumus tersebut tidak berlaku lagi.

    • Mei 23, 2009 pukul 10:32 am | #10

      mas r3q, saya tidak begitu mengerti maksud anda dengan kata ‘tidak berpengaruh’, query tersebut memang query yang biasa digunakan. Jika masalahnya adalah waktu menampilkan data, mungkin klausa ‘LIMIT dari_record, jumlah_record’ di MySQL bisa membantu.

  6. dee
    Juni 17, 2009 pukul 9:59 am | #11

    thanks…
    :)

  7. Juni 22, 2009 pukul 12:40 am | #12

    saya mau buat (1)artikel paling banyak di komentari sama (2)pengomentar terbanyak mas(berdasarkan nama aja), mohon bantuannya. tablenya 2

    -tb_artikel
    id
    judul
    isi

    -tb_komentar
    id
    id_artikel
    nama
    komentar

    gmana command sql dan script phpnya tuh mas?

    • Juli 11, 2009 pukul 4:48 am | #13

      maaf mas anton sudah menunggu lama, sebulan untuk saya balas, meskipun belum tentu terpakai lagi oleh mas anton, semoga bermanfaat bagi orang lain..

      keduanya menggunakan fungsi agregasi COUNT()

      untuk 1) artikel paling banyak dikomentari, daftarnya bisa diambil dengan query
      SELECT ar.judul, COUNT(k.id) jumlah_post
      FROM tb_artikel ar, tb_komentar k
      WHERE k.id_artikel = ar.id
      GROUP BY ar.judul
      ORDER BY ar.id

      untuk mendapatkan hanya yang tertinggi saja, gunakan saja klausa LIMIT di ujungnya menjadi
      SELECT ar.judul, COUNT(k.id) jumlah_post
      FROM tb_artikel ar, tb_komentar k
      WHERE k.id_artikel = ar.id
      GROUP BY ar.judul
      ORDER BY ar.id
      LIMIT 1

      sedangkan untuk 2) pengomentar terbanyak berdasarkan nama, dapat digunakan query
      SELECT nama, COUNT(id) jumlah_komentar
      FROM tb_komentar
      GROUP BY nama
      ORDER BY jumlah_komentar DESC

      sama dengan solusi 1), jika ingin hanya menampilkan 1 record saja, bisa menggunakan klausa LIMIT 1

      semoga membantu…

  8. adi
    Juli 7, 2009 pukul 9:35 am | #14

    maz nanya kl mw ngurutkan berdasarkan nilai….tetapi ada 2 tabel dimana tabel pertama itu data tent siswanya terus tabel 2 tabel nilai siswa la tabel nilai siswa itu terdapat 4 nilai ipa,bhs indo,bhs inggrs,mat la mwnya diurutkan berdasarkan total nilai tersebut

    • Juli 13, 2009 pukul 6:26 am | #15

      mas adi, akan lebih jelas kalau mas menyertakan struktur tabelnya secara rinci, atau yang saya pahami, struktur tabelnya saya asumsikan seperti ini.
      t_siswa; nis, nama, alamat.
      t_nilai; nis, n_ipa, n_bind, n_bing, n_mat.
      dan untuk menampilkan data nilai yang dijumlahkan adalah dengan cara penjumlahan biasa pada field tiap cell nilai
      kira-kira querynya akan seperti ini
      SELECT s.nama, (n.n_ipa+n.n_bind+n.n_bing+n.n_mat) total_nilai
      FROM t_siswa s, t_nilai n
      WHERE s.nis = n.nis
      ORDER BY total_nilai DESC

      query tersebut akan menampilkan nama siswa dan nilai totalnya terurut berdasarkan total nilai.

  9. Oktober 12, 2009 pukul 9:25 pm | #16

    sip keren bos..!! keep update…!!

  10. Oktober 22, 2009 pukul 12:37 am | #18

    ..mas,jelaskan mysql for php dan relasi data (inner join,cross join,outer join)
    kalo ada minta situs2 lengkap yg membahas prtnyaan saya trsebut

    thx

    • Oktober 22, 2009 pukul 5:31 pm | #19

      mba’ yiolent, maaf sebelumnya jika semua sumber yang saya tawarkan dalam bahasa inggris, bukan karena tidak ada dalam bahasa Indonesia, tapi lebih karena dokumentasi legal dari php adalah dalam bahasa inggris. (untuk materi berbahasa Indonesia, bisa dicoba untuk berkunjung ke ilmukomputer.org)
      langsung saja:
      tentang php + mysql (atau mysql dalam php).

      contoh penggunaannya ada di Mysql extension overview example
      sedangkan kalau mengenai inner join dan cross join di Mysql sudah saya jelaskan diatas :)
      outer join, biasa digunakan untuk right join (right outer join) ataupun left join (left outer join), ada lagi full outer join yang menggabungkan antara right dan left join(di Mysql tidak ada, hanya terdapat dalam definisi di Wikipedia)

  1. Belum ada trackback.