Halo teman-teman semuanya kembali lagi di blog saya. Perkenalkan nama saya Cahyo Adi Nugroho, saya adalah mahasiswa teknologi informasi dari Universitas Tidar. Pada blog kali ini saya akan membahas materi tentang basis data khususnya tentang sub query. Lalu apa itu sub query? untuk apa sub query? dan bagaimana cara menggunakannya? simak penjelasan dan praktikum dibawah ini
CAPAIAN PEMBELAJARAN
- Mahasiswa mampu menjelaskan SQL bertingkat dalam basis data
- Mahasiswa mampu menerapkan SQL bertingkat dalam basis data
ALAT DAN BAHAN
- Seperangkat komputer lengkap/Laptop dengan koneksi internet
- Sistem Operasi Windows/Mac/Linux
- Aplikasi Paket Web server XAMPP
- Aplikasi Kantor (Microsoft Office/Libre Office/WPS Office/etc)
DASAR TEORI
Subquery, atau dikenal sebagai nested query, adalah perintah SQL yang disisipkan ke dalam query utama (main query) untuk menangani tugas manipulasi data yang kompleks. Subquery memungkinkan pengguna untuk menggabungkan hasil dari satu query ke dalam query lainnya, sehingga pengambilan data dapat dilakukan secara lebih terperinci dan dinamis sesuai dengan kriteria yang berasal dari query lain. Secara struktural, subquery dapat ditempatkan pada klausa SELECT untuk menghasilkan nilai tunggal, klausa FROM sebagai sumber data sementara, atau klausa WHERE untuk memfilter data berdasarkan hasil evaluasi tertentu.
Berdasarkan karakteristik data yang dihasilkan, subquery dibedakan menjadi tiga tipe utama: Multiple-column Subquery yang mengembalikan lebih dari satu kolom dan baris, Multiple-row Subquery yang menghasilkan sekumpulan baris data menggunakan operator komparasi seperti 'IN', 'ANY', atau 'ALL', serta Scalar Subquery yang menghasilkan nilai tunggal. Meskipun memberikan fleksibilitas tinggi dalam pengembangan aplikasi database, penggunaan subquery harus dilakukan secara efisien karena penggunaan yang berlebihan dapat meningkatkan kompleksitas kode dan menurunkan kinerja sistem basis data relasional.
PRAKTIKUM

Untuk mengerjakan soal praktikum diatas kita perlu membuat basis data dan beberapa tabel didalamnya. Jika pada praktikum-praktikum sebelumnya saya menggunakan Command promt line untuk melakukan otak atik database, kali ini saya akan menggunakan localhost. Dengan localhost ini kita akan lebih dimudahkan karena alih-alih menuliskan seluruh perintah yang diperlukan, kita sudah disediakan GUI yang lebih mudah digunakan.
- Membuat basis data dan beberapa tabel didalamnya
- Membuat basis data

Basis data berguna berfungsi sebagai wadah untuk beberapa tabel yang nanti akan kita kerjakan.
- Membuat tabel
Untuk mengerjakan soal tersebut kita harus membuat beberapa tabel antara lain mahasiswa, matakuliah, jurusan, dosen, dan ambil_mk
→ Tabel mahasiswa
Tabel ini berisi data dari mahasiswa.

→ Tabel matakuliah
Tabel ini berisi data dari mata kuliah.

→ Tabel jurusan
Tabel ini berisi informasi mengenai jurusan.

→ Tabel Dosen
Tabel ini berisi data dari dosen.

→ Tabel ambil_mk
Tabel ini berisi informasi mata kuliah yang diambil oleh mahasiswa.

2. Mengisi tabel
Setelah membuat tabel dengan struktur yang diperlukan saya akan mengisi tabel dengan data yang sudah disiapkan.
→ Mengisi tabel mahasiswa

→ Mengisi tabel matakuliah

→ Mengisi tabel jurusan

→ Mengisi tabel dosen

→ Mengisi tabel ambil_mk

3. Gunakan perintah sub query untuk mengerjakan soal
- Soal 1 : Dapatkan kode dan nama matakuliah dosen yang menjadi Ketua Jurusan Teknik Elektro.
Soal tersebut menuntut saya untuk menampilkan kode mata kuliah dan nama mata kuliah yang diampu oleh dosen yang menjadi ketua jurusan teknik elektro. Untuk menjawab soal tersebut maka saya harus menggunakan sub query SCALAR, yaitu subquery yang menghasilkan nilai tunggal.
SELECT kode_mk, nama_mk
FROM Matakuliah
WHERE kode_dosen = (
SELECT kode_dosen
FROM Jurusan
WHERE nama_jurusan = 'Teknik Elektro'
);→ Output :

- Soal 2 : Dapatkan data mahasiswa yang tidak mengambil matakuliah.
Soal tersebut menuntut untuk menampilkan seluruh data mahasiswa yang tidak mengamil mata kuliah. untuk itu saya menggunakan not exists, untuk mencari baris yang tidak memenuhi syarat.
SELECT *
FROM mahasiswa
WHERE NOT EXISTS (
SELECT *
FROM ambil_mk
WHERE ambil_mk.nim = mahasiswa.nim
);→ Output :

