Penjelasan sederhana
EXISTS mengecek apakah sebuah subquery menemukan minimal satu baris. Jawabannya hanya ya atau tidak. Database tidak peduli isi barisnya, cukup tahu ada atau tidak.
Ini cocok untuk pertanyaan "siapa yang pernah..." atau, dengan NOT EXISTS, "siapa yang belum pernah...".
Sintaks
WHERE [NOT] EXISTS (
SELECT 1 FROM tabel_lain
WHERE tabel_lain.kunci = tabel.kunci
);
| Bagian | Keterangan |
|---|---|
EXISTS | Benar jika subquery menemukan baris. |
NOT EXISTS | Benar jika subquery tidak menemukan baris sama sekali. |
Tanda [kurung siku] berarti bagian opsional. Kata kunci SQL tidak membedakan huruf besar-kecil, tapi menulisnya dengan huruf besar membuat query lebih mudah dibaca.
Contoh EXISTS
Data contoh: karyawan, penjualan
Tabel karyawan
| id | nama | dept_id | kota | gaji | tgl_masuk | atasan_id |
|---|---|---|---|---|---|---|
| 1 | Andi Pratama | 3 | Bandung | 12500000 | 2019-03-11 | NULL |
| 2 | Bunga Lestari | 1 | Jakarta | 9800000 | 2020-07-01 | NULL |
| 3 | Candra Wijaya | 3 | Bandung | 8200000 | 2021-02-15 | 1 |
| 4 | Dewi Anggraini | 2 | Jakarta | 7500000 | 2022-05-09 | 6 |
| 5 | Eko Saputra | 1 | Jakarta | 6900000 | 2023-01-16 | 2 |
| 6 | Fajar Nugroho | 2 | Surabaya | 11000000 | 2018-09-03 | NULL |
| 7 | Gita Permata | 3 | Jakarta | 8200000 | 2023-08-21 | 1 |
| 8 | Hendra Gunawan | NULL | Medan | 5500000 | 2024-04-02 | NULL |
Tabel penjualan
| id | tanggal | karyawan_id | produk | kategori | qty | harga |
|---|---|---|---|---|---|---|
| 1 | 2026-01-05 | 4 | Laptop | Elektronik | 2 | 8500000 |
| 2 | 2026-01-12 | 6 | Printer | Elektronik | 1 | 2300000 |
| 3 | 2026-01-20 | 4 | Kursi Kantor | Furnitur | 5 | 1200000 |
| 4 | 2026-02-03 | 6 | Laptop | Elektronik | 1 | 8500000 |
| 5 | 2026-02-14 | 4 | Meja Kerja | Furnitur | 3 | 1750000 |
| 6 | 2026-02-25 | 5 | Kertas A4 | ATK | 20 | 55000 |
| 7 | 2026-03-02 | 6 | Kursi Kantor | Furnitur | 4 | 1200000 |
| 8 | 2026-03-10 | 4 | Printer | Elektronik | 2 | 2300000 |
| 9 | 2026-03-18 | 5 | Kertas A4 | ATK | 30 | 55000 |
| 10 | 2026-03-27 | 6 | Monitor | Elektronik | 3 | 1900000 |
SELECT nama
FROM karyawan AS k
WHERE EXISTS (
SELECT 1 FROM penjualan AS p
WHERE p.karyawan_id = k.id
);
Hasil 3 baris
| nama |
|---|
| Dewi Anggraini |
| Eko Saputra |
| Fajar Nugroho |
Hanya karyawan yang pernah mencatat penjualan.
Cara kerjanya, langkah demi langkah
- Untuk setiap karyawan, database menjalankan subquery: adakah transaksi di tabel penjualan dengan karyawan_id sama dengan id karyawan ini?
- Untuk Dewi (id 4): ada 4 transaksi, jadi
EXISTSbenar dan ia lolos. - Untuk Andi (id 1): tidak ada transaksi sama sekali, jadi ia tidak lolos.
- Hasilnya 3 orang yang pernah berjualan: Dewi, Eko, dan Fajar.
Dipakai untuk apa di kantor?
- Pelanggan yang pernah belanja bulan ini.
- Produk yang belum pernah terjual, dengan
NOT EXISTS.
Kesalahan yang sering terjadi
- Lupa menghubungkan subquery dengan query luar (bagian
WHERE p.karyawan_id = k.id). Tanpa itu,EXISTSselalu benar kalau tabelnya tidak kosong, sehingga semua baris lolos.
OVER & PARTITION BY