Kotak pencarian “cari produk yang mengandung kata kopi” tidak bisa dipenuhi dengan operator = karena = menuntut kecocokan teks yang persis. Untuk kebutuhan ini SQL menyediakan pencarian pola (pattern matching): SQLite punya dua operator sekaligus, LIKE dan GLOB, dengan wildcard dan perilaku huruf besar-kecil yang berbeda. Kita akan membedah keduanya memakai tabel produk dari domain toko, lalu menutup dengan tabel perbandingan agar Anda tahu kapan memakai yang mana.
Data Contoh #
Chapter ini hanya membutuhkan tabel produk. Skema dan datanya diambil dari domain toko pada Section SQL Dasar:
CREATE TABLE produk (
id INTEGER PRIMARY KEY,
nama TEXT NOT NULL,
harga INTEGER NOT NULL,
stok INTEGER
);
INSERT INTO produk (id, nama, harga, stok) VALUES
(1, 'Kopi Gayo', 45000, 20), (2, 'Teh Melati', 18000, 35),
(3, 'Gula Aren', 25000, 15), (4, 'Sirup Vanila', 25000, NULL),
(5, 'Kopi Toraja', 52000, 10), (6, 'Teh Hijau', 22000, 0),
(7, 'Cangkir Keramik', 35000, 8);Output seluruh contoh di bawah tampil dalam mode list bawaan shell sqlite3, dengan kolom dipisah tanda |.
Wildcard LIKE: % dan _ #
LIKE membandingkan teks terhadap pola yang memuat dua wildcard:
%— cocok dengan nol atau lebih karakter apa pun._— cocok dengan tepat satu karakter apa pun.
Pola 'Kopi%' dibaca: “teks yang diawali Kopi, sisanya bebas”:
SELECT nama
FROM produk
WHERE nama LIKE 'Kopi%'
ORDER BY id;Output yang Dihasilkan:
Kopi Gayo
Kopi TorajaGaris bawah membatasi panjang secara tepat. Pola '_eh%' berarti “satu karakter apa pun, lalu eh, lalu sisanya bebas” — menangkap semua nama teh:
SELECT nama
FROM produk
WHERE nama LIKE '_eh%'
ORDER BY id;Output yang Dihasilkan:
Teh Melati
Teh HijauWildcard bisa berada di posisi mana pun, termasuk di tengah. Pola '%aren%' mencocokkan semua teks yang memuat aren, dan NOT LIKE membalik maknanya:
SELECT nama
FROM produk
WHERE nama LIKE '%aren%';Output yang Dihasilkan:
Gula ArenSELECT nama
FROM produk
WHERE nama NOT LIKE '%teh%'
ORDER BY id;Output yang Dihasilkan:
Kopi Gayo
Gula Aren
Sirup Vanila
Kopi Toraja
Cangkir KeramikLIKE Tidak Membedakan Huruf Besar-Kecil #
Perilaku paling mengejutkan LIKE di SQLite: untuk huruf ASCII, pencocokan tidak memperhatikan huruf besar-kecil. Pola 'kopi%' menemukan Kopi Gayo meskipun huruf k nya kecil:
SELECT nama
FROM produk
WHERE nama LIKE 'kopi%'
ORDER BY id;Output yang Dihasilkan:
Kopi Gayo
Kopi TorajaBukti paling ringkasnya bisa dilihat dari perbandingan literal — hasil pertama bernilai 1 (benar), hasil kedua 0 (salah):
SELECT 'budi' LIKE 'BUDI' AS like_cocok, 'Budi' GLOB 'BUDI' AS glob_cocok;Output yang Dihasilkan:
1|0Karakter Khusus dan ESCAPE #
Bagaimana jika yang dicari justru tanda % atau _ itu sendiri? Wildcard harus “diloloskan” dengan klausa ESCAPE yang menunjuk satu karakter pelolos. Konvensi umum memakai garis miring terbalik:
SELECT 'baju_merah' LIKE '%\_%' ESCAPE '\' AS dengan_garis,
'baju merah' LIKE '%\_%' ESCAPE '\' AS tanpa_garis;Output yang Dihasilkan:
1|0Pola '%\_%' berarti “semua teks yang memuat satu karakter garis bawah literal”, sehingga 'baju_merah' cocok dan 'baju merah' (memakai spasi) tidak. Tanpa ESCAPE, tanda _ pada pola tetap diperlakukan sebagai wildcard.
GLOB: Pola Gaya Unix #
Operator GLOB adalah alternatif LIKE yang mengikuti kebiasaan shell Unix. Wildcard-nya berbeda, dan pencocokan membedakan huruf besar-kecil (case-sensitive) untuk semua karakter:
| Sifat | LIKE | GLOB |
|---|---|---|
| Nol atau lebih karakter | % | * |
| Tepat satu karakter | _ | ? |
| Huruf besar-kecil (ASCII) | Tidak dibedakan | Dibedakan |
Kumpulan karakter [...] | Tidak didukung | Didukung: [KT], [a-m] |
Tiga pola GLOB berikut memperlihatkan ketiganya sekaligus:
SELECT nama FROM produk WHERE nama GLOB 'Kopi*' ORDER BY id;Output yang Dihasilkan:
Kopi Gayo
Kopi TorajaSELECT nama FROM produk WHERE nama GLOB 'kopi*' ORDER BY id;Output yang Dihasilkan:
SELECT nama FROM produk WHERE nama GLOB '[KT]*' ORDER BY id;Output yang Dihasilkan:
Kopi Gayo
Teh Melati
Kopi Toraja
Teh HijauQuery kedua mengembalikan hasil kosong karena kopi* menuntut huruf k kecil di awal — di sinilah GLOB berbeda dari LIKE. Adapun tanda ? bekerja seperti _ pada LIKE, meminta tepat satu karakter:
SELECT nama FROM produk WHERE nama GLOB 'Kopi ?ayo';Output yang Dihasilkan:
Kopi GayoPola [KT]* mencocokkan nama yang dimulai huruf K atau T, dan rentang seperti [a-m] juga sah di dalam kurung siku.
Baik LIKE maupun GLOB mengabaikan baris yang nilainya NULL — perbandingan pola terhadap NULL menghasilkan NULL, sama seperti perilaku operator pembanding lain yang kita bahas pada Chapter Operator Lanjutan: IN, BETWEEN, IS NULL.