LIKE dan GLOB

Pencocokan pola dengan LIKE dan GLOB beserta perbedaan sensitivitas hurufnya.

Daftar isi

Topik ini membahas dua operator pencocokan pola (pattern matching) pada SQLite, yaitu LIKE dan GLOB, yang mencocokkan teks terhadap pola yang memuat karakter pengganti (wildcard). Keduanya dibandingkan langsung pada data yang sama agar perbedaan sensitivitas huruf beserta peta karakternya terlihat jelas. Tabel latihannya tetap tabel buku perpustakaan, dan tabel peminjaman muncul pada satu contoh. Setelah membaca, pencarian berdasarkan awalan, akhiran, dan fragmen teks dapat ditulis dengan operator yang tepat.

Dataset contoh#

Blok berikut membangun ulang tabel buku lalu menampilkan kolom judulnya. Duplikasi judul yang ada sejak awal modul ini justru berguna pada topik ini, karena setiap kecocokan pola menunjukkan seluruh baris yang memenuhinya.

sql Daftar judul pada tabel buku
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku;
text Keluaran
Dasar Algoritma
Peta Langit
Dasar Algoritma
Sejarah Kertas
Kode dan Sandi
Jejak Angin
Peta Langit

Ketujuh judul ini menjadi bahan uji seluruh contoh pada topik ini. Judul-judulnya sengaja bervariasi awalan dan panjangnya, mulai dari D, P, S, K, hingga J, agar satu pola tidak menangkap semuanya sekaligus. Dua judul yang berulang juga menunjukkan bahwa pencocokan pola bekerja per baris, bukan per nilai unik, sebab setiap baris dinilai terpisah oleh operator. Judul kembar pada tabel ini membuat sebagian kecocokan tampil berpasangan, dan itu wajar karena keduanya baris yang berbeda. Setiap pola pada bagian berikutnya diuji terhadap daftar ini, sehingga kecocokan maupun kegagalannya dapat diperiksa dengan mata. Untuk mengulang eksperimennya, simpan setiap blok sebagai berkas .sql lalu jalankan dengan sqlite3 pada basis data dalam memori, atau tempel pernyataannya pada sesi interaktif, sebagaimana dilakukan pada topik-topik lain modul ini.

LIKE dengan wildcard#

LIKE memakai dua karakter pengganti. Tanda % mewakili deret karakter apa pun, termasuk deret kosong, sedangkan tanda _ mewakili tepat satu karakter apa pun. Pola 'P%' berarti teks yang diawali huruf P, dan jalankan query berikut untuk membuktikannya.

sql Judul yang diawali huruf P
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul LIKE 'P%';
text Keluaran
Peta Langit
Peta Langit

Kedua salinan Peta Langit lolos, sedangkan judul lain tersaring karena tidak diawali P. Pola yang diawali % menyasar akhiran, dan pola yang ditempatkan di tengah menyasar fragmen. Query berikut memakai _ pada posisi kedua untuk mengambil judul yang huruf keduanya adalah e.

sql Judul dengan huruf kedua e
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul LIKE '_e%';
text Keluaran
Peta Langit
Sejarah Kertas
Jejak Angin
Peta Langit

Empat judul memenuhi pola itu, dan setiap judul terlihat memang memiliki e pada huruf kedua. Kata NOT membalik kecocokan, sehingga NOT LIKE '%Algoritma%' mengambil semua judul yang tidak memuat fragmen tersebut.

sql Judul tanpa fragmen Algoritma
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul NOT LIKE '%Algoritma%';
text Keluaran
Peta Langit
Sejarah Kertas
Kode dan Sandi
Jejak Angin
Peta Langit

Contoh terakhir menerapkan pola pada kolom nama di tabel peminjaman, untuk mengambil peminjam yang namanya tidak memuat huruf a sama sekali.

sql Nama tanpa huruf a
CREATE TABLE peminjaman (
  id INTEGER PRIMARY KEY,
  nama TEXT,
  buku_id INTEGER,
  tanggal_pinjam TEXT
);
INSERT INTO peminjaman VALUES
  (1, 'Ali', 1, '2026-03-01'),
  (2, 'Budi', 2, '2026-03-03'),
  (3, 'Citra', 3, '2026-03-03'),
  (4, 'Dewi', 1, '2026-03-07'),
  (5, 'Eka', 5, '2026-03-10'),
  (6, 'Farhan', 6, '2026-03-12');
SELECT nama FROM peminjaman WHERE nama NOT LIKE '%a%';
text Keluaran
Budi
Dewi

Keluarannya hanya Budi dan Dewi, karena nama lain memuat huruf a pada posisi mana pun. Perlu dicatat bahwa LIKE tidak membedakan huruf besar dan kecil, sehingga huruf A pada Ali juga cocok dengan pola %a%. Sifat ini dibahas khusus pada bagian berikutnya.

