Tutorial Belajar MySQL Part 24: Cara Menggabungkan Tabel MySQL (INNER JOIN)

Sampai dengan tutorial sebelum ini, kita hanya menampilkan hasil dari satu tabel saja. Relasional Database adalah tentang kumpulan tabel yang saling berhubungan.

Dalam Tutorial Belajar MySQL: Cara Menggabungkan Tabel MySQL dengan INNER JOIN ini akan dipelajari cara menyatukan hasil dari dua tabel atau lebih menggunakan query SELECT..INNER JOIN.


Mempersiapkan Tabel Sample: mata_kuliah dan daftar_dosen

Sebagai tabel sample untuk tutorial ini, saya masih menggunakan tabel sample dari Tutorial Belajar MySQL: Menampilkan Data dari Tabel MySQL (SELECT).

Jika anda ingin mencoba langsung query yang akan di bahas, silahkan ikuti petunjuk pembuatan tabel tersebut. Tabel kita akan terdiri dari tabel mata_kuliah dan tabel daftar_dosen.

Isi tabel daftar_dosen:

NIP Nama Dosen No HP Alamat
0160436012 Sabrina Sari 0812349900 Pekanbaru
0260432002 Maya Ari Putri 0812345234 Palembang
0275430005 Susi Indriani 0812656532 Bogor
0480432066 Tia Santrini 0812451177 Padang
0576431001 M. Siddiq 0812979005 Jakarta
0770435006 Rubin Hadi 0812567678 Papua
0869437003 Mustalifah 0812338877 Aceh
1080432007 Arif Budiman 0812456345 Makasar

Isi tabel mata_kuliah:

Kode Mata Kuliah Nama Matakuliah Jumlah SKS Semester Nip Dosen
MATDAS Matematika Dasar 4 1 0160436012
FISDAS Fisika Dasar 2 1 0480432066
TEKKOM Teknik Kompilasi 2 6 0480432066
JARKOM Jaringan Komputer 3 3 0770435006
DTBASE Database 4 4 0275430005
SISOPR Sistem Operasi 2 4 0160436012
MIKROP Mikro Prosesor 2 5 0480432066

Tabel daftar_dosen berisi data dari dosen, dimana kolom NIP berisi NIP dosen. Pada tabel mata_kuliah, berisi daftar mata kuliah.

Yang perlu diperhatikan adalah kolom NIP dari kedua tabel. Kolom NIP inilah yang akan kita pakai untuk menggabungkan kedua tabel.


Cara Menggabungkan Tabel MySQL dengan INNER JOIN

Tujuan dari menggabungkan tabel adalah untuk menyajikan informasi secara lebih detail.

Contohnya dari tabel daftar_dosen dan tabel mata_kuliah diatas. Kita ingin menyajikan informasi mata kuliah sekaligus nama dosen yang mengajar mata kuliah tersebut. Data yang ingin disajikan adalah nama mata kuliah, jumlah SKS, dan nama dosen yang mengajar.

Query INNER JOIN memiliki beberapa variasi, yaitu SELECT..INNER JOIN..ON dan SELECT..INNER JOIN..USING. Kita akan membahasnya satu persatu.


Cara Menggabungkan Tabel MySQL dengan query SELECT..INNER JOIN..ON

Format dasar dari penulisan query SELECT..INNER JOIN..ON adalah:

SELECT nama_kolom_tampil FROM nama_tabel_pertama INNER JOIN nama_tabel_kedua 
ON nama_kolom_join_tabel_pertama = nama_kolom_join_tabel_kedua
  • nama_kolom_tampil adalah nama dari kolom yang akan kita tampilkan, bisa semua kolom dalam tabel, atau hanya kolom tertentu saja.
  • nama_tabel_pertama adalah nama tabel pertama yang akan digabung.
  • nama_tabel_kedua adalah nama tabel kedua yang akan digabung.
  • nama_kolom_join_tabel_pertama adalah nama kolom yang akan digunakan sebagai join dari tabel pertama.
  • nama_kolom_join_tabel_kedua adalah nama kolom yang akan digunakan sebagai join dari tabel kedua.

Syarat untuk INNER JOIN adalah kedua tabel harus memiliki sebuah kolom dengan nilai yang sama. Kolom tersebut yang akan digunakan dalam proses JOIN.

