Jumat, 20 Maret 2015

Contoh SUB QUERY

Sub Query adalah penggunaan statement SELECT di dalam statement SELECT, Sub Query dideklarasikan di dalam perintah my qsl di dalam tanda (), dan biasa menggunakan salah satu dari statemen SELECT, UPDATE, SET, DELETE, atau DO
CONTOH :
mysql> select nama_peg, gaji from pegawai where gaji = (select max(gaji) from pegawai);
+-----------------------+---------+
| nama_peg              | gaji    |
+-----------------------+---------+
| Soeharto Mangundirejo | 9000000 |
+-----------------------+---------+
      1 row in set (0.06 sec)

Perintah ini hanya bisa menerima satu(1) buah hasil dari sub query, jika hasil dari sub query ada lebih adari satu maka akan terjadi error.
mysql> select nama_peg, gaji from pegawai where alamat_peg = (select alamat_peg
from pegawai where alamat_peg LIKE 'J%');
ERROR 1242 (21000): Subquery returns more than 1 row

Perintah diatas ini ERROR karena hasil sub query diatas ada lebih dari satu(1)

Sub query dengan ALL
Command ALL diikuti dengan operator perbandingan digunakan memiliki arti menampilkan nilai jika perbandingan bernilai benar untuk semua data. Berikut adalah contoh penggunaannya.

mysql> select nama_peg, gaji from pegawai where gaji < ALL(select gaji FROM pega
wai WHERE gaji > '2500000');
+----------------+---------+
| nama_peg       | gaji    |
+----------------+---------+
| Rano Karno     | 2000000 |
| Rahmadi Sholeh | 2000000 |
| Ilham Ungara   | 2000000 |
| Endang Melati  | 2000000 |
| Donny Damara   | 1000000 |
| Paijem         |  500000 |
+----------------+---------+
6 rows in set (0.00 sec)

Contoh diatas menunjukkan penampilan atas nama pegawai beserta gajinya yang memiliki gaji kurang dari 2,5jt

Sub query dengan ANY
Command ANY diikuti dengan operator perbandingan memiliki arti menampilkan nilai yang sesuai dengan apapun yang dihasilkan oleh sub query. Alias dari ANY adalah SOME. Berikut adalah contohnya:
mysql> select nama_peg, gaji from pegawai where gaji < ANY(select gaji FROM pegawai WHERE gaji > '2000000')
+-------------------+---------+
| nama_peg          | gaji    |
+-------------------+---------+
| Felix Nababan     | 8000000 |
| Olga Syahputra    | 6000000 |
| Chelsea Olivia    | 6000000 |
| Tuti Wardani      | 4500000 |
| Budi Drajat       | 4500000 |
| Bambang Pamungkas | 3000000 |
| Ely Oktafiani     | 3000000 |
| Rani Wijaya       | 3000000 |
| Rano Karno        | 2000000 |
| Rahmadi Sholeh    | 2000000 |
| Ilham Ungara      | 2000000 |
| Endang Melati     | 2000000 |
| Donny Damara      | 1000000 |
| Paijem            |  500000 |
+-------------------+---------+
14 rows in set (0.00 sec)

Pada perintah diatas kita perhatikan perintah select yang berada di dalam kurung (Sub Query), pada perintah itu menjelaskan bahwa penampilan daftar nama pegawai yang gajinya lebih dari 2jt, sedangkan Quert seutuhnya menampilkan nama pegawai yang gajinya lebih kecil daripada hasil sub query, Soeharto Mangundirejo tidak keluar di hasil karena tidak ada yang mempunyai gaji sebesar dirinya.
mysql> select nama_peg, gaji from pegawai where gaji < SOME(select gaji FROM pegawai WHERE gaji > '2000000');
+-------------------+---------+
| nama_peg          | gaji    |
+-------------------+---------+
| Felix Nababan     | 8000000 |
| Olga Syahputra    | 6000000 |
| Chelsea Olivia    | 6000000 |
| Tuti Wardani      | 4500000 |
| Budi Drajat       | 4500000 |
| Bambang Pamungkas | 3000000 |
| Ely Oktafiani     | 3000000 |
| Rani Wijaya       | 3000000 |
| Rano Karno        | 2000000 |
| Rahmadi Sholeh    | 2000000 |
| Ilham Ungara      | 2000000 |
| Endang Melati     | 2000000 |
| Donny Damara      | 1000000 |
| Paijem            |  500000 |
+-------------------+---------+
14 rows in set (0.45 sec)

Sub query dengan EXISTS
Perintah EXISTS disini berguna untuk mengartur penampilan hasil query, Query Utama akan dijalankan jika Sub Query bernilai TRUE (ada hasilnya) jika hasilnya kosong maka Query utama tidak akan dijalankan. Lawan dari statement EXISTS adalah NOT EXISTS