LIKE tidak peka huruf untuk ASCII#

LIKE mengabaikan perbedaan huruf besar dan kecil, tetapi hanya untuk huruf ASCII, yaitu a hingga z beserta kapitalnya. Jalankan query berikut yang polanya ditulis dengan huruf kecil seluruhnya.

sql Pola huruf kecil untuk judul berhuruf kapital
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul LIKE 'peta%';
text Keluaran
Peta Langit
Peta Langit

Pola 'peta%' dengan p kecil tetap mencocokkan Peta Langit yang diawali P besar. Perilaku ini berlaku hanya pada huruf ASCII, yaitu a hingga z beserta kapitalnya, sehingga karakter di luar itu tetap dibandingkan secara peka huruf. Sifat ini juga berlaku pada pola yang hurufnya bercampur di tengah, bukan hanya pada awalan, karena yang menentukan hanyalah karakternya sedangkan perbedaan kapitalnya dilupakan. Penulisan pola dengan huruf kecil seluruhnya pun menjadi pilihan yang lazim demi konsistensi. Kelalaian yang lazim adalah mengira satu pola cukup ditulis dua versi hurufnya untuk LIKE, padahal untuk teks Latin dasar satu pola sudah mencakup keduanya. Sebaliknya, jangan mengandalkan sifat ini pada huruf beraksen, karena pola 'cafe%' tidak akan menemukan kata yang ditulis dengan e beraksen. Perbedaan ini menjadi pembeda utama dengan GLOB pada bagian berikutnya.

GLOB peka huruf besar-kecil#

GLOB adalah operator kembarannya yang memakai gaya pola shell Unix. Tanda * menggantikan % sebagai deret karakter apa pun, dan tanda ? menggantikan _ sebagai satu karakter apa pun. Beda yang paling menentukan adalah sensitivitasnya, karena GLOB membedakan huruf besar dan kecil. Jalankan query berikut dengan pola yang hurufnya persis sama dengan judulnya.

sql GLOB dengan pola yang hurufnya tepat
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul GLOB 'Peta*';
text Keluaran
Peta Langit
Peta Langit

Kecocokan terjadi karena pola dan judulnya sama-sama diawali P besar. Pola 'peta*' dengan p kecil akan menghasilkan nol baris pada data ini, dan bukti angkanya ditampilkan pada bagian perbandingan. Tanda ? memperagakan posisi yang pasti, misalnya pola '???? *' yang mensyaratkan empat karakter, satu spasi, lalu sisanya bebas.

sql GLOB dengan empat karakter dan satu spasi
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul GLOB '???? *';
text Keluaran
Peta Langit
Kode dan Sandi
Peta Langit

Hanya judul berkatapertama empat huruf yang lolos, yaitu Peta dan Kode, sedangkan Jejak, Dasar, dan Sejarah gagal karena kata pertamanya lebih panjang. GLOB juga mengenal kelas karakter [...] yang mengizinkan satu posisi diisi salah satu karakter dari daftarnya.

sql Kelas karakter untuk huruf pertama
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul GLOB '[Pp]eta*';
text Keluaran
Peta Langit
Peta Langit

Kelas [Pp] menerima P besar maupun p kecil pada posisi pertama, sehingga kedua penulisan judul diakomodasi secara terkendali. Teknik ini berguna ketika sensitivitas penuh terasa kaku tetapi sensitivitas penuh pula yang tidak diinginkan.

Membandingkan LIKE dan GLOB pada data yang sama#

Perbedaan keduanya paling mudah diamati pada satu teks dan tiga pola. SQLite menyediakan bentuk fungsi LIKE(pola, teks) dan GLOB(pola, teks) yang menghasilkan 1 bila cocok dan 0 bila tidak, sehingga ujinya bisa dijalankan tanpa tabel sama sekali.

sql Uji satu teks dengan tiga pola
SELECT LIKE('peta%', 'Peta Langit');
SELECT GLOB('peta*', 'Peta Langit');
SELECT GLOB('Peta*', 'Peta Langit');
text Keluaran
1
0
1

Baris pertama menunjukkan LIKE dengan p kecil tetap cocok. Baris kedua menunjukkan GLOB dengan p kecil gagal, dan baris ketiga menunjukkan GLOB dengan P besar berhasil. Ringkasan perbedaannya sebagai berikut.

AspekLIKEGLOB
Deret karakter apa pun%*
Satu karakter apa pun_?
Sensitivitas huruftidak peka untuk ASCIIpeka
Kelas karaktertidak ada[...]

