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.

124 tanggapan untuk “Join Table di MySQL”

  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…

    1. 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. 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….^_^

    1. 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… 🙂

    1. 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...

      1. pakai fungsi pengulangan gmn ? bisa ko..
        for blabla2. atw while ()

        respon:
        memang bisa, tapi itu di logis program (PHP, etc.) dan bukan di query SQL-nya

    1. 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…

      1. maaf mas klo boleh menyela sedikit pada waktu klausa join klo , dalam tabel tersebut tidak ada foreign key apa bisa dijalankan,,,,?

      2. SELECT a.nama, b.nama, c.deskripsi, a.alamat
        FROM t_pegawai a, t_perusahaan b, t_jabatan c
        WHERE a.id_perusahaan = b.id_perusahaan AND a.id_jabatan =c.id_jabatan;

        ———————->>>> Maaf Menggagu kepanjangan sih, tak pendekin ya ^^

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

    rumus tersebut tidak berlaku lagi.

    1. 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.

  4. 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?

    1. 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…

  5. 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

    1. 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.

    1. 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)

  6. blh tanya ga mas…. gimana caranya pemanggilan dengan problem ini
    saya punya 2 table
    1. new > no_kategori(int), judul_berita, headline_berita, isi_berita
    2. category > no_kategori(int), nama_kategori

    seandainya saya punya 3 nama kategori
    dan di setiap kategori terdapat 2 judul berita

    yang jadi pertanyaan saya:
    bagaimana mysql_query buat pemanggilan banyaknya judul kategori berdasarkan nama kategori dalam fungsi

    Tolong pencerahannya yah mas…..

    Salam kenal

  7. oh iya mas…. tepatnya mirip dengan tab “kategorinya :)” yang mas punya…. perbedaannya tidak pake count yang menyatakan banyaknya jumlah kategori…. tapi menyatakan judul dari kategori tersebut mas

    1. boleh mas, mungkin yang saya tangkap pertanyaan mas welly ini di fungsi PHP ya?!
      saya lihat di tabel yang mas sediakan, pada tabel news kurang id (jadi akan saya anggap sudah ada sekarang)

      news | id_news, no_kategori(int), judul_berita, headline_berita, isi_berita
      category | no_kategori(int), nama_kategori

      kalau untuk query mysql-nya bahkan lebih sederhana mas:
      SELECT * FROM category
      dan nanti untuk menampilkannya di PHP bisa dengan cara
      php
      $query = "SELECT * FROM category";
      // jalankan query
      $hasil = mysql_query($query);
      // ambil dan tampilkan masing-masing kategori
      while($row = mysql_fetch_array($hasil)){
      echo "{$row['nama_kategori']}
      ";
      }
      ?>

      dan untuk menampilkan kategori berdasarkan masukan pengguna (atau mungkin link yang sudah ditentukan), seperti http://blogsaya.com/index.php?kategori=pendidikan, bisa menggunakan
      versi sederhananya
      $kategori = $_GET['kategori'];
      $query = "SELECT * FROM category c, news n WHERE c.no_kategori = n.no_kategori AND c.nama_kategori = '{$kategori}'";
      // jalankan query
      $hasil = mysql_query($query);
      // ambil dan tampilkan hasil dari penyaringan isi dengan kategori yang ditentukan
      while($row = mysql_fetch_array($hasil)){
      echo "<h1>{$row['judul_berita']}</h1>";
      echo "<p>{$row['isi_berita']}</p>";
      echo "<hr />";
      }
      ?>

      semoga bisa membantu
      ~khalifavi

    1. bisa kang, tapi desain tabelnya disatukan semua, tapi data antar tabel nantinya jadi redundansi (banyak data yang ganda/berulang di tabel lain).
      cara menggabungkan data(field tabel) ini dinamakan denormalisasi, digunakan untuk meningkatkan performa database server, agar query berjalan lebih cepat.
      untuk di DBMS lain, saya tidak menjamin query diatas berjalan dengan baik, tapi ada baiknya dicoba, karena query MySQL mendekati standar ANSI SQL. dengan kata lain, mungkin memerlukan perubahan satu-atau-dua kata dalam sintaksnya.
      begitu setau saya kang, 🙂

  8. bedax cross join n inner join ap she????cuz dPraktikumQ Z coba,,,,hasilnya g ada bedax,,,sama persis….
    left join mis. tabel salesman dengan jual & left join jual dengan salesman bedanya juga apa?????thx b4

  9. mas.. mau tanya untuk format join.
    kalo saya mau join 2 table dengan structure
    table1. id ,orderid ,prodcode ,qty ,unitprice ,total ,shorttext
    table2.id ,name ,email ,address ,codepostal ,city ,telephone ,ordercode ,orderdt ,total ,status ,tax

    sedangkan dari 2 table tersebut tidak memiliki link yg bisa dihubungkan. bagaimana mas?

    regard,

    1. @mas alto:
      bisa saja mas, tinggal dibuat tabel ketiga yang memiliki foreign key dari kedua tabel diatas, struktur seperti ini disebut juga “many-to-many” dalam desain entity relationship diagram.
      dan kalau boleh saya ambil contoh hubungan antara
      mahasiswa(nim, nama, alamat) dan
      matakuliah(kodemk, namamk, semester)
      diantara keduanya ada hubungan yang dinamakan kontrak kuliah, maka kita buat tabelnya
      kontrak_kuliah(id, nim, kodemk, tingkat) <- di tabel ini nim dan kodemk adalah foreign key dari tabel parentnya (mahasiswa dan matakuliah)
      untuk melakukan join, mas bisa menggunakan
      SELECT * FROM mahasiswa LEFT JOIN kontrak_kuliah ON mahasiswa.nim=kontrak_kuliah.nim
      LEFT JOIN matakuliah ON matakuliah.kodemk=kontrak_kuliah.kodemk

      disini join dilakukan dua kali, karena untuk mencocokkan antara mahasiswa dengan kontrak_kuliah, dan matakuliah dengan kontrak_kuliah.
      semoga membantu
      khalifavi

  10. ok mas. terimakasih.
    tapi ternyata ada link dari 2 table itu mas. cm namanya yg berbeda.
    jadi di table 1. dia memakai field “id” sedangkan ditable yg kedua memakai “orderid”.
    secara nama tidak sama, tetapis ecara isi dari field itu sama.
    bagaimana mas kalo semacam itu?
    terimakasih.

  11. baik mas alto, maaf kalau sebelumnya tidak saya perhatikan jika ada kaitan diantara kedua tabel tersebut. karena memang dari nama tabel kurang sesuai (tertulis table1, dan table2).
    untuk menghubungkan kedua tabel dengan query join, kita tinggal mengganti sumber pada bagian … ON … menjadi kurang lebih seperti ini
    SELECT * FROM table1 LEFT JOIN table2 ON table1.orderid=table2.id
    kurang lebih begitu mas, semoga membantu
    khalifavi

  12. mas mau tanya nih.. gimana ya cara menampilkan data 2 tabel contoh:
    tabel “Contact” fieldnya no,nama, alamat &
    tabel “inbox” fieldnya no, isi, waktu.
    data yg ingin ditampilkan
    no, nama, isi, waktu
    saya udah gunakan INNER Join yang tampil hanya data tertentu saja, sedangkan apabila data no itu tidak ada di tabel contact maka datanya ga tampil. gimana dunk solusinya.

  13. mas bambang, INNER JOIN itu bisa dianggap sebagai join biasa yang bisa juga dilakukan dengan SELECT * FROM t1,t2 WHERE t1.id = t2.id_t1.
    namun kelemahannya bila record di t1 tidak ada kaitan dengan t2 (id_t1), maka data tidak akan tampil sama sekali, dan solusinya yaitu menggunakan LEFT/RIGHT JOIN, keduanya sudah dicontohkan diatas. semua record dari kedua tabel akan tampil, dan jika ada record yang tidak terkait, maka akan ditampilkan sebagai NULL.

    @artvisualizer: sama2 kang, senang bisa membantu..

  14. 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.”

    apa sql standar ???

  15. kang , iziin tanya y. mw buat laporan seperti ini
    prioritasid || jml_prioritasid ||statusid=S02 || statusid=S10 || statusid=S11

    dengan
    format requestuser{
    id
    owner
    prioritasid
    subject
    uraianmasalah
    solusiid
    statusid
    userid}

    status_keluhan{

    INSERT INTO `status_keluhan` (`statusid`, `deskripsi`) VALUES
    (‘S01’, ‘Draft’),
    (‘S02’, ‘Open By Requester’),
    (‘S10’, ‘Finished by Skill Person’),
    (‘S11’, ‘Unsolved by Skill Person’),
    (‘S12’, ‘Re-open by Requester’);
    }
    trima ksh kang

    1. Menurut saya pertanyaannya kurang jelas.
      Tapi dari yang saya mengerti, maksud dari querynya untuk meng-agregat jumlah record dari prioritas-id yang sesuai dengan status_keluhannya ya?!. jml_prioritas_id adalah totalnya, sedangkan kolom statusid itu jumlah masing-masingnya. Jika memang begitu, berarti querynya sebagai berikut…

      SELECT ru.prioritas_id, total.s jml_prioritas_id,
      (SELECT COUNT(total.status_id) FROM DUAL WHERE total.status_id = 'S02') s02,
      (SELECT COUNT(total.status_id) FROM DUAL WHERE total.status_id = 'S10') s10,
      (SELECT COUNT(total.status_id) FROM DUAL WHERE total.status_id = 'S11') s11
      FROM requestuser ru,
      (SELECT ru.prioritas_id, COUNT(*) s, ru.status_id FROM requestuser ru, status_keluhan sk WHERE ru.status_id = sk.status_id GROUP BY ru.prioritas_id) total
      WHERE ru.prioritas_id = total.prioritas_id
      GROUP BY ru.prioritas_id;

      itu query kasarnya, kalau ada yang lebih sederhana tapi memenuhi silahkan berbagi disini..

  16. ass … salam kenal ..
    saya sedang buat query dari view (hasil join dari beberapa tabel) namun baru sadari ada beberapa data yang tidak ada view tsb
    mohon bantuan faktor apa saja mempengaruhi tidak terikutnya data tsb ke view
    sementara saya cek ke tabel aslinya “ada”. dengan format yang benar.

    terima kasih, mohon dibantu
    salam
    toni

    1. waalaykum salam wr.wb.
      salam kenal juga..
      sebelumnya, saya mohon maaf bila mengenai view ini saya juga hanya pernah mencoba (belum begitu paham)
      tapi sejauh yang saya tahu, karena view ini adalah rekaman query, maka bila query tersebut bisa dijalankan, dapat berjalan pula di view (meskipun ada beberapa pembatasan)
      tapi akan saya perdalam dan tuliskan di post baru.

  17. Mas… saya punya kesulitan… kalo berdasarkan yang di contohkan mas di atas… ingin memunculkan yang id 4 saja…
    jadi.. memunculkan id yang belum dipakai oleh tabel pengguna, tetapi ada di tabel pengguna lengkap…

    terima kasih sebelumnya

    1. itu tidak perlu menggunakan join mas, tapi pakai NOT IN ditambah subquery sederhana, dan querynya jadi seperti ini
      SELECT * FROM pengguna_lengkap WHERE id_pengguna NOT IN (SELECT id_pengguna FROM pengguna)
      dan keluarannya akan jadi seperti ini

      id_pengguna alamat telepon
      4 tubagus ismail 022 91724325

      silahkan dicoba, semoga membantu

      1. Thx mas… tapi saya Kalo memakai Query itu kalo datanya banyak mengurangi performance… dan akhirnya tadi baru dapat dari help mysqlnya juga memakai select * from pengguna a RIGHT JOIN pengguna_lengkap b on a.id=b.id where a.id is null

      2. memang begitu sih, yang subquery cocok sebagai solusi praktis saja…
        jelas performanya akan terasa pada tabel dengan jumlah record yang besar, mengingat pada subquery kita secara tidak langsung menjalankan 2 query.
        tidak seperti saat menggunakan join yang filteringnya disimpan di WHERE.
        trims sudah berbagi mas 🙂

  18. mas mau nanya, aku punya 2 tabel , pertama tabel siswa dengan field induk, nama dan kelas, dan tabel pelanggaran dengan field induk, j_pelanggaran dan tanggal, aku ingin membuat form pertama user memasukkan induk kemudian kemudian program mencarinya dalam tabel siswa dan jika ada ditampilkan di layar, kemudian di form itu tinggal mengisi pelanggaran dan tanggal dan kemudian datanya tersimpan dalam tabel pelanggaran, terimakasih.

    1. kalau itu bisa dilakukan lewat program mas..
      jadi algoritmanya seperti ini
      1. kita cari data yang induknya sama dengan input user (dengan query SELECT dan fetch tentunya)
      2. jika ada maka ditampilkan di layar (dengan induk sebagai hidden field) sekaligus dengan input field jenis pelanggaran
      3. jika tidak ada tampilkan pesan.

      dan biasanya itu dilakukan lewat php, semoga membantu.

  19. mau tanya nii,, gimana nge-relasi in 7 table yang menghasilkan table tersebut saling berhubungan..
    mohon petunjuknya mas..!!

    mksiii..

    1. begini mbak, kalau memang mau dijoin (misal LEFT JOIN), tinggal dicoba saja kurang lebih seperti ini
      SELECT *
      FROM tabel1
      LEFT JOIN tabel2 ON tabel1.id=tabel2.id
      LEFT JOIN tabel3 ON tabel2.id=tabel3.id
      LEFT JOIN tabel4 ON tabel3.id=tabel4.id
      dst...

    1. seharusnya jalan mbak, contohnya seperti di komentar yang sebelumnya…
      atau akan lebih membantu jika mbak mencantumkan apa kesalahan yang muncul di query yang mbak punya

  20. Akhirnya nemu juga tutorial lengkap ini …makasiy ya om…
    om mu tanya neh jadi utk join bagusnya pake yg mana yah?? Asumsikan kalo datanya banyak bgt,..

  21. mas saya mau tanya bagai mana cara merelasikan 2relasi pada 2 tabel
    tabel yang saya punya :
    – tr_item = id,item_name,Rcpmd_item_group,Rcpmd_item_category
    – cp_masterdata = id,md_name,md_description
    field yang berawalan R itu relasi ke id cp_masterdata yang hasilnya md_description gimana sintaxnya ????

  22. Terimakasih OM..
    Penjelasan anda mudah dipahami..
    OM. kapan mw bahas tentang INDEX & VIEW..?
    Punya referensi yg komplit+jelas tentang INDEX & VIEW yg dlm bhs indonesia..?

    1. Wah, syukurlah kalau bisa dipahami, tulisan saya tentang Index dan View itu belum sempat saya lanjutkan *lupa* 😀
      nanti saya posting segera deh, mumpung besok libur 🙂
      tapi ini tentang Index yang saya temukan, yang untuk saya sendiri mudah dimengerti, moga membantu INDEKS DALAM BASIS DATA

  23. Maaf mas, pengen ikutan nanya nih…
    kalo pengen tampilin relasi many to many tapi rows dari tabel pertama cuma di tampilin satu kali saja bgmn??

    1. kalau saran saya, di database cukup return null saja, sedangkan handlernya ditangani di program, jika null, tampilkan sebagai ‘0.00’, praktisnya seperti itu 🙂

  24. terimakasih banyak mas atas semua ulmu yang engkau berikan disini … semoga mendapatkan 7 X lipat dari apa yang mas berilan kepada saya … 🙂

  25. terima kasih buat tutorialnya mas…
    mas…bagaimana kalau misalnya saya punya dua tabel…(asumsi tabel1 dan tabel2)…
    dan saya hanya ingin menampilkan data dari tabel1 yang nilainya (FK) tidak sama dengan FK yang dari tabel 2….
    terima kash

    1. sama sama mbak 🙂
      maksud mbak icha bagaimana?, saya belum coba yang seperti itu, tapi sepertinya bisa menggunakan (RIGHT/LEFT) JOIN ON table1.kolom table2.kolom
      semoga berhasil 🙂

    1. maaf terlambat menjawab mas,
      sudah setahun lalu -_-“, maaf sekali lagi

      • query itu sama dengan permintaan, spesifiknya kode permintaan kita ke database, biasanya untuk meminta data, menggunakan SELECT
      • field adalah baris pada tabel, atau lengkapnya nama, tipe, dan hal yang berkaitan dengan data pada baris terkait, biasanya di tabel mahasiswa terdapat field seperti NIM, NAMA, ALAMAT, dll
      • table adalah tabel, katakan saja tabel adalah kontainer (bungkus) untuk menyimpan data yang kita inginkan. Contohnya tabel mahasiswa (NIM, NAMA, dll)
      • column merupakan kolom, disebut juga row, atau bisa juga disebut record, adalah isi dari tabel yang tadi kita bahas. Misalkan dalam tabel mahasiswa (NIM, NAMA, ALAMAT) terdapat sebuah record (0608825, KHALIFA VISI ISLAMI, CIGIRINGSING 10B)
      • index sama seperti index yang ada di buku, pada konsepnya index digunakan untuk kunci pencarian dalam keseluruhan data (berupa tabel-tabel)
      • entitas merupakan istilah dalam Diagram Entity-Relationship, bukan secara langsung istilah dalam basis-data. Tapi secara pendeknya, entitas adalah suatu komponen (nantinya akan jadi tabel) yang bisa berdiri sendiri pada suatu sistem. Contohnya, MAHASISWA dan BUKU adalah masing-masing bisa berdiri sendiri, entitas pada sistem perpustakaan, dan keduanya bisa jadi tabel, namun PEMINJAMAN, meskipun bisa jadi tabel tetap bukan entitas, karena tidak dapat berdiri sendiri melainkan terkait dengan entitas MAHASISWA dan BUKU, oleh karena itu disebut relation.

      Iya, saya paham kalau jawabannya masih kurang bisa dimengerti, mungkin saya sedikit bertele-tele 😀
      tapi lengkapnya silahkan dilihat di Pengertian Database pada Wikipedia dalam bahasa Inggris, ada juga dalam bahasa Indonesia, tapi sayang kurang lengkap 😦

    1. disini p disebut alias, yaitu alias dari tabel pengguna
      jadi pada keseluruhan query, kita nanti bisa menggunakan alias seperti p.nama yang biasanya kalau tanpa alias akan jadi pengguna.nama

      menghemat karakter kan?! 🙂

  26. Siang Mas
    Saya ingin membuat subkategori saya sudh punya 3 database:

    1. id_produk int(5)
      id_kategori int(5)
      id_subkategori int(5
      nama_produk varchar(100)
    2. id_kategori int(5)
      nama_kategori varchar(100)
      kategori_seo varchar(100)
    3. id_subkategori int(5)
      nama_subkategori varchar(100)
      subkategori_seo varchar(100)

    Sy sudah coba penulisan phpny seperti ini :

    $kategori=mysql_query("select nama_kategori, kategori.id_kategori, kategori_seo,
    count(produk.id_produk) as jml
    from kategori left join produk
    on produk.id_kategori=kategori.id_kategori
    group by nama_kategori");
    while($k=mysql_fetch_array($kategori))
    echo "";
    echo "$nama_kategori";
    echo "";
    $sql = "SELECT * FROM subkategori WHERE id_kategori=$id
    ORDER BY id_subkategori DESC";
    $hasil = mysql_query($sql);
    while($r=mysql_fetch_array($hasil)){
    echo "$nama_subkategori";

    Kenapa saat di bagian subkategori tdk muncul menunya.tolong bantuannya mas.tq

  27. saya punya tabel t_perubahanstatus (no_perub,jns_perub,nop,npwp,nik,ket_perub,tgl_perub,saksi1,saksi2)
    dan t_pembagian (no_perub,no_wp,no_wpwaris,nik,nm_ahliwaris)
    no_perub dari t_perubahanstatus saya link kan ke t_pembagian so…jika d klik no_perub dari t_perubahanstatus maka yang muncul hanya
    beberapa record yang mempunyai no_perub yang sama dengan t_pembagian

    pertanyaan saya
    gimana mas caranya menampilkan tabel dari t_pembagian tapi yang d ambil cuma record yang mempunyai no_perub yang sama dengan no_perub dari t_perubahan status?
    intinya jika d klik no_perub dari t_perubahanstatus maka yang muncul hanya
    beberapa record yang mempunyai no_perub yang sama dengan t_pembagian
    nb: yang tampil t_pembagian tp gag semua record d tampilkan, hanya record tertentu yang mempunyai no_perub yang sama
    thank before eaw mas….tolong d bantu…:(

    1. sebenarnya saya kurang jelas dengan pertanyaan mbak zahroh 😀
      tapi sebagai catatan, yang namanya join itu untuk menggabungkan atau sederhananya menampilkan data dari dua tabel atau lebih menjadi satu, dan kasusnya sepertinya sedikit berbeda…

  28. $sql = mysql_query(“select a.kd_brg, a.nm_brg, b.nm_unit, c.jumlah_setuju, d.tgl_hilang, d.jumlah from barang a, pembelian b, persetujuan c, hilang d
    where a.kd_brg = b.kd_brg and b.kd_brg = c.kd_brg and c.kd_brg = d.kd_brg order by d.id_hilang desc”);

    mohon pencerahannya mastah , bingung nampilin dr join 4 tabel …

    1. wah, saya belum pernah ketemu join yang ‘merepotkan’ seperti itu sebelumnya..
      tapi kalau pake LEFT JOIN juga bisa dilakukan, tinggal ganti baris WHERE jadi

      FROM barang a
      LEFT JOIN pembelian b ON a.kd_brg = b.kd_brg
      LEFT JOIN persetujuan c ON b.kd_brg = c.kd_brg
      LEFT JOIN hilang d = ON c.kd_brg = d.kd_brg

      tapii, sepertinya tetap ada yang salah dengan struktur tabelnya -_-”

      jadi lain kali kasusnya yang jelas ya 🙂

  29. assalamu’alaukum, ada contoh mengambil data lebih dari 2 tabel,seperti 4 tabel??,, misal ada 3 query :

    Query 1. select namaPasien,NIKPasien,alamatPasien from pasien where idPasien = (select idPasien From hasildiagnosapasien,transaksi Where hasildiagnosapasien.idTransaksi = transaksi.idTransaksi)

    Query 2. select jenisPemeriksaan, tanggalPemeriksaan from transaksi,hasildiagnosapasien where transaksi.idTransaksi = hasildiagnosapasien.idTransaksi

    Query 3 select namaDokter, pilihanDiagnosa, kesimpulanDiagnosa, kesanDiagnosa from hasildiagnosapasien,diagnosa where hasildiagnosapasien.idDiagnosa = diagnosa.idDiagnosa

    semua itu hasil dari 4 tabel yaitu pasien,transaksi,hasildiagnosapasien,diagnosa
    (pasien.idPasien=transaksi.idPasien , transaksi.idTransaksi=hasildiagnosapasien.idTransaksi, hasildiagnosapasien.idDiagnosa=diagnosa.idDiagnosa)

    kalo mau mengambil data namapasien,NIKPasien,alamatPasien,jenisPemeriksaan,tanggalPemeriksaan,pilihanDiagnosa,namaDokter,kesimpulanDiagnosa,kesanDiagnosa (ketiga query dijadikan 1)

    bagaimana menggabungkan ketiga query tersebut?? dari 4 tabel yang memiliki banyak kondisi..
    terimakasih..

    1. wa’alaykumsalam warahmatullahi wabarakatuh 🙂
      waah, terlihat tidak begitu sederhana, akan sangat membantu apabila ada struktur tabelnya (bukan sekedar query), karena ada beberapa bagian yang memang harus jelas (contoh di bagian query 3, tidak jelas field mana dari tabel diagnosa atau tabel hasildiagnosa).

      sebenarnya dari struktur tabel yang saya asumsikan saya rasa masih kurang pas, mungkin mbak ingin membaca Tutorial Diagram E-R oleh Creately dalam bahasa Inggris

      mungkin dengan struktur tabel yang jelas bisa saya selesaikan.
      mohon maaf tidak begitu membantu 😀

  30. udah lama gak ngoprek query, diminta ngoprek mysql, nyari referensi join, ketemu blog ini. drop a hi message 🙂

  31. mas pengen donk rumus buat phpnya …

    aku mau membuat web nie tapi masih banyak yang harus aku pelajarin saat ini

    minta bantuan dari semuanya

  32. thank mas,,,
    akhirnya join 3 tabel udah lumayan ngerti….
    kapan bahas materi procedure, function n trigger mas??
    masih bingung materi itu
    ditunggu ya mas:))

  33. absensi pake RFID,tiap siswa memiliki kartu (tag),jika absen,siswa ckup jalan lewat gerbang sekolah (sambil membawa kartu di dlm dompet:misal) maka secara otomatis akan terabsen dan masuk kedatabase tbl_absen,nah kendalanya gimana klo yg tidak hadir supaya masuk ke database tbl_absen dengan field ket menjadi tidak hadir. . . filed
    tbl_absen : nis,hari,tanggal,nama,kelas,jam,ket
    tbl_siswa : kode_rfid,nis,nama,jns_kel,kelas,agama,alamat,tmp_lahir,tgl_lahir dst
    query buat menampilkan siswa yang tidak hadir

  34. Mas, kalau saya boleh minta bantu,
    saya mengalami kendala dengan join 4 table,
    contoh kasusnya begini.
    saya ada 4 table
    table1, table2, table2,dan table4
    table1 – id, nama, ttl, alamat
    table2 – id, desa, kecamatan, kota
    table3 – id, kabupaten, provinsi,
    table4 – id, no_hp, status.

    bagaimana cara saya untuk menggabungkan ke empat table tersebut dengan menggunakan inner join, dan hasilnya seperti ini mas
    | nama | ttl | alamat | desa | kabupaten | no_hp | status |

    saya sudah membuat relasi antar table tersebut.
    tolong solusinya mas…
    terima kasih

    1. Hmm, kalau saya lihat, ini keempat tabel tidak terkait satu sama lain, jadi jujur saya bingung bagaimana untuk memunculkan hasil yang mas/mbak maksud…

      anggap saja begini,
      table1 (pengguna), table2 (wilayah), table3 (wilayah_kotakab), table4 (kontak)
      untuk menggabungkan masing-masing tabel saya tambahkan beberapa field (foreign key), menjadi
      pengguna – id, id_wilayah, nama, ttl, alamat
      wilayah – id, id_wilayah_kotakab, desa, kecamatan
      wilayah_kotakab – id, kota_kabupaten, provinsi,
      kontak – id, id_pengguna, no_hp, status.

      sisanya terkait kota dan kabupaten saya gabungkan agar lebih relevan (menurut saya)

      setelah terkait dengan struktur tabel tersebut, maka JOIN dapat dilakukan dengan query ini
      SELECT p.nama, p.ttl, p.alamat, w.desa, wk.kota_kabupaten, k.no_hp, k.status
      FROM pengguna p
      INNER JOIN kontak k ON p.id = k.id_pengguna
      INNER JOIN wilayah w ON p.id_wilayah = w.id
      INNER JOIN wilayah_kotakab wk ON w.id_wilayah_kotakab = wk.id;

      kira-kira begitu, silahkan dicoba, kalau ada hambatan silahkan kembali 🙂

      1. pak jika seperti ini pak

        1. perkembagan sk
        -id_perkembagan
        – kode_kab**
        -luas
        -bpkh
        -fungsi_hit

        2. kabupaten
        – kode_kab*
        – kode**
        -kabupaten
        3. provinsi
        -kode*
        -provinsi

        nanti di gabunginnya gmna ya ?

        jadi seperti ini gan

        || id_perkembangan || kode || provinsi || bpkh ||fungsi_hut ||

        minta pencerahannya gak

    1. kalau INSERTnya itu terkait, yang pertama dilakukan adalah INSERT ke tabel utama dulu, ambil id dari hasil INSERT tersebut, kemudian gunakan id itu untuk INSERT sebagai foreign key ke tabel berikutnya.

  35. mas tolong bantu saya dong,
    kasusnya begini :
    masterbarang(kodebarang,namabarang,stokbarang)
    suratjalan(kodesj,nama,tgltujuan)
    detilsuratjalan(kodesj,kodebarang,jumlahpesanbarang)
    returbarang(koderetur,tgl,alasanretur)
    detilretur(koderetur,kodesj,kodebarang,jmlretur,sisaretur)

    saya punya database barang, saya ingin tampilkan data barang yang keluar (suratjalan) dan barang itu belum di retur, saya sudah coba pake left outer join, sudah muncul barang yg belum di retur, tapi karena surat jalan nya sama, apabila di surat jalan itu misal cuma satu nama barang yang retur, nama barang dengan surat jalan yang sama tidak tampil juga, mohon bantuannya

    ini query yg saya buat

    select sj.kodesj, ds.jumlahpesanbarang, dr.jmlretur, sj.nama, sj.tgltujuan, mb.namaBarang
    from suratjalan sj,masterbarang mb, detilsuratjalan ds left outer join detilretur dr
    on ds.kodesj = dr.kodesj
    where dr.jmlRetur is null
    and sj.kodesj = ds.kodesj
    and mb.kodeBarang = ds.kodeBarang
    order by sj.kodeSj

  36. salam kenal mas butuh bantuannya mas
    saya punya 3 tabel mas
    1. pengajar = id_pengajar,pengajar,alamat dan hp
    2. mapel = id_mapel,mapel
    3. jadwal = id_jadwal,id_pengajar,id_mapel

    kemudian saya buat sebuah form
    untuk insert data ke tabel jadwal
    yang di inputkan dari form tersebut
    nama pengajar dan nama mapel
    bagai mana caranya agar dari data yang kita inputkan
    akan menyimpan id_jadwal,id_pengajar dan id_mapel ke tabel jadwal.

    mohon pencerahannya

  37. Mas khalifavi, minta tolong bantu saya dong untuk masalah query dengan menggunakan 2 table yang berbeda, namun 1 table di antaranya digunakan 2x. Begini, saya punya table “users” dan “provinces”. Di dalam table “users” terdapat field userID, userFullName, userHomeAddress, userHomeProvinceID, userOfficeAddress dan userOfficeProvinceID. Di dalam table “provinces” terdapat field provinceID, dan provinceName. Ketika saya JOIN dua table tersebut:

    “SELECT
    tb_provinces.provinceName,
    dt_users.userFullName,
    dt_users.userHomeAddress,
    dt_users.userOfficeAddress
    FROM
    dt_users
    LEFT JOIN tb_provinces ON tb_provinces.provinceID = dt_users.userHomeProvinceID AND tb_provinces.provinceID = dt_users.userOfficeProvinceID”

    Masalahnya adalah, nama provinsinya hanya satu yang keluar. Dan ketika saya coba menggunakan “AS” dalam query, seperti berikut:

    “SELECT
    tb_provinces.provinceName,
    dt_users.userFullName,
    dt_users.userHomeAddress,
    tb_provinces.provinceName AS homeProvince,
    dt_users.userOfficeAddress
    tb_provinces.provinceName AS officeProvince
    FROM
    dt_users
    LEFT JOIN tb_provinces ON tb_provinces.provinceID = dt_users.userHomeProvinceID AND tb_provinces.provinceID = dt_users.userOfficeProvinceID”

    Terdapat error message:

    “[Err] 1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘.provinceName AS officeProvince
    FROM
    dt_users
    LEFT JOIN tb_provinces ON tb_pr’ at line 7”

    Tolong pencerahannya dong… Thanks sebelumnya ya 🙂

  38. Halo Mas Khalifavi, say mau tanya bagaimana Query-nya apabila ada 3 tabel :

    Tabel 1
    KODE KOTA
    0001 KEDIRI
    0001 KEDIRI
    0001 KEDIRI
    0002 BLITAR
    0002 BLITAR

    Tabel 2
    KODE NIK NAMA STATUS
    0001 12456 SIGIT TETAP
    0001 12355 AGUS TETAP
    0001 12455 GURUH HONORER
    0002 12365 HARY TETAP
    0002 12367 THOMAS HONORER

    Tabel 3
    NIK TUNJANGAN
    12456 1000000
    12355 1000000
    12455 200000
    12365 1000000
    12367 200000

    Yang ingin ditampilkan adalah :

    KODE KOTA NIK NAMA STATUS TUNJANGAN
    0001 KEDIRI 12456 SIGIT TETAP 1000000
    12355 AGUS TETAP 1000000
    12455 GURUH HONORER 200000
    0002 BLITAR 12365 HARY TETAP 1000000
    12367 THOMAS HONORER 200000

    Jadi untuk KODE dan KOTA yang sama hanya ditampilkan satu kali saja

    Thanks sebelumnya

    1. Mas Saya Mau Tanyak gmn carax menampilkan nilai akhir dari setiap mata pelajaran yg di inputkan misalnya,,,,
      tbnilai
      nis (int 15)
      nama (varchar 50)
      kelas (varchar 10)
      mapel (varchar 30)
      nilia_harian (int 2)
      nilai_uts (int 2)
      nilai_uas (int 2)
      nilai_akhir (int 3)

      Nis nama kelas mapel nilai_harian nilai_uts nilai_uas nilai_akhir
      123 ari 2a b.indo 20 20 30 25
      123 ari 2a mtk 30 30 40 35
      123 ari 2a kimia 40 30 40 38

      truzz gmn script php “SELECT” nya di MySql untuk menampilakan nilai akhir dari setiap mapel..??
      Nis nama kelas nilai bindo nilai mtk nilai kimia
      123 ari 2a 25 35 38

      mohon bantuannya mas…???
      terimakasih ,,,,,

  39. assalamualaikum..
    mas, sy mau nanya gimana caranya mengecek mahasiswa yang tidak aktif kuliah dengan cara membandingkan data persemester(tahun akademik) yang tercatat di TRAKM..
    jika tabel TRAKM (tabel aktif mahasiswa) mempunyai field seperti berikut ini :
    THSMSTRAKM (tahun akademik) , NIMHSTRAKM (nim mahasiswa)..

    jadi, saya ingin mengetahui misalnya mahasiswa yang bernim, (misal) 06.32.12345 semester sebelumnya aktif kuliah pada tahun 20122 (2 yg diakhir berarti smester genap) kemudian saya ingin mengecek apakah ditahun 20131 dia aktif kuliah(masih ada) atau tidak..
    gimana ya mas querynya.. saya bingung mas..
    terimakasih sebelumnya..

    wassalamualaikum.

  40. gan, saya mo mengambil kabupaten/kecamatan dr propinsi tertentu..misal kabupaten kediri dari jawa timur atau kabupaten malang dr propinsi jawa timur perintah sql nya gmn ya?

  41. Pak mau tanya, misal kasus saya punya 2 tabel.
    tabel 1: data_tempo
    tabel 2: cicilan

    di kedua tabel tersebut ada field yang sama yaitu id_pinjaman.

    di dalam tabel “data_tempo” misal ada 10 record dengan isi field “id_pinjaman” : “pinjaman-1” 5 record dan “pinjaman-2” 5 record.

    nah di tabel cicilan ada hanya 2 record saja, misal id_pinjaman nya “pinjaman-1”

    Gimana caranya saya ingin memunculkan data dengan 5 record(sesuai id_pinjaman yang sama antara tabel “data_tempo” dan tabel “cicilan”). tapi untuk field2 yang lain karena di tabel “cicilan” ada dua data, sisanya berisi null atau kosong.

    Mohon arahan nya.

    Semoga pertanyaan nya bisa di fahami.. 🙂

    terimakasih

Tinggalkan Balasan ke khalifavi Batalkan balasan