Anda di halaman 1dari 12

Dalam pengembangan suatu aplikasi ataupun sistem informasi, tidak terlepas dari

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, …’

3. Tentukan kolom yang menjadi penguhubung/relasi antar masing-masing tabel yang


digunakan. Dimana kolom ini dinyatakan pada Klausa ‘…. WHERE tabel1.Field-x =
tabel2.Field-x ….. ‘

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.

Untuk kasus diatas, maka query SQLnya menjadi :

‘SELECT pasien.NoPasien, pasien.NamaPasien’

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’

Maka query SQLnya menjadi :

‘FROM pasien, periksa, dokter’

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.

Maka query SQLnya menjadi :

‘WHERE pasien.NoPasien = periksa.NoPasien AND periksa.NoDokter = dokter.NoDokter’

4. Yang menjadi prasyarat adalah dokter = ‘Maya Aris’.

Maka query SQLnya menjadi :

2
‘AND dokter.NamaDokter = ‘Maya Aris’

Berdasarkan langkah-langkah tersebut, maka Query SQL untuk kasus tersebut menjadi :

‘SELECT pasien.NoPasien, pasien.NamaPasien

FROM pasien, periksa, dokter

WHERE pasien.NoPasien = periksa.NoPasien AND periksa.NoDokter = dokter.NoDokter

AND dokter.NamaDokter = ‘Maya Aris’

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 :

‘SELECT DISTINCTpasien.NoPasien, pasien.NamaPasien

FROM pasien, periksa, dokter

WHERE pasien.NoPasien = periksa.NoPasien AND periksa.NoDokter = dokter.NoDokter

AND dokter.NamaDokter = ‘Maya Aris’

Sehingga tabel yang dihasilkan 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’

2. Berapa jumlah pasien dokter ‘Fahmi’ ?

Query SQLnya :

SELECT DISTINCT COUNT(NoPasien)

FROM periksa, dokter

WHERE periksa.NoDokter = dokter.NoDokter

AND dokter.NamaDokter = ‘Fahmi’

Oracle SQL & PL/SQL – 5. Menampilkan Data dari


Beberapa Tabel
Ketika kita memerlukan data dari beberapa tabel dalam database, dapat menggunakan kondisi
join. Data dari satu tabel dapat digabungkan dengan data dari tabel lain berdasarkan nilai-
nilai yang terdapat pada kolom-kolom yang berhubungan, yang disebut kolom-kolom
primary key dan foreign key.

Tipe-tipe Join

 Equijoin
 Non-equijoin
 Outer join
 Self join

5.1. Cartesian Product

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:

SELECT name, last_name


FROM department, employee;

300 rows selected.

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.

SELECT table.column, table.column…


FROM table1, table2
WHERE table1.column1 = table2.column2;

Contoh:

Menampilkan data karyawan dan departemen tempat karyawan tersebut bekerja.

SELECT employee.last_name, employee_dept_id, department.name


FROM employee, department
WHERE employee.dept_id = department.id;

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.

5.2.1. Menambahkan Kondisi Pencarian

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.

SELECT employee.last_name, employee.dept_id, department.name


FROM employee, department
WHERE employee.dept_id = department.id
AND INITCAP(employee.last_name) = ‘Velasquez’;

5.3. Penggunaan Alias Tabel

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:

Menampilkan data karyawan dan departemen tempat karyawan tersebut bekerja.

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:

Menampilkan data karyawan dan tingkatan gajinya.

SELECT e.last_name, e.title, e.salary, s.grade


FROM employee e, salgrade s
WHERE e.salary BETWEEN s.losal AND s.hisal;

5.5. Outer Join

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:

SELECT table.column, table.column…


FROM table1, table2
WHERE table1.column = table2.column(+);

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;

5.6. Self Join

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:

Menampilkan data karyawan dan manajer dari karyawan tersebut.

SELECT e.last_name|| ‘ works for ‘ || m.last_name


FROM employee e, employee m
WHERE e.manager_id = m.id;

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.

SELECT name, last_name


FROM employee, department;

Tampilkan nama belakang pegawai, kode dan nama departemen dimana pegawai tersebut
bekerja.

SELECT e.last_name, e.dept_id, d.name


FROM employee e, department d
WHERE e.dept_id = d.id;

Tampilkan kode departemen, kode dan nama daerah tempat departemen tersebut berada.

SELECT d.id, r.id, r.name


FROM department d, region r
WHERE d.region_id = r.id;

Tampilkan pegawai dengan nama belakang Menchu, kode dan nama departemen tempat ia
bekerja.

SELECT e.last_name, e.dept_id, d.name


FROM employee e, department d
WHERE e.dept_id = d.id AND e.last_name = ‘Menchu’;

7
Tampilkan nama belakang dan prosentase komisi masing pegawai, serta nama daerah tempat
pegawai tersebut bekerja, khusus untuk pegawai yang mendapatkan komisi.

SELECT e.last_name, r.name, e.commission_pct


FROM employee e, department d, region r
WHERE e.dept_id = d.id AND d.region_id = r.id
AND e.commission_pct IS NOT NULL;

Tampilkan nama pelanggan, kode dan nama daerah tempat dimana pelanggan tersebut
tinggal.