Pada contoh kita, kolom itu adalah kolom NIP dari tabel nama_dosen, dan kolom NIP_dosen dari tabel mata_kuliah. Perhatikan walaupun keduanya berisi NIP, namun nama kolomnya berbeda.

Query untuk SELECT..INNER JOIN..ON tabel mata_kuliah dengan daftar_dosen adalah:

mysql> SELECT nama_matkul,jumlah_SKS,nama_dosen FROM mata_kuliah
INNER JOIN daftar_dosen ON NIP_dosen=NIP;
+-------------------+------------+---------------+
| nama_matkul       | jumlah_SKS | nama_dosen    |
+-------------------+------------+---------------+
| Database          |          4 | Susi Indriani |
| Fisika Dasar      |          2 | Tia Santrini  |
| Jaringan Komputer |          3 | Rubin Hadi    |
| Matematika Dasar  |          4 | Sabrina Sari  |
| Mikro Prosesor    |          2 | Tia Santrini  |
| Sistem Operasi    |          2 | Sabrina Sari  |
| Teknik Kompilasi  |          2 | Tia Santrini  |
+-------------------+------------+---------------+
7 rows in set (0.00 sec)

Dari hasil query SELECT diatas, saya menggabung tabel mata_kuliah dan daftar_dosen untuk mendapatkan tampilan seluruh mata kuliah, jumlah sks, dan nama dosen yang mengajar.

Kita menggunakan tabel mata_kuliah sebagai tabel pertama, dan tabel daftar_dosen sebagai tabel kedua.


Cara Menggabungkan Tabel MySQL dengan SELECT..INNER JOIN..USING

Cara JOIN kedua adalah menggunakan USING sebagai pengganti ON untuk query INNER JOIN.

Format dasar dari penulisan query SELECT..INNER JOIN..USING adalah:

SELECT nama_kolom_tampil FROM nama_tabel_pertama INNER JOIN 
nama_tabel_kedua USING (nama_kolom_join)
  • nama_kolom_tampil adalah nama dari kolom yang akan kita tampilkan, bisa semua kolom dalam tabel, atau hanya kolom tertentu saja.
  • nama_tabel_pertama adalah nama tabel pertama yang akan digabung.
  • nama_tabel_kedua adalah nama tabel kedua yang akan digabung.
  • nama_kolom_join adalah nama kolom yang akan digunakan sebagai join.

Syarat untuk INNER JOIN..USING adalah kedua tabel harus memiliki nama kolom yang sama. Dalam contoh kita, kolom tersebut adalah kolom NIP.

Namun karena nama kolom NIP untuk tabel mata_kuliah adalah NIP_dosen, sedangkan pada kolom daftar_dosen kolom NIP hanya NIP saja, maka harus disamakan terlebih dahulu. Untuk hal ini saya memutuskan kedua kolom akan bernama NIP_dosen.

mysql> ALTER TABLE daftar_dosen CHANGE NIP NIP_dosen CHAR(10);
Query OK, 8 rows affected (0.08 sec)
Records: 8  Duplicates: 0  Warnings: 0

Setelah kedua kolom NIP bernama sama, saatnya kita menggabungkan kedua tabel ini

mysql> SELECT nama_matkul, jumlah_SKS, nama_dosen
FROM mata_kuliah INNER JOIN daftar_dosen USING (NIP_dosen);
+-------------------+------------+---------------+
| nama_matkul       | jumlah_SKS | nama_dosen    |
+-------------------+------------+---------------+
| Database          |          4 | Susi Indriani |
| Fisika Dasar      |          2 | Tia Santrini  |
| Jaringan Komputer |          3 | Rubin Hadi    |
| Matematika Dasar  |          4 | Sabrina Sari  |
| Mikro Prosesor    |          2 | Tia Santrini  |
| Sistem Operasi    |          2 | Sabrina Sari  |
| Teknik Kompilasi  |          2 | Tia Santrini  |
+-------------------+------------+---------------+
7 rows in set (0.00 sec)

Hasilnya sama persis dengan SELECT..INNER JOIN..ON, hanya berbeda cara penulisan.

Di dalam MySQL, kata INNER JOIN  dapat diganti dengan CROSS JOIN, atau hanya JOIN saja. Ketiga kata kunci ini memiliki fungsi yang sama. MySQL menyediakannya agar dapat kompatible dengan bahasa SQL dari RDBMS lainnya seperti ORACLE dan MS SQL.

