IN, BETWEEN, LIKE, dan Misteri NULL
Operator filter praktis: IN untuk daftar nilai, BETWEEN untuk rentang, LIKE untuk pola teks, dan IS NULL untuk nilai kosong, lengkap dengan logika tiga nilai NULL.
IN: cocokkan dengan daftar
Daripada menulis banyak OR:
WHERE kota = 'Jakarta' OR kota = 'Bandung' OR kota = 'Surabaya'
cukup tulis:
WHERE kota IN ('Jakarta', 'Bandung', 'Surabaya')
WHERE kota NOT IN ('Medan', 'Semarang') -- kebalikannya
BETWEEN: dalam rentang (batas ikut dihitung)
WHERE harga BETWEEN 10000 AND 20000 -- harga >= 10000 AND harga <= 20000
WHERE tgl_daftar BETWEEN '2023-01-01' AND '2023-06-30'
Kedua ujung termasuk. Nilai kecil harus ditulis lebih dulu. Cocok untuk angka dan tanggal.
LIKE: mencari pola teks
| Karakter pola | Artinya |
|---|---|
% | nol atau lebih karakter apa saja |
_ | tepat satu karakter apa saja |
WHERE nama LIKE 'Kopi%' -- diawali "Kopi"
WHERE nama LIKE '%Goreng' -- diakhiri "Goreng"
WHERE nama LIKE '%teh%' -- mengandung "teh" di mana saja
WHERE kode LIKE 'A_C' -- A, satu huruf apa saja, lalu C (ABC, AXC, ...)
WHERE nama NOT LIKE '%a%' -- TIDAK mengandung huruf a
Performa: LIKE 'Kopi%' (awalan) bisa memanfaatkan index dan cepat. LIKE '%kopi%' (awalan wildcard) harus memeriksa setiap baris, lambat di tabel besar. Untuk pencarian teks serius ada FULLTEXT index.
NULL: bukan nol, bukan kosong, tapi "tidak diketahui"
Kolom email Andi bernilai NULL: kita tidak tahu emailnya. Karena itu, perbandingan biasa dengan NULL tidak pernah menghasilkan benar:
SELECT * FROM pelanggan WHERE email = NULL; -- hasil: 0 baris (SALAH CARA)
SELECT * FROM pelanggan WHERE email IS NULL; -- benar: Andi dan Fitri
SELECT * FROM pelanggan WHERE email IS NOT NULL;
Kenapa? "Tidak diketahui sama dengan tidak diketahui?" Jawabannya tidak diketahui juga (bukan benar). SQL memakai logika tiga nilai: TRUE, FALSE, UNKNOWN, dan WHERE hanya meloloskan yang TRUE.
Ingat selalu: NULL ≠ 0, NULL ≠ '' (teks kosong). Dan NULL + 5 hasilnya NULL, bukan 5. Nilai kosong "menular" ke hasil hitungan.
Menggabungkan semuanya
SELECT nama, kota
FROM pelanggan
WHERE kota IN ('Jakarta', 'Bandung')
AND email IS NOT NULL
AND tgl_daftar BETWEEN '2023-01-01' AND '2023-06-30';