Perintah MySQL untuk Menampilkan Data dari Beberapa Tabel
Di dalam suatu RDBMS termasukMySQL, tentunya sudah menjadi suatu kewajaran jika dalam satu database dapat terdiri dari beberapa tabel. Masing-masing tabel tersebut dapat berhubungan (berelasi) satu sama lain. Relasi antar-tabel dapat berupa relasi 1-1 (one-to-one), 1-M (one-to-many), atau M-N (many-to-many). Sebagai contoh terlihat pada gambar pemodelan data konseptual (class diagram) di bawah ini. Tabel pelanggan berhubungan dengan pesan, pesan dengan barang, dsb.
Pada pembuatan suatu aplikasi, terkadang kita juga memerlukan tampilan data yang tidak hanya berasal dari 1 (satu) tabel, namun bisa dari beberapa tabel sekaligus. Contohnya, dariclass diagram di bawah, kita ingin menampilkan nama pelanggan berikut transaksi yang pernah dilakukannya. Dari contoh tersebut, kita harus bisa menggabungkan minimal dua tabel, yaitu pelanggan dan pesan.
Untuk menggabungkan 2 (dua) atau lebih tabel, kita dapat menggunakan bentuk perintahJOIN. Dalam tutorial ini, akan dijelaskan secara bertahap mengenai bagaimana menggabungkan dua tabel atau lebih, terutama untuk menampilkan data yang berasal dari beberapa tabel. Contoh-contoh dalam tutorial ini secara khusus telah dicoba di database MySQL, namun demikian secara umum perintah penggabungan tabel di semua jenis database tidak jauh berbeda alias sama.
Sebelum belajar mengenai perintah penggabungan tabel, perlu dipersiapkan tabel-tabel yang akan dijadikan sebagai bahan latihan dan contoh dalam tutorial ini. Kita akan menggunakan tabel rancangan sistem pemesanan barang (pembelian) sederhana berikut ini. Untuk membuatnya, Anda dapat menggunakan tools seperti PHPMyAdmin dan MySQLFront atau dapat juga melalui command-prompt. Jika diperlukan, pelajari kembali postingan saya sebelumnya mengenai administrasi database MySQL dengan PHPMyAdmin dan juga dasar-dasar perintah SQL. Jangan lupa isikan beberapa contoh data ke tabel-tabel yang sudah Anda buat.
1. Inner Join
Dengan inner join, tabel akan digabungkan dua arah, sehingga tidak ada data yang NULL di satu sisi. Sebagai contoh, kita akan menggabungkan tabel pelanggan dan pesan dimana kita akan menampilkan daftar pelanggan yang pernah melakukan pemesanan (transaksi). Misalkan isi tabel pelanggan dan pesan adalah sebagai berikut :
Tabel pelanggan (hanya ditampilkan field id_pelanggan, nm_pelanggan dan email)
Tabel pesan.
Cara #1. Inner Join dengan WHERE.
Penggabungan dengan klausa WHERE memiliki bentuk umum sebagai berikut:
SELECT tabel1.*, tabel2.* FROM tabel1, tabel2 WHERE tabel1.PK=tabel2.FK;
Berikut ini perintah SQL untuk menggabungkan tabel pelanggan dan pesan:
SELECT pelanggan.id_pelanggan, pelanggan.nm_pelanggan, pesan.id_pesan, pesan.tgl_pesan FROM pelanggan, pesan WHERE pelanggan.id_pelanggan=pesan.id_pelanggan;
Hasilnya sebagai berikut:
Pada hasil perintah query di atas terlihat bahwa terdapat 5 (lima) transaksi yang dilakukan oleh 3 (tiga) orang pelanggan. Jika kita lihat kembali isi tabel pelanggan di atas, maka terdapat satu pelanggan yang tidak ditampilkan yaitu yang memiliki id pelanggan P0003. Pelanggan tersebut tidak ditampilkan karena belum pernah melakukan transaksi.
Cara #1. Inner Join dengan klausa INNER JOIN.
Berikut ini bentuk umumnya:
SELECT tabel1.*, tabel2.* FROM tabel1 INNER JOIN tabel2 ON tabel1.PK=tabel2.FK;
Dan berikut ini perintah SQL penggabungan tabel pelanggan dan pesan.
SELECT pelanggan.id_pelanggan, pelanggan.nm_pelanggan, pesan.id_pesan, pesan.tgl_pesan FROM pelanggan INNER JOIN pesan ON pelanggan.id_pelanggan=pesan.id_pelanggan;
Hasilnya akan sama dengan gambar di atas (cara #1).
2. Outer Join
Dengan outer join, tabel akan digabungkan satu arah, sehingga memungkinkan ada data yang NULL (kosong) di satu sisi. Sebagai contoh, kita akan menggabungkan tabel pelanggan dan pesan dimana kita akan menampilkan daftar pelanggan yang pernah melakukan pemesanan (transaksi).
Outer Join terbagi menjadi 2 (dua) yaitu LEFT JOIN dan RIGHT JOIN. Berikut ini bentuk umum dan contohnya:
LEFT JOIN.
Bentuk umum:
SELECT tabel1.*, tabel2.* FROM tabel1 LEFT JOIN tabel2 ON tabel1.PK=tabel2.FK;
Contoh perintah SQL:
SELECT pelanggan.id_pelanggan, pelanggan.nm_pelanggan, pesan.id_pesan, pesan.tgl_pesan FROM pelanggan LEFT JOIN pesan ON pelanggan.id_pelanggan=pesan.id_pelanggan;
Hasilnya:
Berbeda dengan hasil sebelumnya (inner join), penggunaan left join akan menampilkan juga data pelanggan dengan id P0003, walaupun pelanggan tersebut belum pernah bertransaksi. Dan pada kolom id_pesan dan tgl_pesan untuk pelanggan P0003 isinya NULL, artinya di tabel kanan (pesan) pelanggan tersebut tidak ada.
RIGHT JOIN
Bentuk umum:
SELECT tabel1.*, tabel2.* FROM tabel1 RIGHT JOIN tabel2 ON tabel1.PK=tabel2.FK;
Contoh perintah SQL:
SELECT pelanggan.id_pelanggan, pelanggan.nm_pelanggan, pesan.id_pesan, pesan.tgl_pesan FROM pelanggan RIGHT JOIN pesan ON pelanggan.id_pelanggan=pesan.id_pelanggan;
Hasilnya:
Dengan right join, tabel yang menjadi acuan adalah tabel sebelah kanan (tabel pesan), jadi semua isi tabel pesan akan ditampilkan. Jika data pelanggan tidak ada di tabel pelanggan, maka isi tabel pesan tetap ditampilkan.
------------------------------------------------------------------------------------------------------------
SELECT C.*, P.NoFaktur, P.Tanggal, BJ.KodeBrg, BJ.Jumlah, BJ.Harga FROM Customer C, Penjualan P, BarangJual BJ WHERE C.KodeCus = P.KodeCus AND BJ.NoFaktur = P.NoFaktur AND KodeBrg = 'RGAN01'
Untuk mendapatkan kembali daftar semua pelanggan, termasuk pelanggan yang
tidak membuat pesanan, Anda dapat melakukan hal berikut :
SELECT Customer.KodeCus, Penjualan.NoFaktur FROM Customer LEFT OUTER JOIN Penjualan ON Customer.KodeCus = Penjualan.KodeCus
------------------------------------------------------------------------------------------------------------
Statemen SELECT
memulai dengan cara yang sama seperti semua statemen yang Anda ketahui sejauh ini, dengan menetapkan field yang didapatkan kembali. Perbedaan besar disini adalah dua dari field yang ditentukan (Barang.Nama dan Barang.Harga) ada pada satu tabel, sedangkan yang lainnya (Supplier.Nama) pada tabel lainnya.
Sekerang perhatikan klausa FROM. Tidak seperti semua statemen SELECT sebelumnya, statemen ini mempunyai dua tabel pada klausa FROM, yaitu Supplier dan Barang. Keduanya adalah nama dua tabel yang akan digabungkan dalam statemen SELECT. Tabel-tabel digabung dengan benar dengan klausa WHERE yang memerintahkan DBMS untuk mencocokkan KodeSup pada tabel Supplier dengan KodeSup pada tabel Barang.
Anda juga mencatat bahwa field tersebut ditetapkan sebagai Supplier.KodeSup dan Barang.KodeSup. Disini diperlukan nama field yang terkualifikasi sepenuhnya, karena jika Anda hanya menentukan KodeSup, DBMS tidak dapat memberi tahu field KodeSup mana yang akan Anda hubungi (Ada dua KodeSup, satu pada setiap tabel). Seperti dapat Anda lihat pada outputnya, statemen SELECT tunggal mengembalikan data dari dua tabel yang berbeda.
Klausa WHERE
Mungkin terlihat aneh jika menggunakan klausa WHERE untuk mengatur hubungan join, tetapi sebenarnya, ada sebuah alasa yang sangat bagus untuk ini. Ingat, jika tabel-tabel digabungkan dalam statemen SELECT, maka hubungan itu disusun on-the-fly. Tidak ada sesuatu dalam definisi tabel database yang dapat memerintahkan DBMS bagaimana menggabungkan tabel. Anda harus melakukannya sendiri.
Ketika kita menggabungkan dua tabel, yang sebenarnya Anda lakukan adalah memasangkan setiap record pada tabel pertama dengan setiap record pada tabel kedua. Klausa WHERE (seperti semua klausa WHERE) bertindak sebagai penyaring untuk hanya memasukkan record yang memenuhi kondisi penyaringan yang telah ditentukan – disini kondisi join.
Dan Pastikan semua join Anda mempunyai klausa WHERE, atau DBMS akan mengembalikan lebih banyak data daripada yang Anda inginkan. Pastikan juga klausa WHERE Anda benar. Kondisi penyaringan yang tidak benar akan menyebabkan DBMS mengembalikan data yang tidak benar.
Inner Join
Join yang Anda gunakan selama ini disebut EQUIJOIN – join berdasarkan pengujian persamaan tabel antara dua tabel. Jeni join ini juga disebut INNER JOIN.
Pada dasarnya, beberapa DBMS menggunakan sintaks yang sedikit berbeda karena join tersebut menetapkan tipe join yang jelas berbeda. Statemen SELECT berikut ini mengembalikan data yang tepat sama seperti contoh terdahulu.
SELECT Supplier.Nama, Barang.Nama, Barang.Harga FROM Supplier INNER JOIN Barang ON Supplier.KodeSup = Barang.KodeSupPada dasarnya, beberapa DBMS menggunakan sintaks yang sedikit berbeda karena join tersebut menetapkan tipe join yang jelas berbeda. Statemen SELECT berikut ini mengembalikan data yang tepat sama seperti contoh terdahulu.
SELECT pada statemen ini sama seperti statemen SELECT sebelumnya, tetapi klausa FROM berbeda. Hubungan antara dua tabel adalah bagian dari klausa FROM yang ditentukan sebagai INNER JOIN. Ketika menggunakan sintaks ini, kondisi join ditetapkan dengan menggunakan klausa ON khusus sebagai pengganti klausa WHERE. Kondisi sebenarnya yang dilewatkan pada ON sama seperti yang dilewatkan pada WHERE.
Menggabungkan Banyak Tabel
SQL tidak menentukan batasan untuk jumlah tabel yang mungkin digabungkan dalam statemen SELECT. Peraturan dasar untuk membuat join tetap sama. Pertama, daftarkan semua tabel dan kemudian tentaukan hubungan di antara setiap tabel. Contohnya sebagai berikut :
SELECT Supplier.Nama, Barang.Nama, Barang.Harga, BarangJual.Jumlah FROM BarangJual, Barang, Supplier WHERE Barang.KodeSup = Supplier.KodeSup AND BarangJual.KodeBrg = Barang.KodeBrg AND NoFaktur = '20007';
Contoh tersebut menampilkan item pada pesanan NoFaktur 20007. Item pesanan disimpan pada tabel BarangJual. Setiap barang disimpan berdasarkan kode barang itu, yang merujuk kepada barang dalam tabel barang. Barang dihubungkan ke supplier yang tepat pada tabel supplier berdasarkan kode supplier, yang disimpan dengan setiap catatan barang. Klausa FROM disini mendaftar tiga tabel, dan klausa WHERE menetapkan kondisi join. Kondisi WHERE tambahan kemudian digunakan untuk menyaring hanya item-item untuk pesanan 20007.
Tipe-Tipe Join
Sejauh ini Anda hanya menggunakan join sederhana yang dikenal sebagai INNER JOIN EQUIJOIN. Sekarang perhatikan tiga tipe join tambahan : SELF-JOIN, NATURAL JOIN dan OUTER JOIN.
Membuat Self-Join
Salah satu alasan utama menggunakan alias tabel adalah untuk merujuk kepada tabel yang sama lebih dari satu kali pada statemen SELECT tunggal. Ada contoh untuk menunjukkan hal ini. Misalkan Anda ingin mengirim sebuah surat ke semua kontak pelanggan yang bekerja untuk perusahaan yang sama dimana Jim Jones bekerja. Query ini mengharuskan Anda pertama-tama mencari perusahaan tempat Jim Jones bekerja, dan selanjutnya pelanggan mana yang bekerja untuk perusahaan tersebut. Berikut ini satu cara untuk menyelesaikan masalah tersebut :
SELECT c1.KodeCus, c1.Nama, c1.Kontak FROM Customer c1, Customer c2 WHERE c1.Nama = c2.Nama AND c2.Kontak='Jim Jones'
Dua tabel yang dibutuhkan pada query ini sebenarnya adalah tabel yang sama, dan karena itu tabel Customer muncul dua kali pada klausa FROM. Meskipun ini sah sama sekali, tetapi semua referensi ke tabel Customer akan ambigous karena DBMS tidak mengetahui tabel Customer yang Anda rujuk.
Untuk memecahkan masalah ini, digunakan alias-alias tabel. Kejadian pertama pada Customer punya alias c1, dan kejadian kedua mempunyai alias c2. Sekarang alias-alias itu dapat digunakan sebagai nama tabel. Statemen SELECT, misalnya, menggunakan prefiks c1 untuk menyatakan eksplisit nama lengkap dari field yang diinginkan. Jika ini tidak dilakukan, DBMS akan menghasilkan sebuah error karena ada dua field bernama KodeSup, Nama dan Kontak.
DBMS tidak dapat mengetahui yang mana yang Anda inginkan (bahkan sekalipun field itu hanya satu dan sama). Klausa WHERE pertama-tama menghubungkan tabel, dan kemudian menyaring data dengan Kontak pada tabel kedua untuk mengembalikan hanya data yang diinginkan.
Natural Join
Kapanpun tabel digabungkan, sedikitnya ada satu field yang akan muncul pada lebih dari satu tabel (field yang digabungkan). Penggabungan standar (INNER JOIN yang Anda pelajari diatas) mengembalikan semua data, bahkan banyak kejadian pada field yang sama. NATURAL JOIN hanya mengurangi kejadian tersebut sehingga hanya satu pada setiap field yang dikembalikan.
Sebenarnya bukan NATURAL JOIN yang melakukan hal tersebut, melainkan Anda yang melakukan. NATURAL JOIN adalah join dimana dilakukan dengan menggunakan wildcard (SELECT *) untuk satu tabel dan sub-kumpulan eksplisit dari field untuk semua tabel lainnya. Berikut ini contohnya :SELECT C.*, P.NoFaktur, P.Tanggal, BJ.KodeBrg, BJ.Jumlah, BJ.Harga FROM Customer C, Penjualan P, BarangJual BJ WHERE C.KodeCus = P.KodeCus AND BJ.NoFaktur = P.NoFaktur AND KodeBrg = 'RGAN01'
Pada Contoh tersebut, wildcard digunakan hanya untuk tabel yang pertama. Seluruh field lainnya dengan jelas di daftar sehingga tidak ada field duplikat yang di dapat kembali.
Sebenarnya, setiap INNER JOIN yang Anda buah sejauh ini adalah NATURAL JOIN, dan Anda tidak pernah membutuhkan INNER JOIN yang bukan NATURAL JOIN.
Outer Join
Kebanyakan join menghubungkan record-record dalam satu tabel dengan record-record tabel lainnya. Tetapi kadang-kadang Anda perlu memasukkan record yang
tidak mempunyai record-record yang berhubungan. Sebagai contoh, Anda mungkin menggunakan join untuk menyelesaikan tugas berikut :
tidak mempunyai record-record yang berhubungan. Sebagai contoh, Anda mungkin menggunakan join untuk menyelesaikan tugas berikut :
- Menghitung berapa banyak pesanan yang dibuat oleh setiap pelanggan, termasuk pelanggan yang sudah melakukan pesanan.
- Mendaftar semua barang dengan banyaknya pesanan, termasuk barang yang tidak dipesan oleh siapapun.
- Menjumlah rata-rata ukuran penjualan, mencakup rekening pelanggan yang belum melakukan pesanan.
Pada setiap contoh tersebut, join memasukkan record-record tabel yang tidak mempunyai record berkaitan dalam tabel terkait. Tipe join ini disebut OUTER JOIN.
Statemen SELECT berikut adalah INNER JOIN. Statemen ini mendapatkan kembali daftar semua pelanggan dan pesanan mereka :
SELECT Customer.KodeCus, Penjualan.NoFaktur FROM Customer INNER JOIN Penjualan ON Customer.KodeCus = Penjualan.KodeCusUntuk mendapatkan kembali daftar semua pelanggan, termasuk pelanggan yang
tidak membuat pesanan, Anda dapat melakukan hal berikut :
SELECT Customer.KodeCus, Penjualan.NoFaktur FROM Customer LEFT OUTER JOIN Penjualan ON Customer.KodeCus = Penjualan.KodeCus
Seperti INNER JOIN, statemen SELECT ini menggunakan keyword OUTER JOIN untuk menentukan tipe join. Tetapi tidak seperti INNER JOIN, yang menghubungkan record pada kedua tabel, OUTER JOIN juga memasukkan record dengan yang tidak berhubungan. Dan seperti terlihat pada contoh sebelumnya, ketika membuat OUTER JOIN, Anda harus menentukan tabel dari mana Anda memasukkan semua record. Jika Anda menggunakan sintaks OUTER JOIN, Anda harus menggunakan keyword RIGHT atau LEFT. Contoh diatas menggunakan LEFT OUTER JOIN untuk memilih semua record dari tabel pada bagian kiri klausa FROM (tabel Customer). Untuk memilih semua record dari tabel pada bagian kanan, Anda dapat menggunakan RIGHT OUTER JOIN seperti terlihat pada contoh berikut :
SELECT Customer.KodeCus, Penjualan.NoFaktur FROM Customer RIGHT OUTER JOIN Penjualan ON Customer.KodeCus = Penjualan.KodeCus
memperhatikan bentuk OUTER JOIN yang digunakan, selalu ada dua bentuk dasar pada OUTER JOIN, yaitu LEFT OUTER JOIN dan RIGHT OUTER JOIN. Perbedaan di antara keduanya hanya urutan tabel yang akan dihubungkan. Dengan demikian, dua tipe OUTER JOIN dapat digunakan secara bergantian, dan keputusan tentang mana yang digunakan semata-mata tergantung pada kenyamanan.
sangat brmanfaat :)
BalasHapushttp://kopidampit.blogspot.co.id/
BalasHapuscara menampilkan Kode kereta, nama kereta dan jam keberangkatan dan jam tiba dari dan menuju Bandung.,, tolong gan
BalasHapusTerima kasih semoga bermanfaat artikelnya.
BalasHapus