Misalnya untuk query kita diatas, dapat juga ditulis menjadi

mysql> SELECT nama_matkul, jumlah_SKS, nama_dosen
FROM mata_kuliah CROSS JOIN daftar_dosen USING (NIP_dosen);

Cara Penulisan Nama Kolom: Nama_Tabel.Nama_Kolom

Setelah kita merubah nama kolom NIP menjadi NIP_dosen pada tabel daftar_dosen, sekarang tiap tabel memiliki nama kolom yang sama, yakni NIP_dosen.

Jika kita jalankan kembali query SELECT..INNER JOIN..ON dengan nama kolom ini, MySQL akan mengeluarkan error:

mysql> SELECT nama_matkul,jumlah_SKS,nama_dosen FROM mata_kuliah 
INNER JOIN daftar_dosen ON NIP_dosen=NIP_dosen;
ERROR 1052 (23000): Column 'NIP_dosen' in on clause is ambiguous

Dari pesan error yang terjadi, MySQL ‘bingung’ dalam memilih kolom. Query ON NIP_dosen=NIP_dosen menjadi ambigu karena kedua tabel kita memiliki nama kolom yang sama.

Untuk mengatasi ambiguitas ini, MySQL mengharuskan kita secara eksplisit menyebutkan nama tabelnya. Cara penulisan ini menggunakan tanda titik sebagai pemisah:

Nama_Tabel.Nama_Kolom

Misalkan untuk merujuk pada kolom NIP_dosen pada tabel mata_kuliah, maka penulisannya menjadi:

Mata_kuliah.NIP_dosen

Sehingga query SELECT..INNER JOIN..ON yang benar adalah:

mysql> SELECT nama_matkul,jumlah_SKS,nama_dosen FROM mata_kuliah
INNER JOIN daftar_dosen ON mata_kuliah.NIP_dosen=daftar_dosen.NIP_dosen;
+-------------------+------------+---------------+
| nama_matkul       | jumlah_SKS | nama_dosen    |
+-------------------+------------+---------------+
| Database          |          4 | Susi Indriani |
| Fisika Dasar      |          2 | Tia Santrini  |
| Jaringan Komputer |          3 | Rubin Hadi    |
| Matematika Dasar  |          4 | Sabrina Sari  |
| Mikro Prosesor    |          2 | Tia Santrini  |
| Sistem Operasi    |          2 | Sabrina Sari  |
| Teknik Kompilasi  |          2 | Tia Santrini  |
+-------------------+------------+---------------+
7 rows in set (0.00 sec)

Query SELECT..INNER JOIN akan sering kita pakai untuk menampilkan data dari beberapa tabel.

Ketika mendesain database, sedapat mungkin eleminasi data yang redundan (data yang berulang) dari satu tabel besar menjadi beberapa tabel kecil, lalu digabung pada saat menampilkan data.

Dalam lanjutan tutorial belajar MySQL berikutnya, kita akan bahas tentang cara menghapus data dari tabel MySQL dengan query DELETE.

