Sumber : Quotefancy |
MySQL Subquery adalah query yang memungkinkan untuk memiliki query lain didalamnya berupa select, insert, update maupun delete, sehingga biasa disebut sebagai query bersarang. Ada beberapa keuntungan menggunakan subquery:
- Subquery membuat query dalam bentuk terstruktur yang memungkinkan kita untuk mengisolasi setiap bagian dari sebuah pernyataan.
- Subquery menyediakan cara alternatif untuk query data dari tabel; jika tidak, kita perlu menggunakan statement join dan union yang lebih kompleks.
- Menyalin (copy) data dari suatu tabel ke tabel lain
- Mengambil data dari tabel lain untuk di ditambahkan, diupdate ataupun dihapus pada tabel tujuan
Sebelum menggunakan subquery, ada sejumlah aturan untuk menggunakan subqueries:
- Subquery harus berada didalam parentheses (tanda kurung)
- Subquery dapat terletak diantara:
- Statement select
- Klausa From
- Klausa Where
- Jika query utama tidak memiliki beberapa kolom untuk subkueri maka subquery hanya dapat memiliki satu kolom dalam perintah select
- Jika query terletak setelah klausa from maka subquery harus memiliki nama tabel alias
- Dapat menggunakan operator pembanding seperti >, <, =, in, any, some dan all
Agar lebih memahami tentang subquery, berikut ini adalah contohnya.
Hal mendasar sebelum menggunakan subquery adalah subquery harus berada didalam tanda kurung
Contoh:
mysql> select npm, nama, j_kelamin from mahasiswa where j_kelamin = (select j_kelamin from mahasiswa where nama = "Clerice") limit 5;
+----------+---------------+-----------+
| npm | nama | j_kelamin |
+----------+---------------+-----------+
| 51411113 | A Faridah Nur | P |
| 51411114 | A Fatirah | P |
| 51411115 | A Nur Afifah | P |
| 51411116 | A Nur Aifa | P |
| 51411121 | A Syifah | P |
+----------+---------------+-----------+
5 rows in set (0.00 sec)
Keterangan:
Select npm, nama, j_kelamin from mahasiswa = Query utama untuk menentukan data yang ingin ditampilkan
where j_kelamin = klausa untuk menyatakan kondisi data yang dipilih
(select j_kelamin... = Subquery dari query utama dimana j_kelamin didalam subquery merupakan operand
Subquery setelah statement select
mysql> select (select j_kel from dosen where nid = "10010002") limit 5;
+--------------------------------------------------+
| (select j_kel from dosen where nid = "10010002") |
+--------------------------------------------------+
| P |
+--------------------------------------------------+
1 row in set (0.00 sec)
mysql> select (select nama, j_kel from dosen where nid = "10010002") limit 5;
ERROR 1241 (21000): Operand should contain 1 column(s)
Terletak setelah klausa from
mysql> select nama from (select * from mahasiswa) Data limit 5;
+----------------+
| nama |
+----------------+
| AA Aditya A |
| A Aditya A |
| A Dimas A |
| A Faisal Dimas |
| A Faridah Nur |
+----------------+
5 rows in set (0.00 sec)
mysql> select nama from (select nama, kota from (select * from mahasiswa where j_kelamin = "L") as JKel ) as Data limit 5;
+------------------+
| nama |
+------------------+
| AA Aditya A |
| A Aditya A |
| A Dimas A |
| A Faisal Dimas |
| A Nur Muliansyah |
+------------------+
5 rows in set (0.00 sec)
mysql> select nama from (select nama, kota from (select * from mahasiswa where j_kelamin = "L") as JKel ) limit 5;
ERROR 1248 (42000): Every derived table must have its own alias
mysql> select nama from (select nama, kota from (select * from mahasiswa where j_kelamin = "L")) as Data limit 5;
ERROR 1248 (42000): Every derived table must have its own alias
Subquery yang terletak setelah klausa from disebut juga sebagai Derived Table (Tabel Turunan) dan subquery yang terletak setelah klausa from harus memiliki nama alias sebagai pengganti nama tabel yang dapat dinamakan apa saja atau bisa dengan nama tabel itu sendiri, pemberian nama alias sendiri dapat menggunakan klausa AS maupun tidak, sementara jika tidak memberi nama tabel alias maka akan menampilkan pesan error 1248.
Dapat menggunakan operator
mysql> select gaji_pokok from gaji where gaji_pokok >= (select avg(gaji.gaji_pokok) from gaji) limit 5;
+------------+
| gaji_pokok |
+------------+
| 15300000 |
| 18100000 |
| 18100000 |
| 19100000 |
| 20100000 |
+------------+
5 rows in set (0.00 sec)
Selain digunakan untuk menampilkan data dengan subquery kita juga dapat menambah, merubah dan menghapus data pada suatu tabel berdasarkan data dari tabel lainnya dengan aturan yang tidak jauh berbeda dengan apa yang sudah di sampaikan sebelumnya namun perlu memperhatikan kondisi bagaimana data tersebut ditambah, diubah dan dihapus. Agar lebih jelas, berikut adalah contohnya.
Menambahkan Data (Insert... Select)
mysql> insert into dosen (nid, nama, j_kel, t_lahir, alamat, kota, telepon, email) select npm, nama, j_kelamin, t_lahir, alamat, kota, telepon, email from mahasiswa where npm = "51411207";
Query OK, 1 row affected (0.89 sec)
Records: 1 Duplicates: 0 Warnings: 0
Pada contoh diatas, data yang ditambahkan adalah berdasarkan kolom yang dipilih (select) pada tabel mahasiswa, pastikan untuk memberikan klausa where sebagai parameter data yang harus ditambahkan karena jika tidak maka semua data pada tabel mahasiswa akan ditambahkan ke tabel dosen.
Mengubah Data (Update... Select)
mysql> select nid, nama from dosen where nid = "51411207";
+----------+------+
| nid | nama |
+----------+------+
| 51411207 | Raki |
+----------+------+
1 row in set (0.00 sec)
mysql> update dosen set nama = (select nama from mahasiswa where npm = "51411208") where nid = "51411207";
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select nid, nama from dosen where nid = "51411207";
+----------+------+
| nid | nama |
+----------+------+
| 51411207 | Raka |
+----------+------+
1 row in set (0.04 sec)
Menghapus Data (Delete... Select)
mysql> delete from dosen where nid = (select npm from mahasiswa where npm ="51411207");
Query OK, 1 row affected (0.24 sec)
mysql> select nid, nama from dosen where nid = "51411207";
Empty set (0.00 sec)
Dalam hal ini penulis tidak membahas lebih detail subquery untuk menambah, mengubah dan menghapus data tabel, materi subquery lainnya dapat dicari melalui halaman daftar isi.