‹ Daftar slidePertemuan 12: LIKE, BETWEEN, GROUP BY, dan agregasi
Program Studi Bisnis Digital • FEB
Sistem Database
Pertemuan 12 — LIKE, BETWEEN, GROUP BY, dan Agregasi
Menyaring data dengan pola teks dan rentang nilai, lalu meringkas ribuan baris jadi angka bisnis yang bermakna.
RPS MINGGU 13 • 2 × 50 MENIT
Tujuan Pembelajaran Hari Ini
Setelah pertemuan ini, Anda diharapkan mampu menulis query SQL untuk menyaring data dengan pola dan rentang, serta meringkas data per kelompok. Secara rinci:
Menyaring
LIKE & BETWEEN
Mencari baris berdasarkan pola teks (mis. nama diawali "A") dan rentang nilai/tanggal (mis. harga Rp 50.000–Rp 100.000).
Meringkas
GROUP BY & HAVING
Mengelompokkan baris berdasarkan kolom tertentu, menghitung agregat per kelompok, lalu menyaring hasil kelompok.
Alur besar semester: setelah ini Anda paham SELECT dasar (P9) sampai agregasi (P12) — fondasi sebelum masuk JOIN antar-tabel (P13–14).
Bagian 1 dari 4
Mengapa WHERE Saja Tidak Cukup?
Dunia nyata jarang butuh kecocokan persis — kita butuh pola dan rentang.
LIKE — Mencari Berdasarkan Pola Teks
Operator LIKE mencocokkan kolom teks dengan sebuah pola (pattern), bukan nilai persis. Pola ditulis dengan dua simbol wildcard (karakter pengganti):
Simbol %
%
Mewakili nol atau lebih karakter apa saja. Contoh: 'A%' = teks yang diawali huruf A, panjang bebas.
Simbol _
_
Mewakili tepat satu karakter apa saja. Contoh: 'B_ju' cocok dengan "Baju" tapi bukan "Bantalju".
SELECT nama_produk FROM produk
WHERE nama_produk LIKE 'Baju%';
-- hasil: "Baju Batik", "Baju Koko", "Baju Anak Motif Kartun", dst.
LIKE — Tiga Posisi Wildcard
Posisi simbol % menentukan di mana pola dicari dalam teks.
Pola
Arti
Contoh Cocok
'Baju%'
Diawali "Baju"
Baju Batik, Baju Koko
'%Baju%'
Mengandung "Baju" di mana saja
Setelan Baju Anak
'%Anak'
Diakhiri "Anak"
Sepatu Anak, Tas Anak
NOT LIKE '%Anak%'
TIDAK mengandung "Anak"
Kemeja Pria Slim Fit
LIKE tidak membedakan huruf besar/kecil di MySQL secara default (case-insensitive) — 'baju%' dan 'Baju%' hasilnya sama.
BETWEEN — Menyaring Rentang Nilai
Operator BETWEEN menyaring baris yang nilainya berada di dalam rentang tertentu, termasuk kedua batasnya (inclusive).
kolom BETWEEN nilai_bawah AND nilai_atas
SELECT nama_produk, harga FROM produk
WHERE harga BETWEEN 50000 AND 150000;
-- setara dengan:
-- WHERE harga >= 50000 AND harga <= 150000
BETWEEN juga berlaku untuk tanggal, mis. WHERE tgl_transaksi BETWEEN '2026-01-01' AND '2026-01-31' untuk transaksi Januari 2026.
Hitung dari Nol — Menyaring Data Produk
Tabel produk berisi 6 baris. Tugas: cari produk kategori "Baju" dengan harga Rp 50.000–Rp 100.000.
Langkah
Perhitungan (Query)
Hasil Baris Tersisa
1. Data awal
6 baris di tabel produk
6 baris
2. Saring nama LIKE
WHERE nama_produk LIKE 'Baju%' → cocok 4 dari 6
4 baris
3. Tambah BETWEEN harga
AND harga BETWEEN 50000 AND 100000 → dari 4, yang harganya di rentang itu 2
2 baris
4. Hasil akhir
Baju Koko (Rp 75.000), Baju Batik Anak (Rp 60.000)
2 produk
Query gabungan: WHERE nama_produk LIKE 'Baju%' AND harga BETWEEN 50000 AND 100000
Latihan Mandiri — Giliran Anda
Tabel pelanggan(id_pelanggan, nama, kota, tgl_daftar). Tulis query untuk soal berikut (5 menit, kerjakan di editor SQL Anda):
Soal A — Pola Teks
Tampilkan semua pelanggan yang namanya mengandung kata "Wati" di mana pun posisinya.
Soal B — Rentang Tanggal
Tampilkan pelanggan yang mendaftar antara 1 Maret 2026 sampai 31 Maret 2026.
Petunjuk: Soal A pakai LIKE '%...%', Soal B pakai BETWEEN '...' AND '...' pada kolom tanggal.
Bagian 2 dari 4
Dari Baris ke Angka Ringkasan
Fungsi agregasi mengubah banyak baris menjadi satu nilai yang bermakna.
Lima Fungsi Agregasi Dasar
Fungsi agregasi (aggregate function) meringkas sekumpulan baris menjadi satu nilai.
Total
SUM()
Menjumlahkan nilai numerik, mis. total omzet.
Rata-rata
AVG()
Rata-rata nilai numerik, mis. harga rata-rata produk.
Hitung baris
COUNT()
Jumlah baris yang cocok, mis. jumlah transaksi.
Nilai maksimum
MAX()
Nilai tertinggi dalam kolom, mis. harga produk termahal.
Nilai minimum
MIN()
Nilai terendah dalam kolom, mis. harga produk termurah.
COUNT(*) vs COUNT(kolom) — Beda Penting
Dua bentuk COUNT terlihat mirip tapi bisa menghasilkan angka berbeda kalau ada nilai kosong (NULL — sel yang belum diisi data).
Bentuk
Menghitung apa
Efek NULL
COUNT(*)
Semua baris, apa pun isinya
NULL tetap dihitung
COUNT(no_telp)
Baris dengan kolom no_telp terisi
NULL tidak dihitung
Contoh: 10 pelanggan, 2 belum isi nomor telepon (NULL). COUNT(*) = 10, tapi COUNT(no_telp) = 8.
Agregasi Tanpa Pengelompokan
Tanpa GROUP BY, fungsi agregasi meringkas seluruh tabel (atau seluruh hasil WHERE) jadi satu baris.
SELECT COUNT(*) AS jumlah_transaksi,
SUM(total_bayar) AS total_omzet,
AVG(total_bayar) AS rata_rata_transaksi
FROM transaksi
WHERE tgl_transaksi BETWEEN '2026-06-01' AND '2026-06-30';
Hasil hanya satu baris: jumlah transaksi, total omzet, dan rata-rata — semuanya untuk periode Juni 2026 saja karena disaring WHERE dulu.
Bagian 3 dari 4
GROUP BY — Meringkas per Kelompok
Bukan satu angka untuk semua data, tapi satu angka untuk TIAP kategori.
GROUP BY — Cara Kerja
GROUP BY mengelompokkan baris yang punya nilai sama di kolom tertentu, lalu fungsi agregasi dihitung per kelompok.
SELECT kategori, SUM(harga) AS total_harga, COUNT(*) AS jumlah_produk
FROM produk
GROUP BY kategori;
Aturan Penting: Kolom di SELECT Harus "Aman"
Saat pakai GROUP BY, kolom di SELECT HANYA boleh: (1) kolom yang di-GROUP BY, atau (2) hasil fungsi agregasi.
Benar
SELECT kategori, SUM(harga)
FROM produk
GROUP BY kategori;
Salah — Error
SELECT kategori, nama_produk, SUM(harga)
FROM produk
GROUP BY kategori;
-- nama_produk ambigu: produk mana?
nama_produk tidak boleh muncul karena tiap kelompok "kategori" berisi banyak nama produk berbeda — database tidak tahu nama mana yang harus ditampilkan.
Hitung dari Nol — Total Omzet per Kategori
Tabel transaksi(kategori, jumlah, harga_satuan) punya 5 baris. Hitung total omzet (jumlah × harga_satuan) per kategori.
SELECT kategori, SUM(jumlah*harga_satuan) AS omzet FROM transaksi GROUP BY kategori;
HAVING — Menyaring Hasil Kelompok
HAVING menyaring baris SETELAH GROUP BY dan agregasi selesai — berbeda dengan WHERE yang menyaring SEBELUM pengelompokan.
SELECT kategori, SUM(jumlah*harga_satuan) AS omzet
FROM transaksi
GROUP BY kategori
HAVING SUM(jumlah*harga_satuan) > 150000;
HAVING tidak bisa dipakai sendirian tanpa GROUP BY, dan HAVING tidak bisa diganti WHERE karena WHERE tidak mengenal hasil fungsi agregasi (belum dihitung saat WHERE berjalan).
Urutan Eksekusi Query Lengkap
SQL ditulis dengan urutan kata kunci tertentu, tapi database mengeksekusi dalam urutan logis berbeda.
Menyaring baris mentah → WHERE (tahap 2). Menyaring hasil kelompok → HAVING (tahap 4, setelah agregasi dihitung).
Bagian 4 dari 4
Merangkai Semua — Studi Kasus
LIKE, BETWEEN, GROUP BY, dan HAVING dalam satu query bisnis nyata.
Alat Bantu — Simulasi GROUP BY Interaktif
Coba ubah kolom pengelompokan dan lihat bagaimana baris data "mengelompok" secara visual dan langsung dihitung ulang.
Studi Kasus — Laporan Kategori Populer
Tugas: dari tabel transaksi(nama_produk, kategori, tgl_transaksi, jumlah, harga_satuan), cari kategori dengan nama produk mengandung "Elektronik", periode Mei 2026, yang omzetnya di atas Rp1.000.000.
SELECT kategori, SUM(jumlah * harga_satuan) AS total_omzet
FROM transaksi
WHERE nama_produk LIKE '%Elektronik%'
AND tgl_transaksi BETWEEN '2026-05-01' AND '2026-05-31'
GROUP BY kategori
HAVING SUM(jumlah * harga_satuan) > 1000000
ORDER BY total_omzet DESC;
Urutan klausa BAKU: SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY. Tertukar urutan = error sintaks.
Kesalahan Umum yang Sering Terjadi
Kesalahan
Lupa tanda kutip pada pola LIKE
Kolom non-agregat di SELECT tanpa ada di GROUP BY
Pakai WHERE untuk syarat hasil agregasi
Urutan klausa tertukar (mis. GROUP BY sebelum WHERE)
Perbaikan
Selalu apit pola dengan '...'
Masukkan kolom itu ke GROUP BY, atau bungkus dengan agregasi
Ganti jadi HAVING
Ikuti urutan baku: WHERE → GROUP BY → HAVING
Rangkuman — Cheat Sheet
Perintah
Fungsi
Contoh
LIKE
Cocokkan pola teks (% dan _)
nama LIKE 'A%'
BETWEEN
Rentang nilai/tanggal (inklusif)
harga BETWEEN 1 AND 100
GROUP BY
Kelompokkan baris sama
GROUP BY kategori
HAVING
Saring hasil kelompok
HAVING SUM(x) > 100
SUM/AVG/COUNT/MAX/MIN
Fungsi agregasi
SUM(harga)
Urutan eksekusi wajib diingat: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY.
Penutup — Persiapan Pertemuan Berikutnya
Minggu Depan
Kita masuk ke INNER dan OUTER JOIN — menggabungkan dua tabel atau lebih menjadi satu hasil query, misalnya menggabungkan tabel pelanggan dengan tabel transaksi.
Tugas Sebelum Pertemuan Berikut
3 Query
Latihan mandiri: buat 3 query kombinasi LIKE/BETWEEN/GROUP BY/HAVING dari dataset transaksi yang dibagikan di LMS.
Bawa laptop dengan XAMPP/MySQL Workbench aktif di pertemuan berikutnya untuk praktik JOIN langsung.