Subquery (SQL 1)

Resume 6

Subquery

 

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 berturutturut

dan

menggunakan hasil dari query pertama sebagai nilai pencari dalam query yang kedua.

Sintak Subquery

Suatu subquery adalah suatu pernyataan SELECT yang dilekatkan didalam suatu klausa pada

pernyataan SELECT lain. Anda dapat membangun pernyataanpernyataan

yang kuat selain yang

sederhana dengan menggunakan subquerysubquery.

Subquerysubquery

bisa sangat bermanfaat

ketika Anda memerlukan untuk memilih barisbaris

dari suatu table dengan suatu kondisi yang

tergantung pada data didalam tabel itu sendiri.

Anda dapat menempatkan subquery didalam sejumlah klausaklausa

SQL, termasuk berikut :

 Klausa WHERE

 Klausa HAVING

 Klausa FROM

Didalam Syntax :

Operator termasuk suatu kondisi pembanding seperti >, =, atau IN

Catatan : Kondisikondisi

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).

PedomanPedoman

untuk Menggunakan Subquery

 Suatu subquery harus diapit tanda kurung.

 Tempatkan subquery disisi kanan dari kondisi pembanding agar mudah dibaca.

 Pada Oracle8i dan keluarankeluaran

berikutnya, suatu klausa ORDER BY bisa digunakan dan

diperlukan dalam subquery untuk melakukan pemeringkatan (TopN

analysis).

Sebelumnya

pada Oracle8i, bagaimanapun, subquerysubquery

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 kondisikondisi

pembanding digunakan dalam subquerysubquery:

singlerow

operator dan multiplerow

operator.

 

 

TipeTipe 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.

Catatan : Ada juga multiplecolumn

subquery, dimana queryquery

itu mengembalikan lebih dari

satu kolom dari pernyataan inner SELECT.

  1. 1.      SingleRow 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

operatoroperator

singlerow.

Contoh

Tampilkan pegawaipegawai

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 pada slide 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 subquerysubquery

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.

Pernyataan SQL dalam slide menampilkan semua departemen yang mempunyai penghasilan

minimum lebih besar dari departemen 50.

DEPARTMEN_ID MIN(SALARY)

10 4400

20 6000

. . .

7000

7 ROWS SELECTED

Contoh :

Cari jabatan dengan penghasilan ratarata

minimum.

SELECT job_id, AVG(salary)

FROM employees

GROUP BY job_id

HAVING AVG(salary) = (SELECT MIN(AVG(salary))

FROM employees

GROUP BY job_id);

 

KesalahanKesalahan pada SubquerySubquery

Satu kesalahan umum pada subquery terjadi ketika lebih dari satu baris dikembalikan untuk suatu

singlerow

subquery.

Pada pernyataan SQL dalam slide, 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 hasilhasil

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.

  1. 2.      MultipleRow Subqueries

Subquerysubquery

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 nilainilai

:

Contoh

Cari pegawaipegawai

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 nilainilai

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);

2.1.MultipleRow Subqueries (lanjutan)

Operator ANY ( dan sinonimnya, operator SOME) membandingkan suatu nilai pada setiap nilai yang

dikembalikan oleh suatu subquery. Contoh pada slide menampilkan para pegawai yang bukan IT

programmers dan penghasilan siapa yang kurang dari beberapa IT programmer. Penhasilan

maksimum yang didapat seorang programmer adalah $ 9,000.

<ANY maksudnya kurang dari maksimum. >ANY maksudnya lebih dari minimum. =ANY adalah

sama dengan IN.

2.2.MultipleRow Subqueries (lanjutan)

Operator ALL membandingkan suatu nilai untuk setiap nilai yang dikembalikan oleh suatu

subquery. Contoh dalam slide menampilkan para pegawai yang penghasilannya kurang dari

penghasilan dari semua pegawai dengan suatu job ID IT_PROG dan siapa yang bukan IT_PROG.

>ALL maskudnya lebih dari maksimum, dan <ALL maksudnya kurang dari minimum.

Operator NOT dapat digunakan dengan operatoroperator

IN, ANY, dan ALL.

 

Mengembalikan NullNull dalam Menghasilkan Kumpulan dari suatu Subquery

Pernyataan SQL dalam slide mencoba untuk menampilkan semua pegawai yang tidak memiliki

beberapa subordinate. Secara logika, pernyataan SQL ini akan dikembalikan 12 baris.

Bagaimanapun, pernyataan SQL tidak mengembalikan beberapa baris pun. Satu dari nilainilai

dikembalikan oleh inner query adalah nilai null, dan dan karenanya keseluruhan query tidak

mengembalikan barisbaris.

Alasan adalah bahwa semua kondisikondisi

yang membandingkan suatu nilai null menghasilkan

suatu null. Jadi kapanpun nilainilai

null secara kemungkinan menjadi bagian dari sekelompok hasilhasil

dari suatu subquery, jangan gunakan operator NOT IN. Operator NOT IN sama dengan operator

<>ALL.

Sebagai catatan bahwa nilai null sebagai bagian dari sekelompok hasilhasil

dari suatu subquery

adalah tidak menjadi masalah jika Anda menggunakan operator IN. Operator IN adalah sama

dengan operator =ANY. Sebagai contoh, untuk menampilkan para pegawai yang memiliki

subordinate, gunakan pernyataan SQL berikut :

SELECT emp.last_name

FROM employees emp

WHERE emp.employees_id IN

(SELECT mgr.manager_id

FROM employees mgr);

Sebagai alternatif, suatu klausa WHERE dapat disertakan pada subquery untuk menampilkan seluruh

pegawai yang tidak memiliki beberapa subordinate :

SELECT last_name FROM employees

WHERE employee_id NOT IN

(SELECT manager_id

FROM employees

WHERE manager_id IS NOT NULL);

Subquery mempunyai karakteristik sebagai berikut :

 Dapat melawatkan satu baris data ke suatu pernyataan utama yang berisi suatu singlerow

operator, seperti =, <>, >, >=, <, atau <=

 Dapat melewatkan beberapa baris data ke suatu pernyataan utama yang berisi suatu multiple

row operator, seperti IN

 Adalah yang pertama kali diproses oleh server Oracle, setelah klausa WHERE atau HAVING

menggunakan hasilhasil.

 Dapat berisi group functions.

2 thoughts on “Subquery (SQL 1)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s