DISTINCT SQL: Cara Ambil Nilai Unik Tanpa Duplikat
TL;DR
DISTINCT adalah keyword SQL yang buang baris duplikat dari hasil query, ditulis langsung setelah SELECT. Sintaksnya SELECT DISTINCT nama_kolom FROM nama_tabel. Kalau kamu pilih beberapa kolom, DISTINCT ngecek kombinasi seluruh kolom itu — bukan tiap kolom sendiri-sendiri. Buat ngitung berapa banyak nilai unik, pakai COUNT(DISTINCT nama_kolom).
DISTINCT adalah keyword SQL yang buang baris kembar dari hasil query. Ditulis langsung setelah SELECT, dan itu doang yang perlu kamu ketik.
Gampang di kasus satu kolom. Mulai bikin bingung begitu kamu pilih dua kolom atau lebih — dan di situ orang paling sering ketipu.
Contoh di sini pakai tabel pelanggan toko_berkah: 8 baris, dengan kolom kota dan kanal jualan (Tokopedia, Shopee, WhatsApp).
Apa itu DISTINCT di SQL?
DISTINCT adalah keyword yang nyuruh database ngeluarin cuma baris yang unik di hasil query. Baris yang isinya persis sama bakal dibuang, sisain satu.
SELECT DISTINCT nama_kolom
FROM nama_tabel;
Posisinya selalu tepat setelah SELECT, sebelum daftar kolom. Gak bisa ditaruh di tengah-tengah.
Contoh langsung. Tabel pelanggan punya 8 baris, tapi cuma ada 3 kota:
SELECT DISTINCT kota
FROM pelanggan
ORDER BY kota;
| kota |
|---|
| Bandung |
| Semarang |
| Surabaya |
Delapan baris jadi tiga. Definisi resmi klausanya ada di dokumentasi SELECT PostgreSQL.
Gimana DISTINCT kerja di banyak kolom?
Ini bagian yang paling sering disalahpahami. DISTINCT gak berlaku per kolom — dia ngecek kombinasi seluruh kolom yang kamu tulis di SELECT.
SELECT DISTINCT kota, kanal
FROM pelanggan
ORDER BY kota, kanal;
| kota | kanal |
|---|---|
| Bandung | NULL |
| Bandung | Shopee |
| Bandung | Tokopedia |
| Semarang | |
| Surabaya | Shopee |
| Surabaya |
Bandung muncul tiga kali. Bukan bug — tiga barisnya punya kanal beda, jadi kombinasinya emang unik.
Sekarang jebakan yang bikin banyak orang mikir DISTINCT rusak:
SELECT DISTINCT kota, nama_pelanggan
FROM pelanggan;
Hasil: 8 baris — sama persis kayak tanpa DISTINCT
Tiap nama pelanggan beda, jadi tiap kombinasi kota+nama juga unik. DISTINCT tetap jalan, cuma emang gak ada yang bisa dibuang.
Kalau kamu mau daftar kota unik, tulis kolom kota doang. Titik.
Gimana cara hitung nilai unik pakai COUNT(DISTINCT)?
Buat tau berapa banyak nilai uniknya, bungkus pakai COUNT:
SELECT COUNT(*) AS total_pelanggan,
COUNT(DISTINCT kota) AS jumlah_kota,
COUNT(kanal) AS kanal_terisi,
COUNT(DISTINCT kanal) AS jumlah_kanal
FROM pelanggan;
Hasil: 8 | 3 | 7 | 3
Perhatiin kolom ketiga. COUNT(kanal) ngasih 7, bukan 8 — Lia Anggraini kanal-nya NULL, dan COUNT di kolom gak ngitung NULL.
Ini beda penting yang bikin angka laporan sering gak nyambung:
SELECT DISTINCT kanal→ NULL muncul sebagai satu barisCOUNT(DISTINCT kanal)→ NULL gak diitung sama sekali
Perilaku NULL yang bikin kepala pusing ini aku bahas lebih dalam di glosarium NULL.
Argumen COUNT lengkapnya ada di halaman fungsi COUNT.
Apa bedanya DISTINCT dan GROUP BY?
Dua query ini kasih hasil persis sama:
SELECT DISTINCT kota FROM pelanggan;
SELECT kota FROM pelanggan GROUP BY kota;
Di PostgreSQL dan MySQL, rencana eksekusinya pun mirip. Jadi soal kecepatan, hampir gak ada bedanya.
| Hal | DISTINCT | GROUP BY |
|---|---|---|
| Tujuan utama | Buang baris kembar | Grupin baris buat dihitung |
| Bisa pakai SUM / COUNT per grup? | Gak | Bisa |
| Bisa disaring pakai HAVING? | Gak | Bisa |
| Panjang query | Lebih pendek | Sedikit lebih panjang |
Aturan yang aku pakai: butuh daftar nilai unik doang, pakai DISTINCT — maksudnya lebih kebaca. Butuh hitungan per grup, pakai GROUP BY.
Contoh kasus: pelanggan aktif toko_berkah
Bu Sari punya 8 pelanggan terdaftar. Pertanyaannya: berapa yang beneran belanja Januari ini?
SELECT COUNT(DISTINCT id_pelanggan) AS pelanggan_aktif
FROM transaksi;
Hasil: 4
Empat. Dari 8 pelanggan terdaftar, cuma separuh yang transaksi — padahal ada 8 transaksi tercatat.
Kalau tadi dia pakai COUNT(*), hasilnya 8 dan dia bakal ngira semua pelanggannya aktif. Beda satu keyword, beda kesimpulan bisnis.
Lanjut ke pertanyaan yang lebih berguna: kota mana yang pelanggannya balik lagi?
SELECT p.kota,
COUNT(DISTINCT t.id_pelanggan) AS pembeli_unik,
COUNT(t.id_transaksi) AS jumlah_transaksi
FROM pelanggan p
JOIN transaksi t ON p.id_pelanggan = t.id_pelanggan
GROUP BY p.kota
ORDER BY pembeli_unik DESC;
| kota | pembeli_unik | jumlah_transaksi |
|---|---|---|
| Bandung | 3 | 5 |
| Surabaya | 2 | 3 |
Bandung: 3 pembeli bikin 5 transaksi — rata-rata 1,67 transaksi per orang. Wati sendiri belanja 3 kali dalam 2 minggu.
Semarang nol. Bagas daftar tapi belum pernah beli. Itu satu nama yang layak di-follow up.
Angka "pembeli unik" versus "jumlah transaksi" ini yang bikin kamu bisa bedain: tokonya rame karena banyak orang baru, atau karena beberapa orang yang belanja terus.
Kesalahan umum pakai DISTINCT
1. Nempelin DISTINCT buat nutupin JOIN yang salah
Hasil JOIN dobel-dobel, terus kamu tambah DISTINCT dan masalahnya "hilang". Padahal duplikatnya muncul karena kondisi JOIN kamu kurang ketat. DISTINCT cuma nutupin gejalanya, dan di data yang lebih besar hasilnya bisa tetep salah.
2. Ngira DISTINCT cuma ngefek ke kolom pertama
SELECT DISTINCT kota, id_pelanggan gak bakal ngasih kamu daftar kota unik. Selama ada kolom yang nilainya beda per baris, gak ada yang bisa dibuang.
3. Lupa NULL diperlakukan beda di COUNT
COUNT(DISTINCT kanal) ngasih 3, tapi SELECT DISTINCT kanal ngasih 4 baris (termasuk NULL). Waktu rekonsiliasi laporan, selisih 1 ini yang bikin orang ngecek berjam-jam.
4. Pakai DISTINCT di tabel jutaan baris tanpa mikir
Buat buang duplikat, database harus ngurutin atau nge-hash semua hasil. Di tabel gede, ini makan memori. Kalau kamu cuma butuh cek "kota apa aja yang ada", saring dulu pakai WHERE biar barisnya berkurang sebelum DISTINCT jalan.
5. Nulis DISTINCT kayak fungsi
SELECT DISTINCT(kota), kanal FROM pelanggan; keliatannya kayak DISTINCT cuma berlaku ke kota. Padahal kurungnya cuma dianggap kurung biasa — DISTINCT tetap kena semua kolom. Query-nya jalan, tapi maksud kamu dan maksud database beda.
FAQ soal DISTINCT SQL
DISTINCT bisa dipakai bareng WHERE?
Bisa, dan urutannya WHERE duluan. Database nyaring baris dulu, baru buang duplikat dari sisanya. Ini juga cara bikin DISTINCT lebih cepat — makin sedikit baris yang masuk, makin ringan kerjaannya.
COUNT(DISTINCT) bisa di beberapa kolom sekaligus?
Di MySQL bisa langsung: COUNT(DISTINCT kota, kanal). Di PostgreSQL pakai tuple: COUNT(DISTINCT (kota, kanal)). SQL Server gak dukung, jadi kamu harus gabung kolomnya jadi satu teks atau bungkus jadi subquery.
Ada gak keyword kebalikan DISTINCT?
Ada, namanya ALL — dan itu default-nya. SELECT ALL kota sama persis kayak SELECT kota. Hampir gak ada yang nulis ALL secara eksplisit, tapi bagus buat tau kalau ketemu di query orang lain.
DISTINCT ngaruh ke ORDER BY?
Ngaruh. Kolom yang dipakai di ORDER BY harus ikut muncul di SELECT waktu kamu pakai DISTINCT. SELECT DISTINCT kota FROM pelanggan ORDER BY nama_pelanggan bakal error, soalnya nama_pelanggan udah gak ada lagi di hasil.
Ringkasnya
DISTINCT buang baris kembar, dan dia lihat semua kolom yang kamu SELECT — bukan cuma yang pertama.
COUNT(DISTINCT kolom) itu senjata paling kepakai di laporan bisnis: berapa pelanggan unik, berapa produk unik, berapa kota unik. Angka yang beda jauh dari sekadar COUNT(*).
Kalau kamu nempelin DISTINCT buat ngilangin baris dobel hasil JOIN, berhenti dulu. Yang rusak JOIN-nya, bukan datanya.
Coba jalanin SELECT COUNT(*) dan SELECT COUNT(DISTINCT id_pelanggan) di tabel transaksi kerjaan kamu. Selisihnya sering bikin kaget. Buat ngerapiin dasar query-nya, mampir ke panduan SELECT SQL atau alias SQL.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel Terkait
7 SQL Client Gratis Terbaik buat Analis Data (2026)
Nggak perlu bayar buat nulis query. Ini 7 SQL client gratis yang beneran dipakai analis, plus kelebihan dan kekurangannya masing-masing.
SQL Style Guide: Cara Nulis Query yang Enak Dibaca Tim
Sepuluh aturan SQL style guide yang bikin query kamu kebaca sama tim — dan sama kamu sendiri 6 bulan lagi. Lengkap dengan contoh sebelum-sesudah.
Take-Home Test SQL Data Analyst: Contoh Soal + Cara Ngerjainnya
Contoh soal take-home test SQL yang beneran dipakai perusahaan, dikerjain step by step — dari baca soal, nulis query, sampai nyusun insight yang bikin recruiter nengok.