stdsquare²
🎓 Kelas
stdsquare / materi / slides / pertemuan-12
Tema
Japan
Arcade
Dark Retro
Font
‹ Daftar slide Pertemuan 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.

PolaArtiContoh Cocok
'Baju%'Diawali "Baju"Baju Batik, Baju Koko
'%Baju%'Mengandung "Baju" di mana sajaSetelan 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.

LangkahPerhitungan (Query)Hasil Baris Tersisa
1. Data awal6 baris di tabel produk
6 baris
2. Saring nama LIKEWHERE nama_produk LIKE 'Baju%' → cocok 4 dari 6
4 baris
3. Tambah BETWEEN hargaAND harga BETWEEN 50000 AND 100000 → dari 4, yang harganya di rentang itu 2
2 baris
4. Hasil akhirBaju 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).

BentukMenghitung apaEfek NULL
COUNT(*)Semua baris, apa pun isinyaNULL tetap dihitung
COUNT(no_telp)Baris dengan kolom no_telp terisiNULL 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;
Baju • 75000Sepatu • 200000Baju • 60000Sepatu • 180000GROUP BYBaju → total 135.000Sepatu → total 380.0004 baris asli → 2 baris hasil (1 per 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.

LangkahPerhitunganNilai
1. Baris "Baju"(3 × Rp25.000) + (2 × Rp30.000) = Rp75.000 + Rp60.000
Rp135.000
2. Baris "Sepatu"(1 × Rp200.000) + (2 × Rp90.000) = Rp200.000 + Rp180.000
Rp380.000
3. Kelompokkan GROUP BY kategori2 kelompok terbentuk dari 5 baris awal
2 baris hasil
4. Grand total (cek silang)Rp135.000 + Rp380.000
Rp515.000
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.

1. FROM2. WHERE3. GROUP BY4. HAVING5. SELECT/ORDER BY
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

PerintahFungsiContoh
LIKECocokkan pola teks (% dan _)nama LIKE 'A%'
BETWEENRentang nilai/tanggal (inklusif)harga BETWEEN 1 AND 100
GROUP BYKelompokkan baris samaGROUP BY kategori
HAVINGSaring hasil kelompokHAVING SUM(x) > 100
SUM/AVG/COUNT/MAX/MINFungsi agregasiSUM(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.