Pernah nyari nama kontak di HP dengan ngetik cuma "ayu" — dan langsung muncul semua kontak yang namanya mengandung kata itu, entah "Ayuning", "Dewi Ayu", atau "Rahayu"? Fitur pencarian pintar seperti itu, di balik layarnya, sering menggunakan logika yang sama persis dengan LIKE wildcard MySQL. Operator LIKE adalah cara MySQL mencari teks berdasarkan pola, bukan kecocokan kata yang harus persis sama. Dan inilah yang membedakan aplikasi yang terasa "pintar" dengan yang kaku.
Selamat datang di artikel ke-11 dari seri 28 artikel Belajar Query SQL MySQL. Setelah di artikel sebelumnya kita kuasai BETWEEN dan IN untuk filter data numerik dan diskrit, kini saatnya masuk ke dunia pencarian teks. Di sini kamu akan belajar cara kerja LIKE, dua karakter wildcard utama (% dan _), cara menggabungkannya, serta tips performa yang wajib kamu tahu sebelum pakai di proyek nyata.
Fitur kolom pencarian (search bar) di hampir semua aplikasi web yang menggunakan database relasional — mulai dari toko online sederhana hingga sistem manajemen internal perusahaan — bergantung pada operator LIKE di balik layarnya. Operator ini adalah salah satu fitur SQL tertua yang masih relevan dan digunakan masif hingga hari ini, meski telah ada teknologi full-text search yang lebih canggih.
1. Mengenal Operator LIKE: Pencarian dengan Pola
Operator LIKE di MySQL digunakan bersama klausa WHERE untuk mencocokkan nilai teks berdasarkan pola tertentu, bukan nilai yang harus identik. Bayangkan LIKE seperti fitur "cari" di file manager laptop kamu — kamu bisa ketik sebagian nama file dan sistem akan temukan semua file yang cocok dengan pola itu.
SELECT kolom1, kolom2, ...
FROM nama_tabel
WHERE nama_kolom LIKE 'pola_pencarian';
-- Dua karakter wildcard yang tersedia:
-- % : mewakili NOL atau LEBIH karakter apapun
-- _ : mewakili tepat SATU karakter apapun
-- LIKE bersifat case-insensitive di MySQL (default)
Sebelum mulai query, kita pakai tabel produk dan pelanggan dari toko online kita. Contoh pertama: mencari produk yang namanya mengandung kata "tas".
SELECT nama_produk, kategori, harga
FROM produk
WHERE nama_produk LIKE '%tas%';
-- '%tas%' artinya: apapun sebelum 'tas', apapun sesudahnya
📊 Output / Hasil Query:
| nama_produk | kategori | harga |
|---|---|---|
| Tas Selempang Canvas | Tas | Rp 145.000 |
| Tas Ransel Laptop 14" | Tas | Rp 310.000 |
| Dompet Pria Anti-Basah | Aksesoris | Rp 75.000 |
*) "Dompet Pria Anti-Basah" ikut muncul karena nama kota asal pengiriman di kolom deskripsi mengandung suku kata "tas" — ini contoh nyata betapa LIKE mencari di seluruh isi teks.
LIKE di MySQL secara default tidak membedakan huruf besar/kecil (case-insensitive) untuk kolom bertipe VARCHAR dengan collation utf8_general_ci. Jadi LIKE '%TAS%' dan LIKE '%tas%' menghasilkan output yang sama. Kalau kamu butuh case-sensitive, gunakan keyword BINARY: LIKE BINARY '%Tas%'.
2. Dua Wildcard Utama: Persen (%) dan Garis Bawah (_)
Dalam konteks LIKE wildcard MySQL, dua karakter ini adalah "senjata" utama kamu. Analoginya gampang: % itu seperti kartu joker yang bisa menggantikan berapa pun kartu lain, sementara _ itu seperti kartu yang bisa menggantikan tepat satu kartu tertentu. Mari kita bedah keduanya satu per satu.
-- Diawali dengan 'Kaos'
WHERE nama_produk LIKE 'Kaos%'
-- Cocok: "Kaos Polos", "Kaos Distro", "Kaos Oversize"
-- Diakhiri dengan 'Pro'
WHERE nama_produk LIKE '%Pro'
-- Cocok: "Laptop Gaming Pro", "Headset Studio Pro"
-- Mengandung 'premium' di mana saja
WHERE nama_produk LIKE '%premium%'
-- Cocok: "Kaos Polos Premium", "Premium Sneakers"
-- Kode produk dengan format: 2 huruf + 3 angka
WHERE kode_produk LIKE '__-___'
-- Cocok: "AB-123", "XY-099" (tiap _ = 1 karakter)
-- Nama dengan 4 karakter tepat
WHERE nama_kota LIKE '____'
-- Cocok: "Solo", "Palu", "Toba"
-- Email provider tertentu: _@gmail.com (1 karakter sebelum @)
WHERE email LIKE '_%@gmail.com'
-- Cocok: semua email Gmail dengan username minimal 1 karakter
Contoh nyata: cari semua pelanggan yang mendaftar menggunakan email Gmail.
SELECT nama_pelanggan, email, kota
FROM pelanggan
WHERE email LIKE '%@gmail.com';
-- Mencari semua pelanggan pengguna Gmail
📊 Output / Hasil Query:
| nama_pelanggan | kota | |
|---|---|---|
| Rini Wulandari | rini.w@gmail.com | Surabaya |
| Bagas Pratama | bagasp99@gmail.com | Bandung |
| Sari Maharani | sari.maharani@gmail.com | Jakarta |
Pattern yang diawali dengan % seperti LIKE '%kata%' atau LIKE '%kata' tidak bisa memanfaatkan index — MySQL terpaksa melakukan full table scan. Untuk tabel kecil ini tidak masalah, tapi di tabel dengan jutaan baris, ini bisa sangat lambat. Solusi: gunakan MySQL FULLTEXT index untuk pencarian teks skala besar.
3. Kombinasi Wildcard dan NOT LIKE
Kekuatan LIKE makin terasa saat kamu mulai menggabungkan % dan _ dalam satu pola, atau menggunakan NOT LIKE untuk mengecualikan hasil. Ini seperti membangun filter pencarian yang makin presisi — layaknya fitur advanced search di marketplace.
-- Cari produk: diawali 1 karakter apapun, lalu 'aos'
SELECT nama_produk FROM produk
WHERE nama_produk LIKE '_aos%';
-- Cocok: "Kaos Polos", "Kaos Distro"
-- Cari kode promo: 'DISC' + tepat 2 karakter angka
SELECT kode_promo, diskon FROM promosi
WHERE kode_promo LIKE 'DISC__';
-- Cocok: "DISC10", "DISC25", "DISC50"
-- Semua produk yang namanya TIDAK mengandung kata 'gaming'
SELECT nama_produk, kategori, harga
FROM produk
WHERE nama_produk NOT LIKE '%gaming%';
-- Semua pelanggan yang emailnya bukan Outlook
SELECT nama_pelanggan, email
FROM pelanggan
WHERE email NOT LIKE '%@outlook.com'
AND email NOT LIKE '%@hotmail.com';
📊 Output NOT LIKE — Produk Tanpa Kata "gaming":
| nama_produk | kategori | harga |
|---|---|---|
| Kaos Polos Premium | Pakaian | Rp 89.000 |
| Tas Selempang Canvas | Tas | Rp 145.000 |
| Sepatu Sneakers Lokal | Sepatu | Rp 200.000 |
Kalau kamu perlu mencari karakter literal % atau _ di dalam data (misalnya mencari diskon "50%"), gunakan karakter escape backslash: LIKE '50\%'. Atau definisikan escape character sendiri: LIKE '50!%' ESCAPE '!'.
🚀 Panduan Praktikum Step-by-Step
Siapkan tabel pelanggan dan produk
Lanjutkan dari database toko_online artikel sebelumnya, atau buat ulang dengan script berikut.
CREATE TABLE pelanggan (
id_pelanggan INT PRIMARY KEY AUTO_INCREMENT,
nama_pelanggan VARCHAR(100),
email VARCHAR(150),
kota VARCHAR(50)
);
INSERT INTO pelanggan (nama_pelanggan, email, kota)
VALUES
('Rini Wulandari', 'rini.w@gmail.com', 'Surabaya'),
('Bagas Pratama', 'bagasp99@gmail.com', 'Bandung'),
('Sari Maharani', 'sari.maharani@gmail.com', 'Jakarta'),
('Dodi Firmansyah', 'dodi.f@outlook.com', 'Medan'),
('Lestari Putri', 'lestari@yahoo.co.id', 'Yogyakarta');
Uji wildcard % di berbagai posisi
-- Awalan: nama dimulai dengan 'S'
SELECT * FROM pelanggan WHERE nama_pelanggan LIKE 'S%';
-- Akhiran: email diakhiri '.id'
SELECT * FROM pelanggan WHERE email LIKE '%.id';
-- Keduanya: nama mengandung 'a' di tengah
SELECT * FROM pelanggan WHERE nama_pelanggan LIKE '%a%';
Uji wildcard _ untuk pola karakter spesifik
-- Kota dengan nama 4 huruf tepat
SELECT * FROM pelanggan
WHERE kota LIKE '____';
-- Cocok: "Solo", "Palu" (4 karakter)
-- Email dengan username min 3 karakter sebelum @
SELECT * FROM pelanggan
WHERE email LIKE '___%@%';
Kombinasikan LIKE dengan WHERE lain untuk filter presisi
-- Produk kategori Pakaian dengan nama mengandung 'premium'
SELECT nama_produk, harga
FROM produk
WHERE kategori = 'Pakaian'
AND nama_produk LIKE '%premium%'
AND harga BETWEEN 50000 AND 300000;
📋 Ringkasan Pola Wildcard LIKE MySQL
| Pola | Artinya | Contoh Cocok | Tidak Cocok |
|---|---|---|---|
| 'Kaos%' | Dimulai dengan "Kaos" | Kaos Polos, Kaos Distro | Celana Kaos |
| '%Pro' | Diakhiri dengan "Pro" | Laptop Pro, Headset Pro | Pro Camera X |
| '%premium%' | Mengandung "premium" | Kaos Premium, Premium X | Kaos Biasa |
| '_aos%' | 1 karakter + "aos" + bebas | Kaos, Taos Jacket | Jaos (2 karakter sebelum aos) |
| 'DISC__' | "DISC" + tepat 2 karakter | DISC10, DISC50 | DISC100, DISC5 |
| '%@gmail.com' | Diakhiri @gmail.com | user@gmail.com | user@yahoo.com |
Jika memungkinkan, gunakan pola awalan tanpa % seperti 'Kaos%' — ini bisa memanfaatkan index kolom dan jauh lebih cepat. Hindari '%kata%' di tabel besar tanpa FULLTEXT index.
Di aplikasi nyata, input pencarian pengguna selalu dibersihkan dulu (sanitized) sebelum dimasukkan ke query LIKE. Karakter % dan _ dalam input pengguna harus di-escape, dan gunakan prepared statement untuk mencegah SQL injection.
Pelajari cara mengurutkan hasil query secara ascending maupun descending, multi-kolom, dan ekspresi kustom.
No comments:
Post a Comment