Subquery adalah perintah SELECT yang berada di dalam
perintah SQL lain. Subquery sangat berguna ketika kita ingin menampilkan data
dengan kondisi yang bergantung Kegunaan-kegunaan Subquery dalam memanipulasi data: § Meng-copy data dari satu tabel ke tabel lain § Menerima data dari inline view § Mengambil data dari tabel lain untuk kemudian di update ke tabel yang dituju § Menghapus baris dari satu tabel berdasarkan baris dari tabel lain. ATURAN SUB QUERY
( SELECT select_list FROM table );
WHERE UPPER(last_name) = ‘BIRI’ ); Operator EXIST dan NOT EXIST Kata kunci EXIST dan NOT EXIST dirancang hanya untuk digunakan di subquery. Kata kunci-kata kunci ini menghasilkan nilai TRUE atau FALSE EXIST akan mengirim nilai TRUE jika dan hanya jika terdapat sedikitnya satu baris di table hasil yang dikirim oleh subquery. EXIST mengirim nilai FALSE jika subquery mengirm table kosong NOT EXIST kebalian dan EXIST. Karena EXIST dan NOT EXIST hanya memeriksa keberadaan baris-baris di table hasil subquery. Contonya Penggunaan EXIST Daftarkan semua staf yang bekerja dikantor cabang beralamat di jalan “Tamansari 81” SELECT IDStaf , namaDepan, namaBelakang, pangkat, gPokok FROM Staf s WHERE EXIST (SELECT * FROM KantorCabang k, StafKCabang sk WHERE s.IDStaf=sk.IDStafAND sk.IDKCabang =k.IDKCabang AND k.jalan=’tamansari 81’ ); Operator Any(Some) Operator Any (some) hampir sama penggunaannya seperti Exists. Tetapi operator relasi yang digunakan biasanya selain = (sama dengan). hal tersebut disebabkan apabila operator relasi = yang digunakan, maka sebetulnya fungsi operator Any (some) sama seperti operator IN, sehingga kondisi seperti itu tidak dianjurkan karena lebih mudah pemahamannya apabila menggunakan operator IN. Contoh : Akan menampilkan daftar nama pegawai dan gaji yang gajinya tidak paling sedikit :select nama, gaji from pegawai where gaji > any (select gaji from pegawai); Operator All
Operator all digunakan
untuk melakukan pembandingan dengan sub query. Kondisi dengan all menghasilkan
nilai benar jika pembandingan menghasilkan benar untuk setiap nilai dalam sub
query. Akan menampilkan nama dan gaji pegawai yang gajinya lebih rendah daripada semua pegawai yang pekerjaannya 'SALESMAN' : select nama where gaji < all (select gaji from pegawai where pekerjaan = 'SALESMAN'); Sub query (subselect) hanya dapat digunakan untuk MySQL versi 3.24, Sehingga parintah-perintah diatas tidak dapat dijalankan di MySQL ini(versi 3.23). Tetapi, dengan menggunakan option LEFT JOIN, masalah-masalah diatas dapat diselesaikan. Contoh : select * from score where event_id in (select even_id from even where type = 'T'); Apabila dituliskan dengan cara lain menjadi : select score.* from score, event where score.even_id = even.even_id and type = 'T'; Multiple Rows Subquery Multiple Row Subquery adalah subquery yang menghasilkan lebih dari satu baris data. Untuk multiple row subquery ini yang digunakan adalah operator pembanding IN, ANY atau ALL
Contoh: SELECT last_name, first_name, title FROM employee WHERE dept_id IN ( SELECT id FROM department WHERE name = ‘Finance’ OR region_id = 2 );
Contoh: SELECT ename, sal, deptno FROMENP WHERE sal IN (SELECT MIN (sal) FROM ENP GROUP BY deptno) Single Row Subquery Single row subquery memberikan hasil hanya satu baris pada bagian subquery. Untuk single row subquery ini yang digunakan adalah operator pembanding: , >, >=, <, <= atau <> Contoh: Menampilkan data karyawan yang memiliki jabatan sama dengan Smith. SELECT last_name, title FROM employee WHERE title = ( SELECT title FROM employee WHERE last_name = ‘Smith’ ); Kita dapat menampilkan data dari query utama dengan menggunakan fungsi grup (group function) untuk menghasilkan satu baris data. Contoh: Menampilkan data karyawan yang memiliki gaji dibawah rata-rata. SELECT last_name, title, salary FROM employee WHERE salary < ( SELECT AVG(salary) FROM employee );
Kesalahan umum dalam subquery adalah lebih dari satu baris
data dihasilkan untuk single row subquery. SELECT last_name, first_name, title FROM employee WHERE dept_id = ( SELECT id FROM department WHERE name = ‘Finance’ OR region_id = 2 );
Kita dapat menggunakan subquery tidak hanya dalam klausa
WHERE, namun juga klausa HAVING. SELECT dept_id, AVG (salary) FROM employee GROUP BY dept_id HAVING AVG(salary) > ( SELECT AVG(salary) FROM employee WHERE dept_id = 32 ); Menampilkan jabatan dengan rata-rata gaji terkecil. SELECT title, AVG (salary) FROM employee GROUP BY title HAVING AVG (salary) = ( SELECT MIN(AVG(salary)) FROM employee GROUP BY title ); Page 2 |