Basis Data Part 7: Query Melibatkan Join Table

Dodit Suprianto
5 min readOct 25, 2021

--

Berikut ini penjelasan bagaimana membuat query yang melibatkan lebih dari satu tabel atau view. Terdapat beberapa mode hubungan antar tabel, antara lain:

  • Inner Join
  • Left Join
  • Right Join
  • Full Join
  • Union

Inner Join

Kata kunci INNER JOIN memilih baris/record yang memiliki nilai yang cocok di kedua tabel.

Sintaks INNER JOIN:

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

Sebagai contoh, kita akan membuat query berdasarkan rancangan berikut:

Query tabel barang_tb:

use cobadb;
select * from cobadb.barang_tb
order by barang_id;

Query tabel jenis_barang_tb:

use cobadb;select * from jenis_barang_tb
order by jenis_barang_id;

Sekarang coba analisa query berikut yang merupakan hasil INNER JOIN kedua tabel di atas:

use cobadb;SELECT barang_tb.barang_id, barang_tb.nama_barang, jenis_barang_tb.nama_jenis_barang, barang_tb.hargaFROM jenis_barang_tb INNER JOIN barang_tb 
ON jenis_barang_tb.jenis_barang_id = barang_tb.jenis_barang_id
ORDER BY barang_tb.nama_barang, jenis_barang_tb.nama_jenis_barang;

Bagaimana bila INNER JOIN diterapkan pada 3 tabel sekaligus? perhatikan contoh query berikut:

# memilih database
use cobadb;
# select kolom/field disertai dengan nama tabel referensinya
SELECT penjualan_header_tb.penjualan_id, penjualan_header_tb.tanggal, kustomer_tb.nama_kustomer, penjualan_detil_tb.barang_id, penjualan_detil_tb.jumlah, penjualan_detil_tb.harga
FROM (kustomer_tb INNER JOIN penjualan_header_tb ON kustomer_tb.kustomer_id = penjualan_header_tb.kustomer_id) INNER JOIN penjualan_detil_tb ON penjualan_header_tb.penjualan_id = penjualan_detil_tb.penjualan_idORDER BY penjualan_header_tb.penjualan_id, penjualan_header_tb.tanggal, kustomer_tb.nama_kustomer;

Bagaimana bila INNER JOIN diterapkan pada 5 tabel sekaligus? perhatikan contoh query berikut:

use cobadb;SELECT penjualan_header_tb.penjualan_id, penjualan_header_tb.tanggal, kustomer_tb.nama_kustomer, penjualan_detil_tb.barang_id, barang_tb.nama_barang, jenis_barang_tb.nama_jenis_barang, penjualan_detil_tb.jumlah, penjualan_detil_tb.hargaFROM jenis_barang_tb INNER JOIN (barang_tb INNER JOIN (kustomer_tb INNER JOIN (penjualan_header_tb INNER JOIN penjualan_detil_tb ON penjualan_header_tb.penjualan_id = penjualan_detil_tb.penjualan_id) ON kustomer_tb.kustomer_id = penjualan_header_tb.kustomer_id) ON barang_tb.barang_id = penjualan_detil_tb.barang_id) ON jenis_barang_tb.jenis_barang_id = barang_tb.jenis_barang_idORDER BY penjualan_header_tb.penjualan_id, penjualan_header_tb.tanggal, kustomer_tb.nama_kustomer;

Untuk LEFT JOIN dan RIGHT JOIN perlu dilakuakan sedikit perubahan pada struktur tabel barang_tb.

Sebagai percobaan. Pertama, kita ubah properti kolom jenis_barang_id pada tabel barang_tb menjadi allow null (boleh kosong) dan default = null, sebagai berikut:

ALTER TABLE cobadb.barang_tb MODIFY COLUMN jenis_barang_id char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL;

Catatan.

Apa pendapat kalian, mengapa strutur tabel barang_tb perlu diubah untuk menguji LEFT JOIN dan RIGHT JOIN? meskipun secara praktik langkah tersebut tidak baik, mengapa?

KARENA ITU AKAN MENGUBAH INTEGRITAS DATA.

Di sini kita menambahkan beberapa record baru dalam tabel barang_tb yang tidak dilengkapi nilai dalam kolom jenis_barang_id:

use cobadb;insert into barang_tb(barang_id, nama_barang, harga) 
values ('A001', 'Handphone Xiaomi', 1000000);
insert into barang_tb(barang_id, nama_barang, harga)
values ('A002', 'Handphone Nokia', 2000000);
insert into barang_tb(barang_id, nama_barang, harga)
values ('A003', 'Handphone Sony', 3000000);
insert into barang_tb(barang_id, nama_barang, harga)
values ('A004', 'Handphone Motorola', 4000000);

LEFT JOIN

LEFT JOIN mengembalikan semua record dari tabel kiri (table1), dan record yang cocok dari tabel kanan (table2). Hasilnya adalah NULL/0 catatan dari sisi kanan, jika tidak ada kecocokan.

Sintaks LEFT JOIN:

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

Catatan: Dalam beberapa database LEFT JOIN disebut LEFT OUTER JOIN.

Perhatikan contoh query tabel barang_tb dan jenis_barang_tb dengan hubungan LEFT JOIN (baca ulang definisi LEFT JOIN sebelumnya).

use cobadb;SELECT barang_tb.barang_id, barang_tb.nama_barang, jenis_barang_tb.nama_jenis_barang, barang_tb.hargaFROM barang_tb LEFT JOIN jenis_barang_tb ON barang_tb.jenis_barang_id = jenis_barang_tb.jenis_barang_idORDER BY barang_tb.nama_barang;

Silahkan analisa query di atas dengan hasil query di bawah. Dimana semua record dalam tabel barang_tb akan ditampilkan meskipun tidak ada relasi dengan tabel jenis_barang_tb melalui kolom/field id_jenis_barang_id.

RIGHT JOIN

RIGHT JOIN mengembalikan semua record dari tabel kanan (table2), dan record yang cocok dari tabel kiri (table1). Hasilnya adalah 0/NULL record dari sisi kiri, jika tidak ada kecocokan.

Sintaks RIGHT JOIN:

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

Catatan: Dalam beberapa database RIGHT JOIN disebut RIGHT OUTER JOIN.

Perhatikan contoh query tabel barang_tb dan jenis_barang_tb dengan hubungan RIGHT JOIN (baca ulang definisi RIGHT JOIN sebelumnya).

use cobadb;SELECT barang_tb.barang_id, barang_tb.nama_barang, jenis_barang_tb.nama_jenis_barang, barang_tb.hargaFROM barang_tb RIGHT JOIN jenis_barang_tb ON barang_tb.jenis_barang_id = jenis_barang_tb.jenis_barang_idORDER BY barang_tb.nama_barang;

Silahkan analisa query di atas dengan hasil query di bawah. Dimana semua record dalam tabel jenis_barang_tb akan ditampilkan meskipun tidak ada relasi dengan tabel barang_tb melalui kolom/field id_jenis_barang_id.

FULL OUTER JOIN

FULL OUTER JOIN mengembalikan semua record ketika ada kecocokan pada record tabel kiri (table1) atau kanan (table2).

Tip: FULL OUTER JOIN dan FULL JOIN adalah sama.

Sintaks FULL OUTER JOIN:

SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;

Teori di atas tidak dapat diterapkan pada MySQL. Tetapi kita dapat melakukan alternatif lain, yaitu menggabungkan teknik LEFT JOIN dan RIGHT JOIN dan UNION, yang artinya semua record kedua tabel akan ditampilkan.

use cobadb;SELECT barang_tb.barang_id, barang_tb.nama_barang, jenis_barang_tb.nama_jenis_barang, barang_tb.hargaFROM barang_tb LEFT JOIN jenis_barang_tb ON barang_tb.jenis_barang_id = jenis_barang_tb.jenis_barang_idUNIONSELECT barang_tb.barang_id, barang_tb.nama_barang, jenis_barang_tb.nama_jenis_barang, barang_tb.hargaFROM barang_tb RIGHT JOIN jenis_barang_tb ON barang_tb.jenis_barang_id = jenis_barang_tb.jenis_barang_id
Page 1
Page 2

--

--

Dodit Suprianto

I am interested in IoT, especially cyber security on the IoT platform, develop functional edge computing, explore machine learning to solve IoT problems