Sistem Basis Data – Bab 13 SUBQUERY
Gambar 1. Isi tabel pegawai nip nama_peg gaji kota depart 12345 Fuad Mawardi 3000000 Yogya Akunting 12346 John Simatupang 3600000 Pemasaran 12347 Freska Iskandar 1500000 Klaten Personalia 12348 Kadarisman 960000 Sleman 12349 Kresnawan 1200000 Magelang EDP 12351 Rianto 750000 Bantul 12352 Fahmi 12353 Ida Ayu 12354 Dian Arum 800000 Produksi 12355 Kartono 700000 Gambar 1. Isi tabel pegawai
Gambar 2. Isi tabel infoprib id_bin nama tgl_lahir sex DREWB Drew Barrymore 1975-02-22 W STONE Sharon Stone 1958-03-10 SYLVE Sylvester Stallone 1946-07-06 P KEVIN Kevin Costner 1955-01-18 HAKIM Cristine Hakim 1957-12-25 JULIA Julia Roberts 1967-10-28 DEMIM Demi Moore 1962-11-11 CINDY Cindy Crawford 1966-02-20 CDIAZ Cameron Diaz 1972-08-30 KEANU Keanu Reeves 1964-09-02 SANDR Sandra Bullock RGERE Richard Gere 1948-08-29 RAHAR Slamet Rahardjo KELLY Kelly McGillis 1957-07-09 JOLIE Angelina Jolie 1975-06-04 Gambar 2. Isi tabel infoprib
id_bin kode_film peran HAKIM DABAN Asih OTOKO Tia STONE BASIC Catherine Tramell SPESI May Munro GLORI Gloria DREWB BATFO Sugar SYLVE Ray Quick CINDY FAIRG Kate McQueen DEMIM GJANE Jordan O’Neil DISCL Meredith Johson KEVIN BODYG Frank Farmer CLIFF Gbe Walker RAMBO John Rambo KEANU SPEED Jack Traven SANDR Annie Porter JULIA BRIDE Maggie Carpenter RGERE Ike Graham Gambar 3. Isi tabel main
1. Pengertian Subquery Subquery (kadang disebut juga subselect) merupakan bentuk query yg terletak dalam query yg lain. Contoh subquery diperlihatkan di bawah ini: SELECT nama_peg, gaji FROM pegawai WHERE gaji = (SELECT MAX(gaji) FROM pegawai); Perhatikan bahwa di dalam klausa WHERE milik SELECT terdapat SELECT yg lain yaitu: SELECT MAX(gaji) FROM pegawai; Bagian inilah yg disebut dengan query.
Perintah: SELECT MAX(gaji) FROM pegawai; berguna untuk mendapatkan gaji yg terbesar yg terdapat pada tabel pegawai. Jadi, secara lengkap pernyataan: SELECT nama_peg, gaji FROM pegawai WHERE gaji = (SELECT MAX(gaji) FROM pegawai); digunakan untuk menampilkan baris-baris yg nilai gaji-nya adalah yg terbesar. Hasil query dapat dilihat pada Gambar 4.
Gambar 4. Hasil query pada tabel pegawai nama_peg gaji John Simatupang 3600000 Gambar 4. Hasil query pada tabel pegawai
2. Operator IN Pada contoh di depan, subquery: SELECT MAX(gaji) FROM pegawai; menghasilkan sebuah nilai. Keadaan seperti ini bukan merupakan suatu keharusan. Subquery bisa saja menghasilkan sejumlah nilai. Sebagai contoh: SELECT DISTINCT id_bin FROM main; Query ini akan menghasilkan sejumlah baris yg menyatakan semua id_bin yg terdapat pada main dan bersifat unik (tdk ada yg kembar). Hasilnya dapat dilihat pada Gambar 5.
Gambar 5. Hasil subquery pada tabel main Id_bin CINDY DEMIM DREWB HAKIM JULIA KEANU KEVIN RGERE SANDR STONE SYLVE Gambar 5. Hasil subquery pada tabel main
SELECT nama FROM infoprib Query yg menghasilkan sejumlah nilai seperti itu dapat berkedudukan sebagai subquery dan diletakkan sesudah operator IN. Contoh: SELECT nama FROM infoprib WHERE id_bin IN (SELECT DISTINCT id_bin FROM main); Query di atas digunakan untuk menampilkan semua bintang film yg id_bin nya berada dalam tabel main. Hasil query di atas diperlihatkan pada Gambar 6.
nama Drew Barrymore Sharon Stone Sylvester Stallone Kevin Costner Cristine Hakim Julia Roberts Demi Moore Cindy Crawford Keanu Reeves Sandra Bullock Richard Gere Gambar 6. Menampilkan bintang film pada tabel infoprib yg tercantum pada tabel main
Anda juga bisa meletakkan NOT di depan IN, misalnya seperti berikut: SELECT nama FROM infoprib WHERE id_bin NOT IN (SELECT DISTINCT id_bin FROM main); Query di atas akan menghasilkan daftar bintang film yg tidak tercantum pada tabel main yg diperlihatkan pada Gambar 7.
nama Cameron Diaz Slamet Rahardjo Kelly McGillis Angelina Jolie Gambar 7. Menampilkan bintang film pada tabel infoprib yg tidak tercantum pada tabel main
3. Operator EXIST EXIST merupakan jenis operator boolean yg menghasilkan nilai benar atau salah. Operator ini memberikan nilai benar kalau subquery menghasilkan paling tidak sebuah baris. Bentuk penggunaan EXIST: SELECT nama_kolom FROM nama_tabel WHERE EXIST (subquery); Sebagai contoh: SELECT nama FROM infoprib WHERE EXISTS (SELECT * FROM main WHERE id_bin = infoprib.id_bin); Perintah di atas digunakan untuk menampilkan daftar bintang film yg id_bin-nya terdapat pada tabel main dapat dilihat pada Gambar 8. Pemeriksaan keberadaan id_bin pada tabel main dilakukan melalui subquery.
nama Drew Barrymore Sharon Stone Sylvester Stallone Kevin Costner Cristine Hakim Julia Roberts Demi Moore Cindy Crawford Keanu Reeves Sandra Bullock Richard Gere Gambar 8. Menampilkan bintang film pada tabel infoprib yg tercantum pada tabel main. Diperoleh via EXIST
Tentu saja pernyataan di atas merupakan alternatif dari pernyataan : Pernyatan : SELECT nama FROM infoprib WHERE EXISTS (SELECT * FROM main WHERE id_bin = infoprib.id_bin); Tentu saja pernyataan di atas merupakan alternatif dari pernyataan : SELECT nama FROM infoprib WHERE id_bin IN (SELECT DISTINCT id_bin FROM main); Di depan EXIST juga bisa disertakan operator NOT. Contoh: WHERE NOT EXISTS Query di atas akan menghasilkan daftar bintang film pada tabel infoprib yg tdk tercantum pada tabel main dapat dilihat pada gambar 9.
nama Cameron Diaz Slamet Rahardjo Kelly McGillis Angelina Jolie Gambar 9. Daftar bintang film pada tabel infoprib yg tidak tercantum pada tabel main. Diperoleh via NOT EXISTS
4. Operator ANY dan SOME Seperti halnya EXIST, operator ANY (atau SOME) digunakan berkaitan dengan subquery. Bentuk penggunaan: SELECT nama_kolom FROM nama_tabel WHERE nama_kolom operator_relasional ANY (subquery); Pada penggunaan ANY, sebarang operator relasional (seperti =, <>, dan >) bisa digunakan. Contoh kondisi dalam WHERE pada pemakaian ANY: gaji > ANY (S) Dalam hal ini operator relasional yg digunakan berupa “lebih dari” dan S adalah subquery. Andaikan subquery S menghasilkan G1, G2, …, Gn maka kondisi di atas identik dengan: (gaji > G1) OR (gaji > G2) OR … OR (gaji > Gn)
Dengan logika seperti ini, kiranya ekspresi seperti gaji > ANY(S) menjadi mudah dipahami. Contoh: SELECT nama_peg, gaji FROM pegawai WHERE gaji > ANY (SELECT gaji FROM pegawai); Pernyataan di atas akan menghasilkan daftar nama beserta gaji untuk semua pegawai yg gajinya tidak paling kecil. Mengapa demikian? Karena yg gajinya paling kecil pasti tdk memenuhi kriteria gaji > nilai_gaji_siapapun. Hasil query dapat dilihat pada Gambar 10.
Gambar 10. Hasil dengan operator ANY pada tabel pegawai nama_peg gaji Fuad Mawardi 3000000 John Simatupang 3600000 Freska Iskandar 1500000 Kadarisman 960000 Kresnawan 1200000 Rianto 750000 Ida Ayu Dian Arum 800000 Gambar 10. Hasil dengan operator ANY pada tabel pegawai
Jika operator relasional yg digunakan pada operator ANY berupa =, maka akan identik dengan operator IN. Pada keadaan seperti ini, lebih baik menggunakan IN daripada ANY karena IN lebih mudah dipahami. Contoh: SELECT nama FROM infoprib WHERE id_bin = ANY (SELECT DISTINCT id_bin FROM main);
Gambar 11. Contoh hasil = operator ANY yg identik dengan pemakaian IN nama Drew Barrymore Sharon Stone Sylvester Stallone Kevin Costner Cristine Hakim Julia Roberts Demi Moore Cindy Crawford Keanu Reeves Sandra Bullock Richard Gere Gambar 11. Contoh hasil = operator ANY yg identik dengan pemakaian IN
5. Operator ALL Operator ALL digunakan untuk melakukan pembandingan dengan subquery. Kondisi dengan ALL menghasilkan nilai benar jika membandingkan menghasilkan benar untuk setiap nilai dalam subquery.. Contoh penggunaan ALL yaitu untuk memperoleh semua pegawai yg gajinya lebih rendah daripada semua pegawai di departemen Akunting. Perintahnya: SELECT nama_peg, gaji FROM pegawai WHERE gaji < ALL (SELECT gaji WHERE depart = ‘Akunting’; Hasil dari query di atas diperlihatkan pada Gambar 12.
Gambar 12. Hasil query dengan operator ALL nama_peg gaji Kartono 700000 Gambar 12. Hasil query dengan operator ALL