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)
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 pegawai
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_peg
= '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_peg
= '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
alamat_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 from
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.
Belum ada tanggapan untuk "Perintah SQL part 7"
Post a Comment