mysql> select * from pegawai where EXISTS (select * from pegawai where alamat_pe
g = 'Yogyakarta');
+----------+-----------------------+-------------+----------------+---------+
| nip      | nama_peg              | alamat_peg  | jabatan        | gaji    |
+----------+-----------------------+-------------+----------------+---------+
| PEG-1001 | Soeharto Mangundirejo | Yogyakarta  | C.E.O          | 9000000 |
| PEG-1002 | Felix Nababan         | Medan       | Manager        | 8000000 |
| PEG-1003 | Olga Syahputra        | Jakarta     | Kepala Unit    | 6000000 |
| PEG-1004 | Chelsea Olivia        | Bandung     | Kepala Unit    | 6000000 |
| PEG-1005 | Tuti Wardani          | Jawa Tengah | Supervisor     | 4500000 |
| PEG-1006 | Budi Drajat           | Malang      | Supervisor     | 4500000 |
| PEG-1007 | Bambang Pamungkas     | Kudus       | Staff Senior   | 3000000 |
| PEG-1008 | Ely Oktafiani         | Yogyakarta  | Staff Senior   | 3000000 |
| PEG-1009 | Rani Wijaya           | Magelang    | Staff Senior   | 3000000 |
| PEG-1010 | Rano Karno            | Solo        | Staff Junior   | 2000000 |
| PEG-1011 | Rahmadi Sholeh        | Yogyakarta  | Staff Junior   | 2000000 |
| PEG-1012 | Ilham Ungara          | Jakarta     | Staff Junior   | 2000000 |
| PEG-1013 | Endang Melati         | Madiun      | Staff Junior   | 2000000 |
| PEG-1014 | Donny Damara          | Makasar     | Tenaga Kontrak | 1000000 |
| PEG-1015 | Paijem                | Yogyakarta  | Tenaga Kontrak |  500000 |
+----------+-----------------------+-------------+----------------+---------+
15 rows in set (0.00 sec)
Dari perintah diatas menunjukkan bahwa Query utama dieksesusi karena Sub Query bernilai TRUE atau ada hasilnya

mysql> select * from pegawai where EXISTS (select * from pegawai where alamat_pe
g = 'Kebumen');
Empty set (0.00 sec)

Sedangkan perintah ini tidak dijalankan karena Sub Query bernilai FALSE atau tidak ada hasilnya.
Jika kita ganti EXISTS dengan NOT EXISTS maka hasil akan keluar seperti di bawah ini, karena memang alamat-peg tidak ada yang bernilai ‘Kebumen’

mysql> select * from pegawai where NOT EXISTS (select * from pegawai where alama
t_peg = 'Kebumen');
+----------+-----------------------+-------------+----------------+---------+
| nip      | nama_peg              | alamat_peg  | jabatan        | gaji    |
+----------+-----------------------+-------------+----------------+---------+
| PEG-1001 | Soeharto Mangundirejo | Yogyakarta  | C.E.O          | 9000000 |
| PEG-1002 | Felix Nababan         | Medan       | Manager        | 8000000 |
| PEG-1003 | Olga Syahputra        | Jakarta     | Kepala Unit    | 6000000 |
| PEG-1004 | Chelsea Olivia        | Bandung     | Kepala Unit    | 6000000 |
| PEG-1005 | Tuti Wardani          | Jawa Tengah | Supervisor     | 4500000 |
| PEG-1006 | Budi Drajat           | Malang      | Supervisor     | 4500000 |
| PEG-1007 | Bambang Pamungkas     | Kudus       | Staff Senior   | 3000000 |
| PEG-1008 | Ely Oktafiani         | Yogyakarta  | Staff Senior   | 3000000 |
| PEG-1009 | Rani Wijaya           | Magelang    | Staff Senior   | 3000000 |
| PEG-1010 | Rano Karno            | Solo        | Staff Junior   | 2000000 |
| PEG-1011 | Rahmadi Sholeh        | Yogyakarta  | Staff Junior   | 2000000 |
| PEG-1012 | Ilham Ungara          | Jakarta     | Staff Junior   | 2000000 |
| PEG-1013 | Endang Melati         | Madiun      | Staff Junior   | 2000000 |
| PEG-1014 | Donny Damara          | Makasar     | Tenaga Kontrak | 1000000 |
| PEG-1015 | Paijem                | Yogyakarta  | Tenaga Kontrak |  500000 |
+----------+-----------------------+-------------+----------------+---------+
15 rows in set (0.00 sec)

Sub query dengan IN
Jika operator ‘=’ hanya digunakan untuk hasil yang tepat satu, maka jika ingin menampilkan yang memiliki hasil lebih dari satu maka menggunakan perintah IN, berikut contohnya :
Kita buat terlebih dahulu sebuah tabel yang menunjukkan hasil yang kita inginkan, contoh tabel Job ini digunakan untuk menampilkan data yang hasil dari sub query lebih dari satu.

mysql> create table job( id int(2) primary key, job varchar(20));
Query OK, 0 rows affected (0.52 sec)

mysql> desc job;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(2)      | NO   | PRI | NULL    |       |
| job   | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.17 sec)

mysql> select*from job;
+----+----------------+
| id | job            |
+----+----------------+
|  1 | Supervisor     |
|  2 | Staff Senior   |
|  3 | Staff Junior   |
|  4 | Tenaga Kontrak |
+----+----------------+
4 rows in set (0.00 sec)

Setelah kita buat table job, maka kita bisa terapkan perintah IN sbb :

mysql> select nip, nama_peg, jabatan from pegawai where jabatan IN (select job f
rom job);
+----------+-------------------+----------------+
| nip      | nama_peg          | jabatan        |
+----------+-------------------+----------------+
| PEG-1005 | Tuti Wardani      | Supervisor     |
| PEG-1006 | Budi Drajat       | Supervisor     |
| PEG-1007 | Bambang Pamungkas | Staff Senior   |
| PEG-1008 | Ely Oktafiani     | Staff Senior   |
| PEG-1009 | Rani Wijaya       | Staff Senior   |
| PEG-1010 | Rano Karno        | Staff Junior   |
| PEG-1011 | Rahmadi Sholeh    | Staff Junior   |
| PEG-1012 | Ilham Ungara      | Staff Junior   |
| PEG-1013 | Endang Melati     | Staff Junior   |
| PEG-1014 | Donny Damara      | Tenaga Kontrak |
| PEG-1015 | Paijem            | Tenaga Kontrak |
+----------+-------------------+----------------+
11 rows in set (0.00 sec)

Terlihat di dalam hasil bahwa, data pegawai yang jabatannya ada di dalam tabel job akan ditampilkan, sedangkan yang tidak ada tidak akan ditampilkan.