Menggunakan Subquery untuk
Memecahkan QueryQuery
Ø Menggunakan suatu Subquery untuk
Memecahkan suatu Persoalan
Misalkan
Anda ingin menulis suatu query untuk mencari tahu penghasilan siapa
yang lebih besar daripada penghasilan Abel. Untuk memecahkan masalah
ini, Anda memerlukan dua query: satu query untuk mencari berapa
banyak penghasilan Abel, dan query kedua untuk mencari penghasilan siapa
yang lebih besar dari jumlah itu. Anda dapat memecahkan persoalan ini
dengan menggabungkan dua query, menempatkan satu query di dalam query
lain. Inner query (atau subquery) mengembalikan suatu
nilai yang digunakan outer query (atau query utama). Penggunaan
suatu subquery sama dengan penggunaan dua query berturut turut
dan menggunakan hasil dari query pertama sebagai nilai pencari dalam
query yang kedua.
Ø Sintak Subquery
SELECT
select_list
FROM
table
WHERE expr operator (SELECT
select_list FROM table);
Suatu
subquery adalah suatu pernyataan SELECT yang dilekatkan didalam
suatu klausa pada pernyataan SELECT lain. Anda dapat membangun
pernyataan pernyataan yang kuat selain yang sederhana dengan menggunakan
subquery subquery. Subquery subquery bisa sangat
bermanfaat ketika Anda memerlukan untuk memilih baris baris dari suatu
table dengan suatu kondisi yang tergantung pada data didalam tabel itu
sendiri. Anda dapat menempatkan subquery didalam sejumlah klausa
klausa SQL, termasuk berikut :
Klausa
WHERE
Klausa
HAVING
Klausa
FROM
Didalam Syntax :
Operator
termasuk
suatu kondisi pembanding seperti >, =, atau IN
Catatan
:
Kondisi kondisi pembanding dibagi dalam dua kelas : singlerow
operator (>,=,>=,<,<>,<=) dan multiplerow
operator (IN, ANY, ALL). Subquery lebih dikenal sebagai suatu
SELECT bersarang (nested), subSELECT, atau pernyataan inner
SELECT. Secara umum subquery dieksekusi pertama kali, dan
hasilnya digunakan untuk melengkapi kondisi query pada query utama (atau
outer).
Ø Pedoman Pedoman untuk Menggunakan Subquery
Suatu
subquery harus diapit tanda kurung.
Tempatkan
subquery disisi kanan dari kondisi pembanding agar mudah dibaca.
Pada
Oracle8i dan keluaran keluaran berikutnya, suatu klausa ORDER BY
bisa digunakan dan diperlukan dalam subquery untuk melakukan
pemeringkatan (TopN analysis). Sebelumnya pada Oracle8i,
bagaimanapun, subquery subquery tidak bisa memuat klausa ORDER
BY.Klausa ORDER BY hanya sekali digunakan untuk suatu pernyataan SELECT;
jika ditentukan, klausa ORDER BY berada diakhir pada pernyataan SELECT
utama.
Dua
kelas dari kondisi kondisi pembanding digunakan dalam subquery
subquery: singlerow operator dan multiplerow operator.
Ø Tipe Tipe dari Subquery
Singlerow subquery: Query yang mengembalikan hanya
satu baris dari pernyataan inner SELECT (SELECT terdalam).
Multiplerow subquery: Query yang mengembalikan lebih dari
satu baris dari pernyataan inner SELECT.
Ø Single Row Subqueries
Suatu
singlerow subquery adalah mengembalikan satu baris dari
pernyataan inner SELECT. Tipe dari subquery ini
menggunakan suatu singlerow operator. Pada slide diberikan suatu
daftar dari operator operator singlerow.
Contoh
Tampilkan
pegawai pegawai yang job IDnya sama dengan pegawai 141:
SELECT
last_name, job_id
FROM
employees
WHERE
job_id = (SELECT job_id FROM employees WHERE employee_id = 141 );
Ø Menggunakan Grup Function dalam
suatu Subquery
Anda
bisa menampilkan data dari suatu query utama dengan menggunakan grup
function didalam subquery untuk mengembalikan suatu baris
tunggal. Subquery berada dalam tanda kurung dan diletakkan
setelah kondisi pembanding.
Contoh
:
SELECT last_name, job_id, salary
FROM
employees
WHERE
salary = (SELECT MIN(salary) FROM employees);
Contoh
tersebut menampilkan nama belakang pegawai, job ID, dan penghasilan
seluruh pegawai yang penghasilannya sama dengan penghasilan minimum. Group
function MIN mengembalikan suatu nilai tunggal (2500) untuk outer
query.
Ø Klausa HAVING dengan Subquery
Anda
dapat menggunakan subquery subquery tidak hanya pada klausa
WHERE tapi bisa juga pada klausa HAVING. Server Oracle mengeksekusi subquery,
dan hasilnya dikembalikan ke dalam klausa HAVING pada query utama.
Ø Kesalahan Kesalahan pada Subquery
Subquery
Satu
kesalahan umum pada subquery terjadi ketika lebih dari satu baris
dikembalikan untuk suatu singlerow subquery.
SELECT
employee_id, last_name
FROM
employees
WHERE
salary = (SELECT MIN(salary) FROM employees GROUP BY department_id);
Pada
pernyataan SQL diatas, subquery berisi suatu klausa GROUP BY,
yang berakibat subquery itu akan mengembalikan banyak baris, satu dari
setiap kelompok yang ditemukannya. Dalam kasus ini, hasil dari subquery
adalah 4400, 6000, 2500, 4200, 7000, 17000, dan 8300. Outer
query mengambil hasil hasil itu dan menggunakannya pada klausa
WHERE. Klausa WHERE berisi suatu operator samadengan ( = ), suatu
operator pembanding singlerow yang dikira hanya satu nilai.
Operator = tidak menerima lebih dari satu nilai dari subquery dan
oleh karena itu menghasilkan kesalahan. Untuk memperbaiki kesalahan
ini, rubah operator = menjadi IN.
Ø Multiple Row Subqueries
Subquery
subquery yang mengembalikan lebih dari satu baris disebut multiplerow
subqueries. Anda menggunakan suatu multiplerow
operator, disamping suatu singlerow operator, pada suatu miltiplerow
subquery. Multiplerow operator memperkirakan satu atau lebih
nilai nilai :
Contoh
Cari
pegawai pegawai yang mendapat penghasilan yang sama dengan penghasilan
minimum untuk setiap departemen. Inner query dieksekusi pertama
kali, menghasilkan suatu hasil query. Blok query utama kemudian
memproses dan menggunakan nilai nilai yang dikembalikan oleh inner
query untuk melengkapi kondisi pencariannya. Sesungguhnya, query
utama tampak pada server Oracle sebagai berikut:
SELECT
last_name, salary, department_id
FROM
employess
WHERE
salary IN (2500, 4200, 6000, 7000, 800, 8600, 17000);