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.
mantap panduanya terimakasih
BalasHapus