Sistem Basis Data Bab 12 SUBQUERY nip 1234
Sistem Basis Data – Bab 12 SUBQUERY
nip 1234 5 1234 6 nama_peg gaji Fuad Mawardi 3000000 kota Yogya depart Akunting John Simatupang 3600000 Yogya Pemasara n 1234 Freska 7 Iskandar 1500000 Klaten Personali a 1234 Kadarisman 8 1234 Kresnawan 9 960000 Sleman Akunting 1200000 Magelang EDP 1235 Rianto 1 1235 Fahmi 2 750000 Bantul Gambar 1. Isi tabel pegawai Klaten Akunting EDP
id_bin nama tgl_lahir sex DREW B Drew Barrymore 1975 -02 -22 W STONE Sharon Stone 1958 -03 -10 W SYLVE Sylvester Stallone 1946 -07 -06 P KEVIN Kevin Costner 1955 -01 -18 P HAKIM Cristine Hakim 1957 -12 -25 W JULIA Julia Roberts 1967 -10 -28 W DEMIM Demi Moore 1962 -11 -11 W CINDY Cindy Crawford 1966 -02 -20 W CDIAZ Cameron Diaz 1972 -08 -30 W KEANU Keanu Reeves 1964 -09 -02 P SANDR Sandra Bullock 1964 -09 -02 W RGERE Richard Gere 1948 -08 -29 P RAHAR Slamet Rahardjo P KELLY Kelly Mc. Gillis 1957 -07 -09 JOLIE Angelina. Gambar Jolie 2. Isi 1975 -06 -04 tabel infoprib W W
id_bin kode_film peran HAKIM DABAN Asih HAKIM OTOKO Tia STONE BASIC Catherine Tramell STONE SPESI May Munro STONE GLORI Gloria DREWB BATFO Sugar SYLVE SPESI Ray Quick CINDY FAIRG Kate Mc. Queen DEMIM GJANE Jordan O’Neil DEMIM DISCL Meredith Johson KEVIN BODYG Frank Farmer SYLVE CLIFF Gbe Walker SYLVE RAMBO John Rambo KEANU SPEED Jack Traven SANDR SPEED Annie Porter JULIA BRIDE Maggie Carpenter RGERE BRIDE 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.
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.
id_bin CINDY DEMIM DREWB HAKIM JULIA KEANU KEVIN RGERE SANDR STONE SYLVE Gambar 5. Hasil subquery pada tabel main
• 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
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 Mc. Gillis 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_binnya 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
• 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: SELECT nama FROM infoprib WHERE NOT EXISTS (SELECT * FROM main WHERE id_bin = infoprib. id_bin); • 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 Mc. Gillis 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 G 1, G 2, …, Gn maka kondisi di atas identik dengan: (gaji > G 1) OR (gaji > G 2) OR … OR
• 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.
nama_peg gaji Fuad Mawardi 3000000 John 3600000 Simatupang Freska Iskandar Kadarisman Kresnawan 1500000 Rianto Ida Ayu Dian Arum 750000 800000 960000 1200000 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);
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 FROM pegawai WHERE depart = ‘Akunting’); • Hasil dari query di atas diperlihatkan pada Gambar 12.
nama_pe g Kartono gaji 700000 Gambar 12. Hasil query dengan operator ALL
- Slides: 24