COLUMN “Customer Name” FORMAT A30

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.

SELECT e.last_name ENAME, e.title JOB, e.salary SAL, s.grade GRADE


FROM employee e, salgrade s
WHERE e.salary BETWEEN s.losal AND s.hisal;

Tampilkan nama belakang sales representative, kode pegawai, dan nama pelanggan termasuk
pelanggan yang tidak memiliki sales representative, urut berdasarkan kode pegawai.

SELECT e.last_name, e.id, c.name


FROM employee e, customer c
WHERE e.id(+) = c.sales_rep_id
ORDER BY e.id;

Tampilkan nama belakang pegawai dan nama belakang atasan dari pegawai tersebut.

SELECT e.last_name | | ‘ works for ‘ | | m.last_name EMP


FROM employee e, employee m
WHERE e.manager_id = m.id;

Tampilkan nama belakang pegawai, kode dan nama departemen tempat pegawai tersebut
bekerja.

SELECT e.last_name, e.dept_id, d.name


FROM employee e, department d
WHERE e.dept_id = d.id;

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.

SELECT e.last_name, d.name


FROM employee e, department d
WHERE e.dept_id = d.id AND e.last_name = ‘Smith’;

Tampilkan nama produk, kode produk dan kuantitas order dari produk tersebut, khusus untuk
order dengan nomor 101.

SELECT p.name, p.id, i.quantity ORDERED


FROM product p, orders o, items i
WHERE p.id = i.product_id AND i.ord_id = o.id AND o.id = 101;

Tampilkan kode pelanggan dan nama belakang dari sales representative-nya urut berdasarkan
nama belakang sales representative.

SELECT c.id, e.last_name


FROM customer c, employee e
WHERE c.sales_rep_id = e.id
ORDER BY e.last_name;

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.

SELECT e.last_name EMP_NAME, e.id EMP_ID,m.last_name MGR_NAME, m.id


MGR_ID
FROM employee e, employee m
WHERE e.manager_id = m.id;

Tampilkan kembali soal diatas termasuk pegawai yang tidak memiliki atasan.

SELECT e.last_name EMP_NAME, e.id EMP_ID, m.last_name MGR_NAME, m.id


MGR_ID
FROM employee e, employee m
WHERE e.manager_id = m.id(+);

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;

Menampilkan Transaksi Peminjaman yang Belum


Kembali
Kembali ke permasalahan utama tutorial ini, yaitu menampilkan data di suatu tabel yang
tidak ada di tabel yang lainnya. Dalam contoh kasus Sistem Informasi Perpustakaan di atas,
kita akan menampilkan transaksi peminjaman yang belum dikembalikan. Data yang akan
ditampilkan adalah ID Peminjaman, tanggal peminjaman, nama anggota peminjam dan batas
akhir pengembalian. Untuk melakukan hal tersebut, kita perlu menggabungkan 3 (tiga) buah
tabel sekaligus yaitu tabel (1) anggota, (2) peminjaman dan (3) pengembalian. Kita akan
menampilkan data yang ada di tabel peminjaman namun belum ada di tabel pengembalian.

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

SELECT b.id_pinjam, b.tgl_pinjam, a.nama, b.tgl_hrskembali


FROM anggota a INNER JOIN peminjaman b ON a.kd_anggota=b.kd_anggota
LEFT JOIN pengembalian c ON b.id_pinjam=c.id_pinjam
WHERE c.id_pinjam IS 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.

SELECT b.id_pinjam, b.tgl_pinjam, a.nama, b.tgl_hrskembali


FROM anggota a INNER JOIN peminjaman b ON a.kd_anggota=b.kd_anggota
WHERE b.id_pinjam NOT IN (SELECT id_pinjam FROM 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.

Berikut ini hasil dari perintah query diatas.

Menampilkan Buku yang Masih Dipinjam (Belum


Dikembalikan)
Pada dasarnya permasalahan ini sama seperti sebelumnya, hanya saja data yang ingin
ditampilkan adalah data buku, bukan data transaksi peminjaman. Kolom yang akan
ditampilkan meliputi kode buku, judul buku, nama peminjam, tanggal peminjaman dan
tanggal harus kembali. Untuk menyelesaikannya, kita perlu melibatkan tabel detil_pinjam
serta tabel terkait buku dan copy buku. Dengan kata lain, kita perlu menggabungkan semua
tabel pada Gambar 1.

Perhatikan dan pahami query 3 berikut ini.

SELECT e.kd_buku, e.judul, a.nama, b.tgl_pinjam, b.tgl_hrskembali


FROM anggota a INNER JOIN peminjaman b ON a.kd_anggota=b.kd_anggota
INNER JOIN detil_pinjam c ON b.id_pinjam=c.id_pinjam
INNER JOIN copy_buku d ON c.kd_copybuku=d.kd_copybuku
INNER JOIN buku e ON d.kd_buku=e.kd_buku
LEFT JOIN pengembalian f ON b.id_pinjam=f.id_pinjam
WHERE f.id_pinjam IS NULL
ORDER BY e.judul

Hasil dari perintah query 3 di atas sebagai berikut.

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