Sub Query MySQL
Beberapa kegunaan dari Sub Query adalah
- Subquery digunakan untuk menyelesaikan persoalan dimana terdapat suatu nilai yang tidak diketahui (unknown values).
- 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
Sub Query
Contoh beberapa penggunaan sub query pada MySQL :
Subquery digunakan untuk menyelesaikan persoalan dimana terdapat suatu nilai yang tidak diketahui (unknown values). Berikut ini diberikan contoh penggunaan subquery.
Misalnya kita ingin menampilkan nama yang mempunyai nilai matakuliah tertinggi pada matakuliah METODE NUMERIK dengan kode Matakuliah
MK3003
.
Tabel Mahasiswa | |
NIM | NM_Mhs |
001 | JONO |
002 | TAUFIK |
003 | ROHIM |
004 | ROZAQ |
Tabel Nilai | ||
NIM | Kode_MataKuliah | Value |
001 | MK303 | 80 |
002 | MK302 | 90 |
003 | MK303 | 89 |
004 | MK302 | 90 |
001 | MK302 | 90 |
004 | MK303 | 90 |
002 | MK302 | 90 |
003 | MK303 | 80 |
Tabel Mata_Kuliah | |
Kode_MK | Nama_Matkul |
MK202 | OOP |
MK303 | Basis Data |
Untuk melakukan hal tersebut kita harus menggunakan sub Query jika tidak maka hasilnya akan salah. sub Query untuk menampilkan nama yang mempunyai nilai matakuliah tertinggi pada matakuliah METODE NUMERIK dengan kode Matakuliah MK3003. adalah
SELECT Mahasiswa.NM_Mhs,Nilai.Value FROM Mahasiswa,Nilai,Mata_Kuliah WHERE Mata_Kuliah.Kode_MK = “MK303” AND Nilai.Value = (SELECT max(Value) FROM Nilai WHERE Kode_MataKuliah = “MK303”);
Bagian “SELECT Mahasiswa.NM_Mhs,Nilai.Value FROM Mahasiswa,Nilai,Mata_Kuliah WHERE Mata_Kuliah.Kode_MK = “MK303″ AND Nilai.Value =” disebut dengan Main Query sedangkan “(SELECT max(Value) FROM Nilai WHERE Kode_MataKuliah = “MK303″)” disebut dengan sub Query yang sedang kita pelajari.
Contoh :
Sub Query juga dapat digunakan untuk mengopy suatu tabel ke tabel lain dengan menggunakan klausa INSERT . . . SELECT. . . . Berikut ini adalah contohnya
Contoh :
Operator Exist
Merupakan jenis operator boolean, yang mengahasilkan nilai benar (true) atau salah (false). Operator exists akan memberikan nilai benar (true) kalau sub query menghasilkan paling tidak sebuah baris / record.
Contoh :
Akan ditampilkan daftar nama pegawai yang sudah mempunyai departemen.
Keterangan: Perintah pada sub query diatas berisi pengecekan id_departemen pada tabel pegawai.
Contoh 2:
Akan ditampilkan daftar nama pegawai yang tidak mempunyai departemen :
Keterangan: Perintah pada sub query diatas sama dengan contoh 1, hanya ditambahkan dengan not sebelum exists untuk pengecekan id_departemen di tabel pegawai.
Operator Any
Operator Any 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 :
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.
Contoh :
Akan menampilkan nama dan gaji pegawai yang gajinya lebih rendah daripada semua pegawai yang pekerjaannya ‘SALESMAN’ :
Optimasi Query
Optimasi query dapat kita gunakan untuk mempercepat eksekusi query dalam database. Jika data kita hanya sedikit, maka optimasi query tidak perlu dilakukan, karena eksekusi query tidak akan memakan waktu lama. Tetapi jika data kita sudah mencapai ratusan atau bahkan ribuan, maka akan terasa sekali eksekusi querinya memakan waktu yang cukup lama. Untuk mengatasi hal ini maka query kita harus dioptimasi.
Salah satu cara optimasi query yaitu dengan membuat indeks pada database. Index pada database digunakan untuk meningkatkan kecepatan akses data. Pada saat query dijalankan, index mencari data dan menentukan nilai ROWID yang membantu menemukan lokasi data secara fisik di disk. Akan tetapi penggunaan index yang tidak tepat, tidak akan meningkatkan unjuk kerja dalam hal ini kecepatan akses data.
Misal digunakan index yang melibatkan tiga buah kolom yang mengurutkan kolom menurut kota, propinsi dan kode pos dari tabel karyawan, sebagai berikut :
ON karyawan(kota, propinsi, kode_pos)
TABLESPACE INDX;
Kemudian user melakukan query sebagai berikut :
Pada saat melakukan query ini, index tidak akan digunakan karena kolom pertama (kota) tidak digunakan dalam klausa WHERE. Jika user sering melakukan query ini, maka kolom index harus diurutkan menurut propinsi. Selain itu, proses pencarian data akan lebih cepat jika data terletak pada block tabel yang berdekatan daripada harus mencari di beberapa datafile yang terletak pada block yang berbeda.
Misal pada perintah SQL berikut ini :
WHERE id BETWEEN 1010 AND 2010;
Query ini akan melakukan “scan” terhadap sedikit data block jika tabel karyawan diatas diurutkan berdasarkan kolom id. Untuk mengurutkan berdasarkan kolom yang berbeda-beda maka tabel disimpan dalam flat file, kemudian tabel diekspor dan diurutkan sesuai kebutuhan.