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

  1. Mahasiswa mampu menjelaskan SQL bertingkat dalam basis data
  2. Mahasiswa mampu menerapkan SQL bertingkat dalam basis data

ALAT DAN BAHAN

  1. Seperangkat komputer lengkap/Laptop dengan koneksi internet
  2. Sistem Operasi Windows/Mac/Linux
  3. Aplikasi Paket Web server XAMPP
  4. 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

None

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.

  1. Membuat basis data dan beberapa tabel didalamnya
  • Membuat basis data
None
Buat basis data dengan nama "pertemuan_10_(subquery)"

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.

None
Strukutr tabel mahasiswa

→ Tabel matakuliah

Tabel ini berisi data dari mata kuliah.

None
Struktur data mata kuliah

→ Tabel jurusan

Tabel ini berisi informasi mengenai jurusan.

None
Strukutur tabel jurusan

→ Tabel Dosen

Tabel ini berisi data dari dosen.

None
Strukutur tabel dosen

→ Tabel ambil_mk

Tabel ini berisi informasi mata kuliah yang diambil oleh mahasiswa.

None
Struktur tabel ambil_mk

2. Mengisi tabel

Setelah membuat tabel dengan struktur yang diperlukan saya akan mengisi tabel dengan data yang sudah disiapkan.

→ Mengisi tabel mahasiswa

None
Tabel mahasiswa

→ Mengisi tabel matakuliah

None
Tabel matakuliah

→ Mengisi tabel jurusan

None
Tabel Jurusan

→ Mengisi tabel dosen

None
Tabel Dosen

→ Mengisi tabel ambil_mk

None
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 :

None
output soal 1
  • 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 :

None
Output soal 2
  • 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 :

None
Output soal 3
  • 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 :

None
Output soal 4
  • 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 :

None
Output soal 6
  • 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)
);
None
Output soal 6
  • 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 :

None
Output soal 7
  • 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 :

None
Output soal 8

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