SUB QUERY
1.
Sub
query dengan ALL
2.
Sub
query dengan ANY
3.
Sub
query dengan EXISTS
4.
Sub
query dengan IN
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 pe
gawai);
+-----------------------+---------+
|
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)
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
2. 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 pega
wai 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 peg
awai 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)
3. 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)
4. 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.

0 komentar:
Posting Komentar