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:

sql
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”:

sql
SELECT nama
FROM produk
WHERE nama LIKE 'Kopi%'
ORDER BY id;

Output yang Dihasilkan:

text
Kopi Gayo
Kopi Toraja

Garis bawah membatasi panjang secara tepat. Pola '_eh%' berarti “satu karakter apa pun, lalu eh, lalu sisanya bebas” — menangkap semua nama teh:

sql
SELECT nama
FROM produk
WHERE nama LIKE '_eh%'
ORDER BY id;

Output yang Dihasilkan:

text
Teh Melati
Teh Hijau

Wildcard bisa berada di posisi mana pun, termasuk di tengah. Pola '%aren%' mencocokkan semua teks yang memuat aren, dan NOT LIKE membalik maknanya:

sql
SELECT nama
FROM produk
WHERE nama LIKE '%aren%';

Output yang Dihasilkan:

text
Gula Aren
sql
SELECT nama
FROM produk
WHERE nama NOT LIKE '%teh%'
ORDER BY id;

Output yang Dihasilkan:

text
Kopi Gayo
Gula Aren
Sirup Vanila
Kopi Toraja
Cangkir Keramik

LIKE 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:

sql
SELECT nama
FROM produk
WHERE nama LIKE 'kopi%'
ORDER BY id;

Output yang Dihasilkan:

text
Kopi Gayo
Kopi Toraja

Bukti paling ringkasnya bisa dilihat dari perbandingan literal — hasil pertama bernilai 1 (benar), hasil kedua 0 (salah):

sql
SELECT 'budi' LIKE 'BUDI' AS like_cocok, 'Budi' GLOB 'BUDI' AS glob_cocok;

Output yang Dihasilkan:

text
1|0

Karakter 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:

sql
SELECT 'baju_merah' LIKE '%\_%' ESCAPE '\' AS dengan_garis,
       'baju merah' LIKE '%\_%' ESCAPE '\' AS tanpa_garis;

Output yang Dihasilkan:

text
1|0

Pola '%\_%' 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:

SifatLIKEGLOB
Nol atau lebih karakter%*
Tepat satu karakter_?
Huruf besar-kecil (ASCII)Tidak dibedakanDibedakan
Kumpulan karakter [...]Tidak didukungDidukung: [KT], [a-m]

Tiga pola GLOB berikut memperlihatkan ketiganya sekaligus:

sql
SELECT nama FROM produk WHERE nama GLOB 'Kopi*' ORDER BY id;

Output yang Dihasilkan:

text
Kopi Gayo
Kopi Toraja
sql
SELECT nama FROM produk WHERE nama GLOB 'kopi*' ORDER BY id;

Output yang Dihasilkan:

text
sql
SELECT nama FROM produk WHERE nama GLOB '[KT]*' ORDER BY id;

Output yang Dihasilkan:

text
Kopi Gayo
Teh Melati
Kopi Toraja
Teh Hijau

Query 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:

sql
SELECT nama FROM produk WHERE nama GLOB 'Kopi ?ayo';

Output yang Dihasilkan:

text
Kopi Gayo

Pola [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.