Basis Data
Basis Data
penggunaan database. Dimana database yang digunakan tentunya melibatkan lebih dari satu
tabel yang saling berelasi (Multi tabel). Namun penggunaan tabel yang saling berelasi
membutuhkan query SQL yang cukup kompleks, tergantung dari tingkat kerumitan relasi
antar tabel yang digunakan.
Berikut beberapa tips untuk membuat query SQL untuk tabel yang saling berelasi satu sama
lain. Dimana pembahasan dititikberatkan pada penggunaan query SELECT. Untuk
mempermudah, berikut diberikan contoh 3 buah tabel yang saling berelasi, dengan studi
kasus sebuah klinik.
A. Tabel Pasien
B. Tabel Dokter
C. Tabel Dokter
Berdasarkan ketiga tabel tersebut, maka relasi antar tabel dapat dilihat pada gambar berikut :
Misalkan kita akan menampilkan data pasien yang diperiksa oleh dokter ‘Maya Aris’.
Dimana data yang ditampilkan oleh adalah NoPasien dan NamaPasien. Untuk pembuatan
query SQL pada kasus tersebut, dapat diterapkan langkah-langkah berikut :
1
1. Tentukan kolom/field mana saja yang akan ditampilkan, dimana kolom/field ini yang akan
dinyatakan pada query ‘SELECT namakolom1, namakolom2, …’
2.Tentukan tabel mana saja yang akan digunakan, dimana tabel ini akan dinyatakan pada
klausa ‘… FROM tabel1, tabel2, …’
Catatan : jika jumlah kolom yang menjadi penghubung/relasi lebih dari satu kolom, maka
dihubungkan dengan operator ‘AND’, seperti ‘WHERE tabel1.Field-x = tabel2.Field-x AND
tabel2.Field-y = tabel3.Field-y … ‘
4. Tentukan apa yang menjadi prasyarat yang diminta pada kasus tersebut. Misalnya
prasyaratnya adalah dokter = ‘Maya Aris’, maka querynya menjadi ‘WHERE …. AND
dokter.NamaDokter = ‘ Maya Aris’.
Untuk menjawab kasus di atas , maka jika kita mengikuti langkah-langkah diatas :
1. Kolom/field yang digunakan : NoPasien dan NamaPasien yang diambil dari tabel pasien.
Catatan: karena menggunakan tabel lebih dari satu yang saling berelasi maka, setiap
penyebutan nama kolom/field, sebaiknya disebutkan terlebih dahulu nama tabel dimana
kolom/field berasal, seperti berikut : NamaTabel.NamaKolom.
2. Tabel yang akan digunakan pada kasus ini meliputi : Tabel Pasien untuk mengetahui
NoPasien dan NamaPasien, Tabel Periksa untuk mendapatkan data jadwal periksa dosen, dan
Tabel Dokter untuk mendapatkan NamaDokter yang menjadi prasyarat, dalam hal ini
NamaDokter = ‘Maya Aris’
3. Kolom penghubung antara ketiga tabel tersebut adalah kolom NoPasien sebagai
penghubung antar tabel pasien dan tabel periksa, serta kolom NoDokter sebagai penghubung
antara tabel Periksa dan tabel Dokter.
2
‘AND dokter.NamaDokter = ‘Maya Aris’
Berdasarkan langkah-langkah tersebut, maka Query SQL untuk kasus tersebut menjadi :
Jika Query SQL di atas dijalankan maka akan dihasilkan tabel sebagai berikut :
Jika dilihat dari tabel yang dihasilkan di atas, maka terdapat NamaPasien yang double. Untuk
mengantisipasi hal tersebut, kita dapat menambahkan klausa ‘DISTINCT’ pada ‘SELECT’,
Hingga query SQL menjadi :
Langkah-langkah di atas dapat kita terapkan untuk beberapa kasus berikut yang melibatkan
beberapa tabel :
1. Buatlah data periksa pasien atas nama ‘Dira Anifa’ yang terdiri atas NoPeriksa, tanggal
periksa dan Nama Dokter
Query SQLnya :
3
SELECT periksa.NoPeriksa, periksa.TglPeriksa, dokter.NamaDokter
FROM pasien, periksa, dokter
WHERE pasien.NoPasien = periksa.NoPasien
AND periksa.NoDokter = dokter.NoDokter
AND pasien.NamaPasien = ‘Dira Anifa’
Query SQLnya :
Tipe-tipe Join
Equijoin
Non-equijoin
Outer join
Self join
Cartesian Product adalah hasil dari join yang tidak valid, sehingga menyebabkan
ditampilkannya seluruh kombinasi data dari tabel-tabel yang di-join-kan. Seluruh baris dari
tabel pertama di-join-kan dengan seluruh baris pada tabel kedua.
Contoh:
Tips
4
Selalu gunakan join yang valid dalam klausa WHERE, kecuali anda memang menginginkan
hasil kombinasi tersebut.
5.2. Equijoin
Kita dapat menampilkan data-data dari kedua tabel dengan men-join-kan foreign key dari
satu tabel dengan primary key dari tabel lainnya.
Contoh:
Jika terdapat nama kolom yang sama pada tabel-tabel yang di-join-kan, kita harus
menentukan dari table mana kolom tersebut berasal dengan menyebutkan nama tabelnya,
namun sebaliknya jika tidak terdapat nama kolom yang sama pada tabel-tabel yang di-join-
kan, kita tidak harus menentukan dari table mana kolom tersebut berasal.
Tips:
Nama tabel sebaiknya tetap digunakan meskipun diantara tabel-tabel yang di-join-kan
tersebut tidak memiliki nama kolom yang sama karena dapat meningkatkan performa query.
Kita dapat menambahkan kondisi pencarian dalam join dengan menggunakan operator AND
atau OR sesuai kriteria yang diinginkan.
Contoh:
Menampilkan data karyawan yang memiliki nama akhir Velasquez dan departemen tempat
karyawan tersebut bekerja.
Menuliskan kolom dengan nama tabel dapat memakan waktu, terlebih jika nama tabel cukup
panjang. Kita dapat mengatasi hal ini dengan menggunakan alias tabel (memberikan nama
lain kepada tabel dengan nama yang lebih pendek).
5
Contoh:
SELECT e.last_name “Employee Name”, d.id “Dept ID”, d.name “Department Name”
FROM employee e, department d
WHERE e.dept_id = d.id;
Perhatikan query tersebut diatas, yang dimaksud alias tabel adalah e dan d yang masing-
masing mewakili tabel karyawan dan departemen.
5.4. Non-Equijoin
Non-equijoin adalah relasi antara dua atau lebih tabel dimana nilai dari kolom-kolom yang
dihubungkan tidak saling berhubungan secara langsung (tidak ada hubungan primary key dan
foreign key). Dalam non-equijoin digunakan operator selain equal (=).
Contoh:
Sebuah query tidak akan menghasilkan data apapun apabila kondisi join tidak terpenuhi.
Sebagai contoh, Anda dapat mencoba menampilkan nama-nama pelanggan dan sales
representative dengan cara meng-equijoin-kan table Karyawan dan Pelanggan. Pelanggan
yang tidak memiliki sales representative tidak akan ditampilkan karena kondisi join tidak
terpenuhi.
Kita dapat menangani data yang hilang tersebut dengan menggunakan operator outer join (+),
yang diletakkan pada sisi kolom dari tabel yang bertindak sebagai parent (induk).
Operator ini akan menampilkan hasil dari equijoin ditambah dengan hasil query yang tidak
memenuhi kondisi equijoin tersebut.
Sintaks:
Contoh:
Menampilkan data pelanggan dan nama sales representative dari pelanggan tersebut baik
yang memiliki sales representative maupun tidak.
6
SELECT e.last_name, e.id, c.name
FROM employee e, customer c
WHERE c.sales_rep_id = e.id (+)
ORDER BY e.id;
Self join adalah hubungan antara suatu tabel dengan tabel itu sendiri. Hal ini dimungkinkan
dengan menggunakan alias tabel sehingga seolah-olah terdapat dua tabel.
Contoh:
Perhatikan kasus diatas, karena manajer juga merupakan karyawan maka semua data yang
diperlukan berasal dari satu tabel yaitu Employee. Dengan menggunakan alias tabel kita
menciptakan seolah-olah terdapat dua tabel yaitu e (employee) dan m (manager), yang
keduanya berasal dari tabel yang sama yaitu Employee.
5.7. Latihan
Tampilkan nama departemen dan nama belakang dari pegawai dalam satu query.
Tampilkan nama belakang pegawai, kode dan nama departemen dimana pegawai tersebut
bekerja.
Tampilkan kode departemen, kode dan nama daerah tempat departemen tersebut berada.
Tampilkan pegawai dengan nama belakang Menchu, kode dan nama departemen tempat ia
bekerja.
7
Tampilkan nama belakang dan prosentase komisi masing pegawai, serta nama daerah tempat
pegawai tersebut bekerja, khusus untuk pegawai yang mendapatkan komisi.
Tampilkan nama pelanggan, kode dan nama daerah tempat dimana pelanggan tersebut
tinggal.
SELECT c.name “Customer Name”, c.region_id “Region ID”, r.name “Region Name”
FROM customer c, region r
WHERE c.region_id = r.id;
Tampilkan nama belakang pegawai dengan judul ENAME, jabatan pegawai dengan judul
JOB, gaji bulanan pegawai dengan judul SAL, dan tingkatan gaji pegawai dengan judul
GRADE, khusus untuk pegawai yang memiliki gaji diantara kolom losal dan hisal pada tabel
S_SALGRADE.
Tampilkan nama belakang sales representative, kode pegawai, dan nama pelanggan termasuk
pelanggan yang tidak memiliki sales representative, urut berdasarkan kode pegawai.
Tampilkan nama belakang pegawai dan nama belakang atasan dari pegawai tersebut.
Tampilkan nama belakang pegawai, kode dan nama departemen tempat pegawai tersebut
bekerja.
Tampilkan nama belakang pegawai, nama departemen tempat pegawai tersebut bekerja dan
nama daerah tempat departemen tersebut berada.
8
SELECT e.last_name, d.name, r.name
FROM employee e, department d, region r
WHERE e.dept_id = d.id AND d.region_id = r.id;
Tampilkan nama belakang pegawai dan nama departemen tempat pegawai tersebut bekerja
khusus untuk pegawai dengan nama belakang Smith.
Tampilkan nama produk, kode produk dan kuantitas order dari produk tersebut, khusus untuk
order dengan nomor 101.
Tampilkan kode pelanggan dan nama belakang dari sales representative-nya urut berdasarkan
nama belakang sales representative.
Tampilkan kode pelanggan, nama pelanggan dan nomor order dari pelanggan tersebut,
termasuk pelanggan yang tidak memiliki nomor order.
SELECT c.id “Customer ID”, c.name “Customer Name”, o.id “Order ID”
FROM customer c, orders o
WHERE o.customer_id(+) = c.id;
Tampilkan nama belakang pegawai, kode pegawai, nama belakang atasan dari pegawai
tersebut, serta kode dari atasan pegawai tersebut.
Tampilkan kembali soal diatas termasuk pegawai yang tidak memiliki atasan.
Tampilkan nama pelanggan, kode produk dan kuantitas order pelanggan terhadap produk
tersebut khusus untuk pelanggan yang memiliki total order lebih dari 100000.
9
SELECT c.name “Customer”, i.product_id, i.quantity
FROM customer c, orders o, items i
WHERE c.id = o.customer_id AND o.id = i.ord_id AND o.total > 100000;
Perhatikan perintah query sebagai berikut. Antara tabel anggota dan peminjaman dilakukan
INNER JOIN sedangkan antara peminjaman dan pengembalian dilakukan LEFT JOIN karena
terdapat kemungkinan data di peminjaman tidak ada di tabel pengembalian. Jika ingin
menampilkan data peminjaman yang belum kembali cukup menambahkan kondisi dimana ID
pinjam di tabel pengembalian masih kosong (NULL).
Cara lain untuk menyelesaikan permasalahan yang sama adalah dengan menggunakan sub-
query atau sub-select. Cara kedua ini tidak memerlukan join dengan tabel pengembalian.
10
Kedua query di atas akan menampilkan hasil yang sama, namun demikian query 1 yang
menggunakan JOIN lebih disarankan karena memiliki performa / kecepatan yang lebih baik.
Beberapa sumber menyatakan bahwa query JOIN lebih baik dari SUBQUERY dari sisi
performa, diantaranya salah satu diskusi di situs StackOverflow.
Kesimpulan
Tutorial ini menjelaskan secara singkat mengenai bagaimana perintah query untuk mencari
record atau data yang ada di suatu tabel namun tidak ada di tabel yang lainnya. Dalam tutorial
ini dicontohkan kasus sistem informasi perpustakaan. Solusi permasalahan dapat
menggunakan query dengan penggabungan LEFT JOIN dan query dengan SUB-SELECT
atau SUBQUERY. Keduanya dapat digunakan namun lebih disarankan menggunakan LEFT
JOIN karena lebih baik secara performa.
11
12