- Soal 3 : Dapatkan data dosen yang mengajar matakuliah diatas semester 3
Soal menuntut untuk menampilkan data dosen yang mengajar mata kuliah diatas semester 3, untuk itu saya menggunakan klausa in untuk menghubungkan hasil query pada tabel matakuliah dengan tabel dosen.
SELECT *
FROM dosen
WHERE kode_dosen IN (
SELECT kode_dosen
FROM matakuliah
WHERE semester > 3
);→ Output :

- Soal 4 : Dapatkan data matakuliah dosen yang bukan merupakan Ketua Jurusan Teknik Elektro
Untuk menjawab soal tersebut saya menggunakan not exists guna memilih baris yang tidak memenuhi syarat.
SELECT *
FROM matakuliah
WHERE NOT EXISTS
(SELECT *
from jurusan
where jurusan.kode_dosen = matakuliah.kode_dosen);→ Output :

- Soal 5 : Dapatkan data dosen pengajar matakuliah yang tidak diambil oleh mahasiswa
Soal nomor 5 cukup kompleks karena saya harus mennghubungkan 3 tabel sekaligus, yaitu tabel ambil_mk dengan tabel matakuliah untuk mengetahui mata kuliah apa yang ga diambil oleh mahasiswa. Setelah mengetahui matakuliah yang tidak diambil oleh mahasiswa, saya harus menghubungkan tabel matakuliah dengan tabel dosen untuk mendapatkan data dosen yang mengampu matakuliah yang tidak diambil tersebut.
SELECT *
FROM dosen
WHERE kode_dosen IN (
SELECT kode_dosen
FROM matakuliah
WHERE NOT EXISTS (
SELECT *
FROM ambil_mk
WHERE ambil_mk.kode_mk = matakuliah.kode_mk
)
);→ Output :

- Soal 6 : Dapatkan data dosen yang mengajar matakuliah dengan sks lebih besar dari sembarang sks.
Untuk mendapatkan data dosen yang lebih dari sembarang sks (saya memilih 2 sks) saya menggunakan 3 level sub query. Level paling dalam dengan tengah untuk mendapatkan baris matakuliah yang lebih dari 2. Level tengah dan luar untuk mendapatkan data dosen mata kuliah tersebut.
SELECT *
FROM dosen
WHERE kode_dosen IN
(SELECT kode_dosen
FROM matakuliah
where sks > ANY
(SELECT sks
FROM matakuliah
where sks = 2)
);
- Soal 7 : Dapatkan data mahasiswa yang tinggal satu wilayah dengan dosen yang bukan merupakan Ketua Jurusan Teknik Elektro.
Soal nomor 7 adalah soal yang cukup kompleks dimana kita harus menghubungkan 3 tabel lagi, yaitu tabel dosen dan jurusan untuk mendapatkan baris yang bukan termasuk ketua jurusan teknik elektro. Tabel dosen akan dihubungkan dengan tabel mahasiswa untuk mendapatkan data mahasiswa yang tinggal satu wilayah dengan dosen yang memenuhi syarat sebelumnya.
SELECT *
FROM mahasiswa
where alamat in
(select alamat_dosen
FROM dosen
where kode_dosen not IN
(SELECT kode_dosen
FROM jurusan
where nama_jurusan ='Teknik Elektro')
);→ Output :

- Soal 8 : Dapatkan data mahasiswa yang diajar oleh Ketua Jurusan Teknik Elektro
Ini adalah soal paling kompleks karena saya harus menghubungkan 4 tabel untuk menjawab maksud dari soal tersebut. Tabel jurusan dihubungkan dengan tabel matakuliah untuk mendapatkan mata kuliah mana yang diampu oleh dosen yang berperan sebagai ketua jurusan teknik elektro. Tabel matakuliah dihubungkan dengan tabel ambil_mk untuk mendapatkan nim mahasiswa yang mengambil mata kuliah tersbut. Setelah mendapatkan nim mahasiswa yang mengambil matakuliah yang dimaksud, saya menghubungkan tabel ambil_mk dengan tabel mahasiswa untuk mendapatkan data mahasiswa yang mengambil mata kuliah yang diampu oleh dosen ketua jurusan teknik elektro
SELECT *
FROM mahasiswa
WHERE nim IN
(SELECT nim
FROM ambil_mk
WHERE kode_mk in
(SELECT kode_mk
FROM matakuliah
where kode_dosen =
(SELECT kode_dosen
FROM jurusan
WHERE nama_jurusan = 'Teknik Elektro')
)
);→ Output :

KESIMPULAN
Dalam pengelolaan data pada sebuah basis data kita terkadang dihadapkan dengan banyak tabel, untuk menarik sebuah jawaban yang dibuuthkan dari beberapa tabel kita perlu memahami operasi sub query. Sub query adalah kueri SQL yang disisipkan di dalam kueri SQL lain (kueri utama/luar) untuk mengambil data berdasarkan kondisi dinamis. Dengan memahami konsep sub query kita dapat menerapkan kombinasi bentuk perintah sub query untuk menjawab berbagai masalah manipulasi data banyak tabel di MySql.
Penulis : Cahyo Adi Nugroho, Mahasiswa S1 Teknologi Informasi,Fakultas Teknik, Universitas Tidar Magelang
Referensi : MODUL 6 — SQL SUB QUERY