TL;DR
Operator LIKE di SQL dipakai buat nyari teks yang cocok dengan pola, bukan yang sama persis. Ada dua wildcard: tanda persen (%) mewakili nol karakter atau lebih, dan underscore (_) mewakili tepat satu karakter. Di PostgreSQL, LIKE membedakan huruf besar dan kecil, jadi pakai ILIKE atau bungkus kolomnya dengan LOWER() kalau kamu mau pencarian yang nggak peduli kapitalisasi.
Operator LIKE di SQL dipakai buat nyari teks yang mirip pola tertentu, bukan yang sama persis.
SELECT nama FROM pelanggan
WHERE nama LIKE 'Budi%';
Tanda sama dengan (=) cuma nemu yang identik huruf per huruf. LIKE bisa nemu yang cuma cocok sebagian.
Tapi query di atas punya dua bug yang nggak kelihatan. Nanti aku tunjukin.
LIKE adalah operator perbandingan teks yang cocokin isi kolom sama sebuah pola. Polanya ditulis pakai wildcard, karakter khusus yang mewakili karakter lain. Ada dua wildcard di LIKE: tanda persen (%) mewakili nol karakter atau lebih, dan underscore (_) mewakili tepat satu karakter.
LIKE dipakai di klausa WHERE, tempat yang sama kayak operator biasa.
| Pola | Artinya | Contoh yang cocok |
|---|---|---|
'Budi%' | Diawali Budi | Budi, Budiman, Budi Santoso |
'%Budi' | Diakhiri Budi | Ahmad Budi, Budi |
'%Budi%' | Mengandung Budi | Ketiganya di atas |
'B_di' | 4 huruf: B, 1 karakter apa aja, d, i | Budi, Bodi |
'%@gmail.com' | Email gmail | rina@gmail.com |
'08%' | Nomor HP Indonesia | 08123456789 |
Bedanya % dan _ gampang diinget: persen itu serakah (berapa pun karakternya, termasuk nol), underscore itu pelit (tepat satu, nggak boleh kurang atau lebih).
LIKE 'B_di' cocok sama "Budi" tapi nggak cocok sama "Budiman". Polanya cuma 4 karakter, sementara Budiman ada 7.
Tabel pelanggan toko_berkah, 8 baris.
| id | nama | kota | |
|---|---|---|---|
| 1 | Budi Santoso | budi.santoso@gmail.com | Bandung |
| 2 | Budiman | budiman@yahoo.co.id | Bandung |
| 3 | Siti Aminah | siti@tokoberkah.co.id | Surabaya |
| 4 | Ahmad Budi | ahmad.budi@gmail.com | Medan |
| 5 | Rina Kopiah | rina@gmail.com | Bandung |
| 6 | budi hartono | BUDI.H@Gmail.com | Jakarta |
| 7 | Dewi Lestari | dewi@corp.co.id | Surabaya |
| 8 | Toni_Wijaya | toni@gmail.com | Medan |
Ada 4 orang yang namanya mengandung "budi": Budi Santoso, Budiman, Ahmad Budi, dan budi hartono.
Sekarang lihat apa yang kejadian.
SELECT nama FROM pelanggan WHERE nama LIKE 'Budi%';
-- Budi Santoso
-- Budiman
-- 2 baris
Dari 4 pelanggan bernama Budi di tabel toko_berkah,
LIKE 'Budi%'cuma nemu 2. Ahmad Budi kelewat karena namanya di belakang. budi hartono kelewat karena huruf b-nya kecil.
Dua bug, satu query. Ini kenapa laporan "jumlah pelanggan bernama Budi" sering salah.
Di PostgreSQL, LIKE membedakan huruf besar dan kecil. 'Budi%' nggak cocok sama 'budi hartono'.
Di MySQL dengan collation bawaan, LIKE justru nggak peduli. Query yang sama, hasil beda, tergantung databasenya.
Cara paling aman yang jalan di mana pun: samain hurufnya dulu.
SELECT nama FROM pelanggan
WHERE LOWER(nama) LIKE '%budi%';
-- Budi Santoso
-- Budiman
-- Ahmad Budi
-- budi hartono
-- 4 baris ✅
Sekarang keempatnya kena. Perhatiin polanya juga aku ubah jadi huruf kecil semua. Kalau nggak, nggak akan ada yang cocok.
Khusus PostgreSQL ada jalan pintas: ILIKE.
SELECT nama FROM pelanggan
WHERE nama ILIKE '%budi%';
Hasilnya sama. Tapi ILIKE cuma ada di PostgreSQL, jadi kalau query kamu harus portabel, pakai LOWER. Fungsi teks lain yang sering dipakai bareng ada di panduan fungsi string SQL.
Pelanggan nomor 8 namanya Toni_Wijaya, pakai underscore beneran. Coba cari.
-- SALAH: underscore dianggap wildcard
SELECT nama FROM pelanggan WHERE nama LIKE '%_%';
-- hasilnya SEMUA 8 baris 😵
Underscore di situ diartikan sebagai "satu karakter apa aja", dan semua nama punya minimal satu karakter. Jadi semuanya kena.
Solusinya: kasih tau database bahwa underscore itu karakter biasa, pakai ESCAPE.
SELECT nama FROM pelanggan
WHERE nama LIKE '%\_%' ESCAPE '\';
-- Toni_Wijaya
-- 1 baris ✅
Aturannya sama buat tanda persen. Kalau kamu nyari produk bernama "Diskon 50%", pakai LIKE '%50\%%' ESCAPE '\'.
Aturan lengkap wildcard dan escape ada di dokumentasi PostgreSQL untuk pattern matching.
Ini bagian yang bikin LIKE punya reputasi jelek di tim engineering.
WHERE nama LIKE 'Budi%' -- bisa pakai index, cepat
WHERE nama LIKE '%Budi%' -- nggak bisa pakai index, lambat
Index di database itu urut secara alfabet. Kalau kamu tau awalan katanya, database bisa langsung loncat ke bagian yang bener, sama kayak nyari kata di kamus.
Tapi kalau polanya diawali %, database nggak tau harus mulai dari mana. Dia terpaksa baca semua baris satu per satu. Di tabel 10 baris, nggak kerasa. Di tabel 10 juta baris, query bisa jalan berpuluh detik.
Yang aku lakuin di tabel besar:
LIKE 'awalan%' kalau memungkinkan. Index tetap kepakai.pg_trgm di PostgreSQL).Catatan: LOWER(nama) LIKE ... juga matiin index biasa. Kalau kamu sering pakai pola ini, bikin functional index di LOWER(nama).
= padahal maunya LIKE. WHERE nama = 'Budi%' nyari nama yang literal-nya "Budi%", termasuk tanda persennya.% di depan padahal nggak perlu. Kalau kamu cuma nyari awalan, jangan pakai '%Budi%'. Buang % depannya.OR nama IS NULL kalau kamu mau dia ikut.Yang terakhir ini sama persis kayak jebakan NOT IN. Perilaku NULL lengkapnya ada di glosarium NULL.
Persen mewakili nol karakter atau lebih. Underscore mewakili tepat satu karakter. 'B%' cocok sama Budi dan Budiman. 'B_di' cuma cocok sama kata 4 huruf kayak Budi.
Di PostgreSQL, iya. Di MySQL dengan collation bawaan, nggak. Cara aman yang jalan di mana pun: bungkus pakai LOWER() di dua sisi.
Pola yang diawali % bikin database nggak bisa pakai index, jadi dia baca semua baris. Di tabel jutaan baris, ini kerasa banget.
Regular expression. PostgreSQL punya operator ~, MySQL punya REGEXP. Pakai buat pola kayak nomor HP yang harus 10-13 digit. Pola ini nggak bisa ditulis pakai LIKE.
% = nol karakter atau lebih. _ = tepat satu karakter.LOWER() biar aman, di tabel toko_berkah, ini yang bikin hasil naik dari 2 jadi 4 baris.% di depan pola bikin index nggak kepakai. Hindari kalau tabelnya besar.Semua query di sini udah dites dan siap copy-paste. Latihan langsung di halaman LIKE, editornya jalan di browser.
Lanjut baca: Operator IN dan BETWEEN SQL buat nyaring daftar nilai dan rentang.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Analisa per kuartal, hari kerja, atau musim jadi ribet kalau tiap query ngitung ulang atribut tanggal. Tabel kalender nyimpen semua atribut itu sekali, biar tinggal di-JOIN.
Laporan penjualan harian sering bolong di hari tanpa transaksi. Ini cara bikin deret tanggal lengkap di SQL biar tiap hari muncul, walau nilainya nol.
Struktur organisasi tersimpan sebagai kolom id_atasan yang saling nunjuk. Ini cara narik rantai jabatan, hitung total bawahan, dan span of control cuma pakai SQL.