Kedua operator menguji seluruh teks, bukan potongannya, sehingga pola tanpa karakter pengganti berarti kecocokan penuh. Tabel di atas juga menjadi pengingat bahwa pola keduanya tidak saling dipertukarkan begitu saja.

Pola dengan karakter literal#

Pola yang seluruhnya berupa karakter biasa bertindak sebagai kecocokan penuh, dan LIKE-nya tetap tidak peka huruf. Jalankan query berikut yang polanya tanpa karakter pengganti sama sekali.

sql Pola tanpa karakter pengganti
CREATE TABLE buku (id INTEGER PRIMARY KEY, judul TEXT, pengarang TEXT, tahun INTEGER, stok INTEGER);
INSERT INTO buku VALUES
  (1, 'Dasar Algoritma', 'Ali', 2019, 4),
  (2, 'Peta Langit', 'Budi', 2021, 0),
  (3, 'Dasar Algoritma', 'Citra', 2021, 2),
  (4, 'Sejarah Kertas', 'Dewi', 2019, 3),
  (5, 'Kode dan Sandi', 'Eka', 2023, 5),
  (6, 'Jejak Angin', 'Farhan', 2020, 0),
  (7, 'Peta Langit', 'Budi', 2024, 7);
SELECT judul FROM buku WHERE judul LIKE 'Kode dan Sandi';
text Keluaran
Kode dan Sandi

Persoalan muncul ketika karakter %, _, atau * justru ingin dicari sebagai karakter biasa, misalnya pada teks yang memuat angka persen. Pada LIKE, karakter pengganti dilucuti dengan klausa ESCAPE yang menetapkan satu karakter pelolos.

sql Mencari garis bawah sebagai karakter biasa
SELECT 'ab_cd' LIKE 'ab\_cd' ESCAPE '\';
SELECT 'abXcd' LIKE 'ab\_cd' ESCAPE '\';
text Keluaran
1
0

Tanpa ESCAPE, pola 'ab_cd' akan mencocokkan kedua teks karena _ menerima karakter apa pun. Dengan ESCAPE, garis miring terbalik membuat _ menjadi literal, sehingga hanya ab_cd yang cocok. Pada GLOB, klausa ESCAPE tidak tersedia, dan karakter *, ?, serta [ yang ingin dicari secara literal ditulis di dalam kelas, misalnya [*]. Teknik pelolosan ini diperlukan pada data teknis yang memuat tanda tersebut, misalnya kode berformat AB_12 atau tanda persen pada catatan teks. Karena itu begitu pola memuat karakter khusus, ujilah kecocokannya pada teks yang sengaja tidak cocok, sebagaimana baris kedua pada contoh di atas.

Kesalahan umum#

Kesalahan yang paling sering terjadi adalah memakai pola bergaya LIKE pada GLOB, atau sebaliknya, karena tanda % pada GLOB diperlakukan sebagai karakter biasa. Uji berikut menunjukkan akibatnya pada satu teks.

sql Tanda persen pada GLOB diperlakukan literal
SELECT GLOB('Peta%', 'Peta Langit');
SELECT GLOB('Peta%', 'Peta%');
text Keluaran
0
1

Baris pertama menghasilkan 0 karena tidak ada judul yang benar-benar memuat tanda persen, dan baris kedua menghasilkan 1 hanya karena teksnya kebetulan memuat tanda persen itu secara literal. Perbaikannya adalah mengganti % dengan * sebelum memakai GLOB. Kesalahan kedua yang senada adalah mengharapkan GLOB tidak peka huruf sebagaimana LIKE, sehingga pola 'peta*' gagal menemukan Peta Langit, dan perbaikannya adalah menuliskan pola dengan huruf yang persis atau memakai kelas karakter. Kedua kesalahan itu berjalan tanpa error, sehingga satu-satunya petunjuknya adalah daftar hasil yang kosong. Karena tidak ada pesan error yang muncul, hasil kosong semacam ini kerap disalahartikan sebagai data yang memang tidak ada, padahal polanya yang keliru. Kebiasaan yang mencegahnya adalah memeriksa kembali peta karakter pada tabel perbandingan sebelum menulis pola, karena % dan _ milik LIKE, sedangkan * dan ? milik GLOB.

Ringkasan#

  • LIKE memakai % dan _ serta mengabaikan huruf besar-kecil untuk ASCII, sedangkan GLOB memakai * dan ? serta peka huruf.
  • NOT LIKE dan NOT GLOB membalik kecocokan pola terhadap seluruh teks.
  • Literal % atau _ pada LIKE ditangani dengan klausa ESCAPE, dan literal * pada GLOB ditulis di dalam kelas [*].
  • Kelas karakter [...] pada GLOB mengizinkan satu posisi diisi salah satu karakter dari daftarnya.

Referensi#