Cara Menghitung Jumlah Record pada MySQL dengan COUNT

| | MySQL (My Structured Query Language)
Cara Menghitung Jumlah Record pada MySQL dengan COUNT

Untuk menghitung jumlah record di MySQL, gunakan fungsi COUNT(). Fungsi ini dapat menghitung semua baris (COUNT(*)), hanya baris non-NULL (COUNT(kolom)), atau nilai unik (COUNT(DISTINCT kolom)), serta bisa dikombinasikan dengan WHERE, GROUP BY, HAVING, dan JOIN.

Fungsi COUNT() adalah aggregate function di MySQL yang mengembalikan jumlah baris dari sebuah query. Berbeda dengan SUM() yang menjumlahkan nilai kolom, COUNT() menghitung berapa banyak baris yang ada. Fungsi ini didukung sejak MySQL 3.23 dan tetap menjadi cara standar hingga MySQL 8.4.

Dalam tutorial ini, kita akan membahas 8 cara menggunakan COUNT() di MySQL, dari yang paling dasar sampai teknik lanjutan dengan filter, grouping, dan integrasi dengan PHP.

Persiapan Database

CREATE DATABASE toko_online;
USE toko_online;

CREATE TABLE produk (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nama_produk VARCHAR(100) NOT NULL,
    kategori VARCHAR(50) NOT NULL,
    harga INT NOT NULL,
    stok INT DEFAULT 0,
    status ENUM('aktif', 'nonaktif') DEFAULT 'aktif',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO produk (nama_produk, kategori, harga, stok, status) VALUES
('Laptop Asus VivoBook', 'Elektronik', 8500000, 15, 'aktif'),
('Mouse Logitech M185', 'Elektronik', 150000, 50, 'aktif'),
('Keyboard Mechanical', 'Elektronik', 450000, 30, 'aktif'),
('Kaos Polos Hitam', 'Pakaian', 85000, 100, 'aktif'),
('Kemeja Flannel', 'Pakaian', 175000, 40, 'aktif'),
('Celana Jeans', 'Pakaian', 250000, 25, 'nonaktif'),
('Mie Instan Goreng', 'Makanan', 3500, 500, 'aktif'),
('Kopi Sachet', 'Minuman', 2000, 300, 'aktif'),
('Teh Botol Sosro', 'Minuman', 5000, 200, 'aktif'),
('Monitor LG 24 inch', 'Elektronik', 2100000, 10, 'aktif');

Cara 1: COUNT(*) — Menghitung Semua Record

Cara paling dasar untuk menghitung jumlah record:

SELECT COUNT(*) AS total_produk FROM produk;

Hasil:

+--------------+
| total_produk |
+--------------+
|           10 |
+--------------+

COUNT(*) menghitung semua baris termasuk yang memiliki nilai NULL.

Apa Perbedaan COUNT(*) dan COUNT(kolom)?

Jika kamu ingin menghitung hanya baris yang memiliki nilai di kolom tertentu:

-- Hitung produk yang punya stok (stok tidak NULL)
SELECT COUNT(stok) AS produk_punya_stok FROM produk;

-- Hitung produk yang punya kategori
SELECT COUNT(kategori) AS produk_berkategori FROM produk;

Perbedaan COUNT(*) vs COUNT(kolom):

FungsiYang Dihitung
COUNT(*)Semua baris, termasuk yang NULL
COUNT(kolom)Hanya baris dimana kolom tersebut tidak NULL
COUNT(DISTINCT kolom)Hanya nilai unik yang tidak NULL

Bagaimana Cara Menghitung Record dengan Kondisi WHERE?

Menghitung record dengan kondisi tertentu:

-- Hitung produk yang aktif saja
SELECT COUNT(*) AS produk_aktif FROM produk WHERE status = 'aktif';

-- Hitung produk dengan harga di atas 100.000
SELECT COUNT(*) AS produk_mahal FROM produk WHERE harga > 100000;

-- Hitung produk elektronik
SELECT COUNT(*) AS produk_elektronik FROM produk WHERE kategori = 'Elektronik';

-- Hitung produk dengan stok lebih dari 20
SELECT COUNT(*) AS stok_banyak FROM produk WHERE stok > 20;

-- Hitung produk aktif DAN harga di bawah 500.000
SELECT COUNT(*) AS produk_murah_aktif FROM produk
WHERE status = 'aktif' AND harga < 500000;

Bagaimana Cara Menghitung Record per Kategori dengan GROUP BY?

Menghitung jumlah record untuk setiap kelompok:

-- Hitung jumlah produk per kategori
SELECT kategori, COUNT(*) AS jumlah_produk
FROM produk
GROUP BY kategori
ORDER BY jumlah_produk DESC;

Hasil:

+------------+---------------+
| kategori   | jumlah_produk |
+------------+---------------+
| Elektronik |             4 |
| Pakaian    |             3 |
| Minuman    |             2 |
| Makanan    |             1 |
+------------+---------------+

Contoh lain dengan kondisi:

-- Hitung produk aktif per kategori
SELECT kategori, COUNT(*) AS jumlah_aktif
FROM produk
WHERE status = 'aktif'
GROUP BY kategori;

-- Hitung total stok per kategori
SELECT kategori, COUNT(*) AS jumlah_produk, SUM(stok) AS total_stok
FROM produk
GROUP BY kategori;

Apa Perbedaan WHERE dan HAVING pada COUNT()?

HAVING digunakan untuk memfilter hasil setelah GROUP BY:

-- Tampilkan kategori yang punya lebih dari 2 produk
SELECT kategori, COUNT(*) AS jumlah_produk
FROM produk
GROUP BY kategori
HAVING jumlah_produk > 2;

-- Tampilkan kategori dengan total stok lebih dari 50
SELECT kategori, COUNT(*) AS jumlah_produk, SUM(stok) AS total_stok
FROM produk
GROUP BY kategori
HAVING total_stok > 50;

Perbedaan WHERE vs HAVING:

KlausaKapan Digunakan
WHEREFilter baris sebelum grouping
HAVINGFilter hasil setelah grouping

Bagaimana Cara Menggunakan COUNT DISTINCT untuk Nilai Unik?

-- Hitung berapa banyak kategori yang berbeda
SELECT COUNT(DISTINCT kategori) AS jumlah_kategori FROM produk;

-- Hitung berapa banyak status yang berbeda
SELECT COUNT(DISTINCT status) AS jumlah_status FROM produk;

Bagaimana Cara Menggunakan COUNT() dengan JOIN?

-- Tambahkan tabel pesanan
CREATE TABLE pesanan (
    id INT AUTO_INCREMENT PRIMARY KEY,
    produk_id INT NOT NULL,
    jumlah INT NOT NULL,
    tanggal DATE NOT NULL,
    FOREIGN KEY (produk_id) REFERENCES produk(id)
);

INSERT INTO pesanan (produk_id, jumlah, tanggal) VALUES
(1, 2, '2026-07-01'), (2, 5, '2026-07-01'),
(4, 3, '2026-07-02'), (7, 20, '2026-07-02'),
(1, 1, '2026-07-03'), (8, 10, '2026-07-03');

-- Hitung berapa kali setiap produk dipesan
SELECT p.nama_produk, COUNT(o.id) AS jumlah_pesanan
FROM produk p
LEFT JOIN pesanan o ON p.id = o.produk_id
GROUP BY p.id
ORDER BY jumlah_pesanan DESC;

-- Hitung produk yang belum pernah dipesan
SELECT p.nama_produk
FROM produk p
LEFT JOIN pesanan o ON p.id = o.produk_id
WHERE o.id IS NULL;

Bagaimana Cara Menggunakan COUNT() dengan Subquery?

-- Hitung produk yang harganya di atas rata-rata
SELECT COUNT(*) AS produk_di_atas_rata_rata
FROM produk
WHERE harga > (SELECT AVG(harga) FROM produk);

-- Hitung kategori yang punya produk dengan harga di atas 1 juta
SELECT COUNT(DISTINCT kategori) AS kategori_premium
FROM produk
WHERE harga > 1000000;

Bagaimana Cara Menggunakan COUNT() di PHP?

<?php
$pdo = new PDO('mysql:host=localhost;dbname=toko_online', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 1. Hitung total produk
$total = $pdo->query('SELECT COUNT(*) FROM produk')->fetchColumn();
echo "Total produk: $total";

// 2. Hitung produk aktif
$stmt = $pdo->prepare('SELECT COUNT(*) FROM produk WHERE status = ?');
$stmt->execute(['aktif']);
$aktif = $stmt->fetchColumn();
echo "Produk aktif: $aktif";

// 3. Hitung per kategori
$stmt = $pdo->query('SELECT kategori, COUNT(*) AS jumlah FROM produk GROUP BY kategori ORDER BY jumlah DESC');
$per_kategori = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($per_kategori as $row) {
    echo $row['kategori'] . ': ' . $row['jumlah'] . ' produk';
}

// 4. Hitung dengan filter dinamis
function hitungProduk($pdo, $kategori = '', $status = '', $harga_min = 0) {
    $where = [];
    $params = [];

    if ($kategori) {
        $where[] = 'kategori = ?';
        $params[] = $kategori;
    }
    if ($status) {
        $where[] = 'status = ?';
        $params[] = $status;
    }
    if ($harga_min > 0) {
        $where[] = 'harga >= ?';
        $params[] = $harga_min;
    }

    $sql = 'SELECT COUNT(*) FROM produk';
    if ($where) {
        $sql .= ' WHERE ' . implode(' AND ', $where);
    }

    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    return $stmt->fetchColumn();
}

echo hitungProduk($pdo, 'Elektronik', 'aktif'); // Produk elektronik aktif

Apa Saja Tips Performa untuk Query COUNT()?

1. Gunakan index untuk kolom yang sering di-filter

CREATE INDEX idx_status ON produk(status);
CREATE INDEX idx_kategori ON produk(kategori);

2. COUNT(*) vs COUNT(1) vs COUNT(kolom)

-- Ketiganya menghasilkan output yang sama untuk tabel tanpa NULL
SELECT COUNT(*) FROM produk;   -- Paling umum
SELECT COUNT(1) FROM produk;   -- Sama cepatnya
SELECT COUNT(id) FROM produk;  -- Hanya hitung yang id-nya tidak NULL

3. Untuk tabel sangat besar, gunakan perkiraan

-- Perkiraan jumlah baris (tidak akurat tapi sangat cepat)
SELECT TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'toko_online' AND TABLE_NAME = 'produk';

4. Cache hasil COUNT

Jika data jarang berubah, simpan hasil COUNT di variabel session atau cache:

// Cache selama 5 menit
$cache_key = 'total_produk';
$total = apcu_fetch($cache_key, $success);

if (!$success) {
    $total = $pdo->query('SELECT COUNT(*) FROM produk')->fetchColumn();
    apcu_store($cache_key, $total, 300); // 300 detik = 5 menit
}

Kesimpulan

Menghitung jumlah record di MySQL bisa dilakukan dengan berbagai cara:

  1. COUNT(*) — hitung semua baris
  2. COUNT(kolom) — hitung baris non-NULL
  3. COUNT(DISTINCT kolom) — hitung nilai unik
  4. COUNT() + WHERE — hitung dengan filter kondisi
  5. COUNT() + GROUP BY — hitung per kelompok
  6. COUNT() + HAVING — filter hasil grouping
  7. COUNT() + JOIN — hitung dari beberapa tabel

Pilih cara yang sesuai dengan kebutuhan. Untuk performa optimal, tambahkan index pada kolom yang sering digunakan dalam filter WHERE.


Sigit Nurhanafi avatar
Full-stack developer & technical writer. Berpengalaman di PHP, Laravel, NodeJS, MySQL, dan Python. Aktif menulis tutorial pemrograman dan maintaining open-source projects di PemburuKode sejak 2021.