Nested Query (Query Bersarang)

Sesuai dengan janji saya pada posting sebelumnya, kali ini saya akan tulis sedikit tentang nested query. Nested query atau query bersarang adalah query yang memiliki query lain di dalamnya.

Dalam bentuk yang sederhana sebuah query biasanya punya 3 klausa yaitu SELECT, FROM dan WHERE (Well, sebetulnya selain SELECT, FROM dan WHERE masih ada klausa HAVING, GROUP BY dan ORDER BY namun untuk menyederhanakan pembahasan maka kita fokus pada klausa SELECT, FROM dan WHERE saja dulu)

SELECT ...
 FROM ...
 WHERE ...

Biasanya SELECT diikuti dengan nama kolom, FROM diikuti dengan nama tabel dan WHERE diikuti dengan sebuah syarat/kriteria data yang akan ditampilkan (biasanya dalam bentuk persamaan logika yang bernilai True atau False). Contohnya:

SELECT first_name, salary
FROM Employees
WHERE salary > 5000;

Perhatikan bahwa “first_name” dan “salary” adalah nama kolom, “Employees” adalah nama tabel dan syarat data yang ditampilkan adalah “salary > 5000” (perhatikan juga bahwa persamaan “salary > 5000” bisa bernilai true atau false tergantung nilai salary nya)

Tapi tidak selalu demikian, dalam beberapa kasus tertentu:

  1. Ada kalanya klausa SELECT tidak diikuti dengan nama kolom, melainkan dengan query lain.
  2. Ada kalanya klausa FROM tidak diikuti oleh nama tabel melainkan diikuti dengan sebuah query lain.
  3. Ada kalanya juga salah satu ruas persamaan dalam klausa WHERE berisi query lain.

Kondisi seperti inilah yang disebut nested query atau query di dalam query. Jika query Q1 berada di dalam query Q2 maka Q1 disebut inner query dan Q2 disebut outer query.

Nested query ini sangat bermanfaat untuk memudahkan kita membuat query dengan teknik pipelining dimana hasil dari sebuah query akan digunakan lagi dalam query yang lain. Berikut ini adalah sebuah contoh kasus sederhana penggunaan nested query dengan inner query pada klausa WHERE:

Problem:
Kita ingin menampilkan nama-nama karyawan yang memiliki perkerjaan yang sama dengan karyawan bernama Diana (asumsi bahwa kita belum mengetahui apa pekerjaan si Diana).

Solusi:

  1. Jangan dulu memikirkan query yang melibatkan beberapa tabel dengan join yang ribet, gunakan saja logika kita, apa yang pertama kita lakukan? Yep, cari tau dulu apa pekerjaan si Diana.

    Select job_id from employees where first_name = 'Diana';
  2. Setelah kita menemukan pekerjaan Diana (misalnya X) maka kita tinggal mencari nama-nama orang lain yang pekerjaannya sama dengan X.
    Select first_name from employees where job_id = X;
  3. Query pada poin 2 di atas tentu saja tidak bisa dijalankan karena kita tidak pernah memasukkan nilai dari variabel X, oleh karena itu dua query di atas bisa kita gabungkan menjadi:
    Select first_name from employees
    where job_id =
    (Select job_id from employees where first_name = 'Diana');

Jika kita eksekusi maka hasilnya akan tampak seperti berikut ini:
Adapun contoh nested query lainnya:

  1. Contoh nested query dengan inner query pada klausa SELECT:
  2. Contoh nested query dengan inner query pada klausa FROM:
  3. Contoh nested query dengan inner query pada salah satu ruas dalam persamaan di klausa WHERE:

Dalam membuat nested query yang perlu diingat adalah:

  1. Inner query akan dieksekusi lebih dahulu oleh DBMS, lalu hasil dari inner query akan menjadi input bagi outer query
  2. Inner query bisa diletakkan pada klausa SELECT, pada klausa FROM atau pada klausa WHERE, tergantung kebutuhan.
  3. Inner query pada klausa SELECT dan klausa WHERE harus menghasilkan hanya satu nilai, tidak boleh menghasilkan lebih dari 1 baris atau lebih dari 1 kolom data.

Mudah bukan? Demikian, semoga bermanfaat 🙂

Catatan:

  1. Contoh-contoh di atas dapat dicoba sendiri dengan menggunakan schema HR yang sudah terinstal di Oracle masing-masing
  2. Inner query pada klausa WHERE dapat menggunakan query yang menghasilkan lebih dari satu baris data jika:
    • digunakan bersamaan dengan fungsi SOME atau ANY
      atau
    • digunakan bersamaan dengan klausa IN atau NOT IN

Well, sekarang saya jadi kepikiran untuk nulis tentang fungsi SOME dan ANY 😆

Iklan

Satu pemikiran pada “Nested Query (Query Bersarang)

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s