146 Comments

  1. Reza Twezer
    01 Apr 14
    • Andre
      06 Apr 14
  2. cashonlin3
    12 Apr 14
    • meyli
      30 Jan 18
  3. Anonymous
    08 May 14
    • Andre
      08 May 14
  4. tettapatron
    09 May 14
    • Andre
      10 May 14
  5. arif fernando
    17 Jul 14
  6. basuki rosyidi
    05 Sep 14
    • Andre
      09 Sep 14
  7. vincmeister
    23 Nov 14
  8. Dika
    10 Dec 14
    • Andre
      10 Dec 14
  9. Nurfithriani
    30 Dec 14
    • Andre
      30 Dec 14
  10. saiful
    31 Dec 14
    • Andre
      02 Jan 15
  11. Redo Kusuma
    28 Jan 15
    • Andre
      28 Jan 15
  12. mulya
    13 Apr 15
    • Andre
      16 Apr 15
  13. risnandar
    04 May 15
    • Andre
      05 May 15
  14. cherika
    25 May 15
    • Andre
      26 May 15
      • cherika
        27 May 15
  15. cherika
    27 May 15
    • Andre
      28 May 15
  16. cherika
    29 May 15
  17. cherika
    29 May 15
    • Andre
      30 May 15
  18. her@
    30 May 15
    • meyli
      30 Jan 18
  19. fakhrizal
    28 Jun 15
  20. dedy
    07 Jul 15
  21. Asril
    09 Jul 15
    • Andre
      10 Jul 15
  22. Asril
    10 Jul 15
  23. wirna
    28 Jul 15
    • Andre
      30 Jul 15
    • Amir Cysers
      23 Dec 15
      • Andre
        23 Dec 15
  24. dinasty
    12 Aug 15
  25. dinasty
    12 Aug 15
    • Andre
      13 Aug 15
  26. reza
    22 Sep 15
  27. enggar
    06 Oct 15
    • Andre
      08 Oct 15
  28. ana
    23 Oct 15
    • reza
      18 Nov 15
  29. Anonymous
    28 Nov 15
    • Andre
      29 Nov 15
  30. anan alfred
    07 Dec 15
    • Andre
      07 Dec 15
  31. Amir Cysers
    23 Dec 15
    • Andre
      23 Dec 15
      • Amir Cysers
        26 Dec 15
        • Andre
          26 Dec 15
  32. Rachman
    06 Jan 16
  33. Rachman
    06 Jan 16
    • Andre
      07 Jan 16
  34. Dwi Kuncoro
    04 Mar 16
  35. hilmi
    14 Mar 16
  36. Rangga Dwi Juliansyah
    27 May 16
    • Andre
      28 May 16
  37. Apin
    06 Jun 16
    • Andre
      07 Jun 16
  38. dofly
    20 Jun 16
    • Andre
      20 Jun 16
      • dofly
        20 Jun 16
        • dofly
          20 Jun 16
        • Andre
          21 Jun 16
        • dofly
          21 Jun 16
        • Andre
          23 Jun 16
  39. Muhammad Jamaludin
    27 Jun 16
  40. Ade
    03 Jul 16
  41. irfan
    04 Jul 16
    • Andre
      05 Jul 16
  42. fadhly
    09 Jul 16
    • Andre
      09 Jul 16
  43. Fahruddin
    05 Aug 16
  44. Sopani
    13 Aug 16
    • Andre
      14 Aug 16
  45. purwanto
    30 Aug 16
  46. purwanto
    30 Aug 16
    • Andre
      30 Aug 16
  47. Rachmat
    30 Aug 16
    • Andre
      31 Aug 16
  48. Rachmat
    02 Sep 16
  49. fandi
    16 Sep 16
    • Andre
      15 Oct 16
  50. Hakim
    18 Oct 16
    • Andre
      19 Oct 16
  51. wahyu
    20 Oct 16
    • Andre
      21 Oct 16
  52. mdfzi
    28 Oct 16
  53. Adi
    01 Nov 16
    • Andre
      01 Nov 16
      • Adi
        01 Nov 16
        • Andre
          02 Nov 16
  54. Irgy
    03 Dec 16
    • Andre
      05 Dec 16
  55. Eben Ezer
    24 Dec 16
  56. Rinto Exandi
    28 Dec 16
  57. Rendy
    04 Feb 17
  58. ryan
    08 Feb 17
    • Andre
      08 Feb 17
  59. Dwiki Ahma
    17 Mar 17
    • Andre
      18 Mar 17
  60. IMRAN
    11 Jul 17
    • Andre
      12 Jul 17
  61. Mahendra Candi
    18 Jul 17
  62. enald
    07 Aug 17
    • Andre
      08 Aug 17
  63. agus
    26 Sep 17
    • Andre
      27 Sep 17
  64. Levi Tanrio
    05 Nov 17
    • Andre
      07 Nov 17
      • Fitri Pusvitasari
        27 Nov 17
        • Andre
          02 Dec 17
  65. Anonymous
    27 Dec 17
    • Andre
      28 Dec 17
  66. rudi
    08 Jan 18
    • Andre
      08 Jan 18
  67. ana kurnia sari
    23 Jan 18
  68. Noms
    05 Jul 18
    • Andre
      07 Jul 18
  69. tiwi
    14 Aug 18
  70. tiwi
    14 Aug 18
    • Andre
      15 Aug 18

Add Comment