Pernah daftar absen rapat, terus satu nama muncul tiga kali karena sistem dicatat berulang? Atau kamu tarik data kota dari tabel pelanggan, eh yang keluar "Jakarta, Jakarta, Surabaya, Jakarta, Bandung, Surabaya" — penuh duplikat yang bikin pusing. Nah, di sinilah DISTINCT MySQL jadi penyelamat.
Di artikel ke-13 dari seri Belajar Query SQL MySQL ini, kita akan tuntas membahas perintah SELECT DISTINCT — cara kerjanya, kapan dipakai, kombinasinya dengan klausa lain, dan jebakan-jebakan umum yang sering mengecoh pemula.
Kenapa penting? Karena dalam proyek nyata, data duplikat itu sangat umum — terutama saat kamu bergabung data dari beberapa tabel atau melakukan analisis. Kalau kamu tidak paham DISTINCT, laporan dan analisis kamu bisa jadi tidak akurat.
Yang akan kamu pelajari di artikel ini:
- Cara kerja
SELECT DISTINCTdan kapan harus memakainya - DISTINCT pada satu kolom vs banyak kolom
- Kombinasi DISTINCT dengan COUNT, WHERE, dan ORDER BY
- Perbedaan DISTINCT vs GROUP BY — kapan pakai yang mana
SELECT DISTINCT bekerja pada kombinasi nilai semua kolom yang disebutkan — bukan hanya satu kolom. Jadi SELECT DISTINCT kota, provinsi akan mengembalikan kombinasi unik kota+provinsi, bukan sekadar kota yang unik. Ini sumber kebingungan paling umum bagi pemula! Dan satu lagi: DISTINCT juga memperlakukan NULL sebagai satu nilai — jadi dua baris yang sama-sama NULL dianggap duplikat.
1. Apa Itu DISTINCT dan Bagaimana Cara Kerjanya?
Bayangkan kamu punya daftar belanja yang panjang dan ingin tahu merek apa saja yang ada — bukan berapa banyak tiap merek, tapi cukup daftarnya saja. Itulah fungsi DISTINCT: mengambil nilai-nilai unik dari sebuah kolom, membuang semua duplikat.
Mari kita setup tabel contoh untuk toko online kita. Perhatikan bahwa ada banyak data yang berulang — persis seperti data dunia nyata:
-- Tabel pesanan toko online dengan data duplikat CREATE TABLE pesanan ( id_pesanan INT PRIMARY KEY, nama_pelanggan VARCHAR(100), kota VARCHAR(50), kategori_produk VARCHAR(50), status_pesanan VARCHAR(30), total_harga DECIMAL(10,2) ); INSERT INTO pesanan VALUES (1, 'Andi', 'Jakarta', 'Elektronik', 'Selesai', 350000), (2, 'Budi', 'Surabaya', 'Fashion', 'Selesai', 175000), (3, 'Citra', 'Jakarta', 'Fashion', 'Proses', 220000), (4, 'Doni', 'Bandung', 'Elektronik', 'Selesai', 98000), (5, 'Eka', 'Jakarta', 'Makanan', 'Proses', 450000), (6, 'Andi', 'Jakarta', 'Makanan', 'Selesai', 125000), (7, 'Fajar', 'Surabaya', 'Elektronik', 'Batal', 670000), (8, 'Citra', 'Jakarta', 'Elektronik', 'Selesai', 310000), (9, 'Budi', 'Surabaya', 'Makanan', 'Proses', 88000), (10, 'Eka', 'Jakarta', 'Fashion', 'Selesai', 540000);
SELECT DISTINCT kolom1 [, kolom2, ...] -- kolom yang ingin diambil nilainya secara unik FROM nama_tabel -- dari tabel mana [WHERE kondisi] -- opsional: filter sebelum DISTINCT diterapkan [ORDER BY kolom]; -- opsional: urutkan hasilnya -- ⚠️ DISTINCT selalu diletakkan tepat setelah kata SELECT -- ⚠️ DISTINCT berlaku untuk SEMUA kolom yang disebutkan
Sekarang coba query paling sederhana — ambil daftar kota yang pernah memesan, tanpa duplikat:
-- Tanpa DISTINCT: semua kota muncul, termasuk duplikat SELECT kota FROM pesanan; -- Dengan DISTINCT: tiap kota hanya muncul sekali SELECT DISTINCT kota FROM pesanan ORDER BY kota;
๐ Perbandingan Hasil — Tanpa vs Dengan DISTINCT:
| kota |
|---|
| Jakarta |
| Surabaya |
| Jakarta ←duplikat |
| Bandung |
| Jakarta ←duplikat |
| Jakarta ←duplikat |
| Surabaya ←duplikat |
| Jakarta ←duplikat |
| Surabaya ←duplikat |
| Jakarta ←duplikat |
| 10 baris |
| kota |
|---|
| Bandung |
| Jakarta |
| Surabaya |
| 3 baris (unik semua!) |
Gunakan SELECT DISTINCT bersama ORDER BY untuk mendapatkan daftar nilai unik yang terurut rapi — sangat berguna untuk mengisi dropdown menu atau select box di aplikasi web.
2. DISTINCT MySQL pada Banyak Kolom — Hati-hati Jebakan!
Ini adalah bagian yang paling sering bikin bingung. Ketika kamu menulis SELECT DISTINCT kolom1, kolom2, MySQL tidak hanya membuat kolom1 unik — ia membuat kombinasi kolom1 dan kolom2 yang unik.
Analogi: bayangkan kamu punya daftar nama + kota. "Andi di Jakarta" dan "Andi di Surabaya" dianggap dua entri berbeda, meskipun namanya sama. DISTINCT melihat keseluruhan baris, bukan satu kolom saja.
-- DISTINCT pada dua kolom: kombinasi unik kota + kategori SELECT DISTINCT kota, kategori_produk FROM pesanan ORDER BY kota, kategori_produk; -- DISTINCT pada status pesanan SELECT DISTINCT status_pesanan FROM pesanan ORDER BY status_pesanan;
๐ Hasil — DISTINCT Dua Kolom (kota + kategori_produk):
| kota | kategori_produk | Keterangan |
|---|---|---|
| Bandung | Elektronik | Kombinasi unik |
| Jakarta | Elektronik | Kombinasi unik |
| Jakarta | Fashion | Kombinasi unik |
| Jakarta | Makanan | Kombinasi unik |
| Surabaya | Elektronik | Kombinasi unik |
| Surabaya | Fashion | Kombinasi unik |
| Surabaya | Makanan | Kombinasi unik |
| 7 kombinasi unik dari 10 baris data | ||
Banyak yang salah mengira SELECT DISTINCT nama, kota akan membuat kolom nama saja yang unik. Padahal MySQL melihat seluruh kombinasi baris. Kalau kamu ingin nilai unik dari satu kolom tertentu saja, cukup sebutkan satu kolom itu: SELECT DISTINCT nama.
3. Kombinasi Powerful: DISTINCT MySQL dengan COUNT, WHERE, dan ORDER BY
DISTINCT menjadi jauh lebih berguna saat dikombinasikan dengan fungsi dan klausa lain. Salah satu kombinasi favorit para developer adalah COUNT(DISTINCT kolom) — untuk menghitung berapa banyak nilai unik ada di sebuah kolom.
Misalnya: "berapa banyak pelanggan berbeda yang sudah memesan?" atau "berapa kota yang terjangkau layanan kita?" — pertanyaan-pertanyaan seperti ini dijawab oleh COUNT(DISTINCT).
-- Hitung jumlah pelanggan unik SELECT COUNT(DISTINCT nama_pelanggan) AS jumlah_pelanggan FROM pesanan; -- Hitung jumlah kota yang dilayani SELECT COUNT(DISTINCT kota) AS jumlah_kota FROM pesanan; -- DISTINCT + WHERE: kota yang melakukan pesanan dengan status 'Selesai' SELECT DISTINCT kota FROM pesanan WHERE status_pesanan = 'Selesai' ORDER BY kota; -- Kategori produk yang dipesan dari Jakarta SELECT DISTINCT kategori_produk FROM pesanan WHERE kota = 'Jakarta' ORDER BY kategori_produk;
๐ Hasil Query COUNT(DISTINCT) dan Kombinasinya:
COUNT(DISTINCT kolom) adalah cara paling efisien untuk menjawab pertanyaan bisnis seperti "berapa pelanggan aktif bulan ini?" atau "berapa produk berbeda yang terjual?". Fungsi ini sangat sering dipakai dalam query dashboard dan laporan analitik.
4. DISTINCT vs GROUP BY — Mana yang Lebih Tepat?
Pertanyaan klasik: "Bukankah GROUP BY juga bisa menghapus duplikat?" — Jawabannya: bisa, tapi dengan tujuan yang berbeda. Analoginya: keduanya seperti cara memilah kartu — DISTINCT sekadar membuang kartu ganda, GROUP BY menghitung sekaligus mengelompokkan.
-- DISTINCT: hanya mau daftar kota unik, itu saja SELECT DISTINCT kota FROM pesanan; -- GROUP BY: mau daftar kota PLUS informasi tambahan (jumlah pesanan) SELECT kota, COUNT(*) AS jumlah_pesanan FROM pesanan GROUP BY kota ORDER BY jumlah_pesanan DESC;
๐ Hasil — GROUP BY dengan Informasi Tambahan:
| kota | jumlah_pesanan |
|---|---|
| Jakarta | 6 |
| Surabaya | 3 |
| Bandung | 1 |
Dari sisi performa, GROUP BY dan DISTINCT seringkali menghasilkan execution plan yang sama di MySQL. Artinya tidak selalu ada perbedaan kecepatan. Pilih berdasarkan kebutuhan: kalau hanya butuh daftar unik → pakai DISTINCT; kalau butuh agregasi (SUM, COUNT, AVG per grup) → pakai GROUP BY.
๐งช Langkah Praktikum: Kuasai DISTINCT dari Nol
Jalankan script CREATE TABLE dan INSERT VALUES dari contoh di atas di MySQL Workbench atau phpMyAdmin. Pastikan data sudah masuk 10 baris.
Jalankan dua query ini bersamaan dan perhatikan perbedaan jumlah baris hasilnya:
SELECT nama_pelanggan FROM pesanan; -- 10 baris SELECT DISTINCT nama_pelanggan FROM pesanan; -- 5 baris
Perhatikan bagaimana kombinasi dua kolom mempengaruhi jumlah hasil:
SELECT DISTINCT nama_pelanggan, kota FROM pesanan ORDER BY nama_pelanggan;
Latihan penting: hitung metrics dasar toko online dengan satu query:
SELECT COUNT(DISTINCT nama_pelanggan) AS total_pelanggan, COUNT(DISTINCT kota) AS total_kota, COUNT(DISTINCT kategori_produk) AS total_kategori FROM pesanan;
Jalankan dua query berikut dan perhatikan kapan keduanya menghasilkan data yang sama, dan kapan tidak: SELECT DISTINCT kota FROM pesanan vs SELECT kota FROM pesanan GROUP BY kota. Hasilnya identik untuk satu kolom — tapi coba tambahkan COUNT(*) ke versi GROUP BY dan lihat perbedaannya!
๐ Tabel Perbandingan Lengkap
Ringkasan semua yang perlu kamu tahu tentang DISTINCT dan perbandingannya:
| Aspek | SELECT DISTINCT | GROUP BY |
|---|---|---|
| Tujuan utama | Menghilangkan duplikat | Mengelompokkan + agregasi |
| Bisa pakai COUNT, SUM? | Hanya COUNT(DISTINCT) | ✅ Ya, semua fungsi agregasi |
| Sintaks | SELECT DISTINCT kol |
GROUP BY kol |
| Kapan dipakai | Cukup butuh daftar unik | Butuh statistik per grup |
| Performa | Setara di kebanyakan kasus | Setara di kebanyakan kasus |
| Perlakuan NULL | NULL dianggap satu nilai unik | NULL dijadikan satu grup |
| Contoh use case | Isi dropdown kota, filter unik | Laporan penjualan per kota |
Kamu bisa pakai DISTINCT di dalam subquery untuk menyederhanakan logika. Misalnya: SELECT * FROM kota_tabel WHERE nama IN (SELECT DISTINCT kota FROM pesanan) — cara elegan untuk filter berdasarkan data dinamis.
Pada tabel dengan jutaan baris, DISTINCT bisa lambat karena harus membaca semua data dan menghapus duplikat. Pertimbangkan menambahkan INDEX pada kolom yang sering di-DISTINCT, atau gunakan teknik paginasi agar query tidak memberatkan server.
✅ Kesimpulan
- DISTINCT MySQL adalah cara paling mudah dan langsung untuk menghilangkan baris duplikat dari hasil query.
- Ketika dipakai pada beberapa kolom, DISTINCT bekerja pada kombinasi semua kolom — bukan hanya satu kolom saja.
- COUNT(DISTINCT kolom) adalah kombinasi powerful untuk menghitung berapa banyak nilai unik ada dalam sebuah kolom.
- Gunakan DISTINCT saat kamu hanya butuh daftar unik; gunakan GROUP BY saat butuh statistik per grup.
- DISTINCT juga memperlakukan NULL sebagai satu nilai — dua baris NULL dianggap duplikat dan hanya satu yang ditampilkan.
Satu kata, satu perintah, tapi dampaknya luar biasa. DISTINCT adalah salah satu alat paling sering dipakai dalam dunia nyata — dari mengisi dropdown di aplikasi web, sampai analisis data jutaan baris. Kuasai ini, dan query kamu langsung naik kelas! ๐
Pelajari cara mengurutkan data secara ascending dan descending, mengurutkan berdasarkan beberapa kolom sekaligus, serta tips mengoptimalkan ORDER BY untuk performa query yang lebih baik.
No comments:
Post a Comment