Laporan Modul VI Basis Data
Laporan Modul VI Basis Data
KELOMPOK 5 :
Angela Christine H.
130533608098
Asnita Meydelia C. K.
130533608143
MODUL VI
SUBQUERY
I. TUJUAN
1. Memahami keterhubungan entitas di dalam basis data.
2. Memahami operasi subquery dan jenis-jenisnya di dalam pengambilan data.
3. Mampu menyelesaikan kasus-kasus pengambilan data yang kompleks dengan pendekatan
subquery.
II. DASAR TEORI
Subquery
Subquery (disebut juga subselect atau nested select / query atau inner- select) adalah
query SELECT yang ada di dalam perintah SQL lain, misalnya SELECT, INSERT,
UPDATE, atau DELETE.
Keberadaan subquery secara nyata mampu menyederhanakan persoalan-persoalan
rumit berkaitan query data. Sebagai contoh, misal terdapat pernyataan sebagai berikut:
Dapatkan data mahasiswa yang alamatnya sama dengan
mahasiswa dengan nim 104
Secara normal, diperlukan dua tahapan untuk menyelesaikan kasus di atas. Pertama
adalah mendapatkan alamat dari mahasiswa yang memiliki nim 104. Langkah selanjutnya,
baru kita bisa mengetahui data mahasiswa yang alamatnya sama dengan mahasiswa
dengan nim 104.
Adapun dengan memanfaatkan subquery, maka penyelesaian kasus di atas hanya
memerlukan sebuah query (akan dijelaskan nanti). Pada hakekatnya, subquery sangat
berguna ketika sebuah query didasarkan pada nilai-nilai yang tak diketahui.
Sintaks formal subquery diperlihatkan sebagai berikut:
SELECT A1, A2, ..., An
FROM r1, r2, r3, ..., rm
WHERE P
(SELECT A1, A2, ..., An
FROM r1, r2, r3, ..., rm
WHERE P)
Subquery dapat diklasifikasikan ke dalam tiga jenis : scalar, multiple-row, dan multiplecolumn.
a. Scalar Subquery
Subquery baris tunggal (scalar) hanya mengembalikan hasil satu baris data. Bentuk
subquery ini diperlihatkan seperti Gambar 1.
III. LATIHAN
1. Himpunan Entitas
Dalam latihan ini digunakan kembali tiga buah tabel meliputi mahasiswa,
ambil_mk, dan matakuliah yang telah dibuat sebelumnya, dan ditambah dengan dua
buah tabel baru, yaitu dosen dan jurusan. Untuk itu, terlebih dahulu ciptakan tabel
dosen dan jurusan dengan struktur sebagai berikut :
CREATE TABLE dosen(
kode_dos INT(5) NOT NULL,
nama_dos VARCHAR(30) NOT NULL,
alamat_dos VARCHAR(30) NOT NULL,
PRIMARY KEY(kode_dos)
)ENGINE = MyISAM;
CREATE TABLE jurusan(
kode_jur VARCHAR(5) NOT NULL,
nama_jur VARCHAR(30) NOT NULL,
kode_dos INT(5) NOT NULL,
PRIMARY KEY(kode_jur)
)ENGINE = MyISAM;
Data yang digunakan adalah sebagai berikut (sesuaikan agar sama persis) :
Tabel Mahasiswa
nim
Nama
jenis_kelamin
alamat
101
Arif
Jl. Kenangan
102
Budi
Jl. Jombang
103
Wati
Jl. Surabaya
104
Ika
Jl. Jombang
105
Tono
Jl. Jakarta
106
Iwan
Jl. Bandung
107
Sari
Jl. Malang
Tabel ambil_mk
nim
kode_mk
101
PTI447
103
TIK333
104
PTI333
104
PTI777
111
PTI123
123
PTI999
Laporan Basis Data VI | 3
Tabel Matakuliah
kode_mk
nama_mk
sks
semester
kode_dos
PTI447
11
TIK342
11
PTI333
10
TIK123
Jaringan Komputer
33
TIK333
Sistem Operasi
10
PTI123
Grafika Multimedia
12
PTI777
Sistem Informasi
99
Tabel dosen
kode_dos
nama_dos
alamat_dos
10
Suharto
Jl. Jombang
11
Martono
Jl. Kalpataru
12
Rahmawati
Jl. Jakarta
13
Bambang
Jl. Bandung
14
Nurul
Tabel jurusan
kode_jur
nama_jur
kode_dos
TE
Teknik Elektro
10
TM
Teknik Mesin
13
TS
Teknik Sipil
23
2. Scalar Subquery
Contoh subquery baris tunggal adalah mendapatkan data mahasiswa yang Jenis
kelaminnya sama dengan mahasiswa dengan nama Wati.
select * from mhs
where jenis_kelamin=
(select jenis_kelamin from mhs
where nama="Wati");
Bisa digambarkan, langkah pertama dari operasi di atas adalah mendapatkan jenis
kelamin mahasiswa dengan nama Wati, kemudian hasilnya yakni P akan
digunakan oleh main query.
3. Multiple-Row Subquery
Pada subquery ini, kita menggunakan operator komparasi IN, ANY / SOME, atau
ALL.
Operator IN
Operator IN memiliki arti : sama dengan member di dalam list. Sebagai contoh,
kita bisa menggunakan operator ini untuk mendapatkan data dosen yang mengajar
matakuliah.
select d.kode_dos, d.nama_dos
from dosen d
where d.kode_dos IN
(select kode_dos from matakuliah);
Gambar : Operator IN
Operator ALL
Operator ALL memiliki arti : membandingkan suatu nilai dengan semua nilai yang
dikembalikan oleh subquery.
Misalkan kita ingin mendapatkan data matakuliah yang memiliki sks lebih besar
dari semua sks matakuliah di semester 3.
select * from matakuliah
where sks > all
(select sks from matakuliah
where semester = 3);
4. Multiple-Column Subquery
Subquery kolom ganda (atau tabel) juga menggunakan operator komparasi IN, ANY /
SOME, atau ALL.
Pada query ini, nilai dari subquery dalam bentuk kolom ganda
Pernyataan berikut akan mendapatkan data matakuliah yang tidak diambil oleh
mahasiswa.
select * from matakuliah m
where not exists
(select * from ambil_mk a
where m.kode_mk = a.kode_mk);
Pendekatan Join :
select d.kode_dos, d.nama_dos
from dosen d
left outer join matakuliah m
on d.kode_dos = m.kode_dos
where m.kode_dos is NULL;
b. Output
c. Pembahasan :
Data diambil dari tabel mahasiswa. Hal ini dapat kita lihat dari sintaks select
* from mhs. Perintah soal menginginkan data mahasiswa yang alamatnya sama
dengan mahasiswa dengan nim 102, tidak termasuk mahasiswa tersebut. Jadi,
terlebih dahulu kita harus mencari data data mahasiswa yang alamatnya sama
dengan mahasiswa dengan nim 102. Oleh karena itu, kita menggunakan sintaks
select alamat from mhs where nim = '102'. Akan tetapi mahasiswa yang
memilki nim 102 datanya tidak ditampilkan untuk itu kita menggunakan sintaks
and nim not like "102".
2. Dapatkan matakuliah yang tidak diajar oleh dosen terdaftar. (Poin 20)
a. Perintah SQL
select nama_mk
from matakuliah
where not exists
(select kode_dos from dosen
where kode_dos = matakuliah.kode_dos);
b. Output
c. Pembahasan
Perintah soal menginginkan tampilan dari matakuliah yang tidak diajar oleh
dosen terdaftar. karena ingin menampikan nama_mk maka yang diseleksi hanya
nama_mk dan data tersebut diambil dari tabel matakuliah. Hal ini dapat kita
lihat pada sintaks select nama_mk from matakuliah. kemudian karena yang
diminta adalah yang tidak diajar oleh dosen yang terdaftar maka kita
menggunakan where not exit. where not exists (select kode_dos from
dosen where kode_dos = matakuliah.kode_dos)
yang akan menampilkan matakuliah yang tidak diajar oleh dosen terdaftar.
3. Dapatkan data dosen yang mengajar matakuliah dengan sks lebih kecil dari
sembarang sks. (Point 25)
a. Perintah SQL
b. Output
c. Pembahasan
Untuk mendapatkan data dosen yang mengajar matakuliah dengan sks lebih
kecil dari sembarang sks. Berarti kita harus mencari data dosen yang mengajar
dengan sks terkecil terlebih dahulu. Penggunaan sintaks <any dimaksudkan
Laporan Basis Data VI | 11
untuk menampilkan data yang memiliki sks kurang dari semua sks yang ada
pada tabel matakuliah. Untuk mendapatkan data kode_dos, nama_dos,
alamat_dos kita menggunakan INNER JOIN untuk menemukan persimpangan
antara tabel dosen dan matakuliah. penggunaan distinct pada sintaks agar tidak
ada duplikasi pada data.
4. Dapatkan data dosen yang mengajar matakuliah yang sksnya kurang dari sks
matakuliah yang diajar dosen yang sekaligus menjadi ketua jurusan Teknik Elektro,
tidak termasuk ketua jurusan Teknik Elektro. (Point 30)
a. Perintah SQL
b. Output
c. Pembahasan
Karena akan
menampilkan data dosen yang mengajar matakuliah yang sksnya kurang dari
sks matakuliah yang diajar dosen yang sekaligus menjadi ketua jurusan Teknik
Elektro, tidak termasuk ketua jurusan Teknik Elektro berari kita harus mencari
jumlah sks dari ketua Jurusan Teknik Elektro untuk dijadikan acuan dasar pada
perintah soal yang diinginkan.
Laporan Basis Data VI | 12
5. Dapatkan nim, nama, dan alamat mahasiswa yang tempat tinggalnya sama dengan
dosen yang mengajar matakuliah dengan sks di bawah rata-rata. (Point 35)
a. Perintah SQL
b. Output
c. Pembahasan
V. TUGAS RUMAH
1. Dapatkan data dosen yang mengajar matakuliah dengan jumlah sks sama dengan
matakuliah yang diajar oleh ketua jurusan teknik elektro
a. Perintah SQL
b. Output
c. Pembahasan
Pada soal ini diminta untuk menampilkan data dosen yang mengajar matakuliah
dengan jumlah sks sama dengan matakuliah yang diajar oleh ketua jurusan teknik
elektro. Disini akan menggunakan syntax select distinct d.kode_dos,
d.nama_dos, d.alamat_dos
nama dosen, dan alamat dosen. Digunakan query distinct karena untuk
menghindari adanya duplikasi data. Data-data tersebut diambil dari tabel dosen dan
matakuliah dengan menggunakan syntax from dosen d, matakuliah mk dimana
kode dosen pada tabel dosen sama dengan kode dosen pada tabel matakuliah where
d.kode_dos = mk.kode_dos.
SUM(sks)
>=
ALL(select
sks
from
telah dicantumkan Kode dosen untuk ketua jurusan teknik eletro adalah 10.
2. Dapatkan nama dan nim mahasiswa yang mengambil matakuliah yang jumlah sksnya
diatas rata-rata
a. Perintah SQL
b. Output
c. Pembahasan
Dalam soal ini diminta menampilkan nama dan nim mahasiswa yang mengambil
matakuliah yang jumlah sksnya diatas rata-rata. Untuk menampilkan data nama
dan nim dari tabel mahasiswa digunakan syntax select distinct m.nim,
Laporan Basis Data VI | 15
m.nama.
data yang akan ditampilkan. Dimana nim pada tabel mahasiswa dan nim pada tabel
ambil_mk sama dan juga kode_mk pada tabel ambil_mk sama dengan kode_mk
pada tabel matakuliah (where m.nim = a.nim AND a.kode_mk = mk.kode_mk).
Karena data yang diinginkan adalah jumlah sks diatas rata-rata digunakan syntax
subquery having SUM(sks) > ANY (select AVG(sks) from matakuliah)
3. Tampilkan nim, nama, dan alamat mahasiswa yang tempat tinggalnya sama dengan
dosen yang mengajar matakuliah dengan sks diatas rata-rata
a. Perintah SQL
b. Output
c. Pembahasan
Pada soal ini diminta menampilkan nim, nama, dan alamat mahasiswa yang tempat
tinggalnya sama dengan dosen yang mengajar matakuliah dengan sks diatas ratarata. Digunakan syntax select m.nim, m.nama, m.alamat yang diambil dari
tabel mahasiswa. Dimana alamatnya sama dengan dosen yang mengajar
matakuliah dengan sks diatas rata-rata. Untuk menampilkan data tersebut,
diimplementasikan subquery yaitu where m.alamat IN(select d.alamat_dos
from dosen d, matakuliah mk where d.kode_dos = mk.kode_dos AND sks
> (select AVG(sks) from matakuliah));
sama dengan kode dosen pada tabel matakuliah dan untuk menyeleksi rata-ratanya
diimplementasikan lagi subquerynya yaitu sks > (select AVG(sks) from
matakuliah)
VI. KESIMPULAN
Subquery (disebut juga subselect atau nested select / query atau inner- select) adalah
query SELECT yang ada di dalam perintah SQL lain, misalnya SELECT, INSERT,
UPDATE, atau DELETE.
Operator EXIST dan NOT EXIST digunakan pada correlated subquery untuk
ANY / SOME,
atau ALL.
VII.DAFTAR RUJUKAN
TIM Asdos UM. 2013. Modul VI Praktikum Basis Data. Malang. Universitas Negeri
Malang.