Menu

DISTINCT di SQLite: Menghapus Duplikat dari Query SELECT

Cara kerja SELECT DISTINCT di SQLite: satu kolom, banyak kolom, penanganan NULL, COUNT(DISTINCT), dan kapan GROUP BY adalah pilihan yang lebih baik.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

DISTINCT Menghapus Baris Duplikat

Secara bawaan, SELECT mengembalikan setiap baris yang cocok, termasuk duplikatnya. DISTINCT menyuruh SQLite melebur baris yang identik di semua kolom yang kamu pilih, sehingga setiap kombinasi unik hanya muncul sekali.

Lima baris masuk, tiga baris keluar. SQLite melihat kolom customer, membuang nilai yang berulang, lalu mengembalikan satu baris untuk setiap nilai unik. Urutannya tidak dijamin, jadi tambahkan ORDER BY kalau urutan itu penting bagimu.

DISTINCT Berlaku untuk Seluruh Daftar Select

Hal ini sering menjebak orang. DISTINCT tidak memilih satu kolom untuk dihapus duplikatnya; ia menghapus duplikat seluruh baris berdasarkan setiap kolom yang kamu pilih.

Setiap pasangan (customer, country) yang unik muncul sekali. Kalau customer yang sama muncul dengan dua negara berbeda, kamu akan melihat kedua barisnya, karena bagi SQLite itu bukan duplikat.

Tidak ada sintaks DISTINCT(customer) yang mengabaikan kolom lain. Tanda kurungnya terlihat menggoda, tapi SELECT DISTINCT(customer), country di-parse sama seperti SELECT DISTINCT customer, country: tanda kurung itu hanya mengelompokkan sebuah ekspresi. Kalau kamu benar-benar ingin satu baris per customer dengan negara yang dipilih, itu tugas GROUP BY ditambah fungsi agregat.

COUNT(DISTINCT col)

Kebutuhan yang umum: berapa banyak nilai unik di sebuah kolom? COUNT(*) menghitung baris, COUNT(col) menghitung nilai yang bukan NULL, dan COUNT(DISTINCT col) menghitung nilai unik yang bukan NULL.

Lima pesanan, tiga customer unik, tiga negara unik. COUNT(DISTINCT ...) adalah bentuk agregat DISTINCT yang paling berguna, dan kamu akan memakainya setiap kali ingin menghitung "berapa banyak hal berbeda yang muncul."

Perhatikan bahwa SQLite hanya mengizinkan satu kolom di dalam COUNT(DISTINCT ...). Untuk menghitung kombinasi unik dari beberapa kolom, bungkus kolom-kolom itu dalam subquery: SELECT COUNT(*) FROM (SELECT DISTINCT a, b FROM t).

Cara DISTINCT Memperlakukan NULL

NULL punya reputasi aneh di SQL karena NULL = NULL menghasilkan NULL, bukan TRUE. Tapi DISTINCT membuat pengecualian khusus: untuk menghapus duplikat, semua NULL dianggap sama satu sama lain.

Tiga baris dikembalikan: 'ada@example.com', 'dan@example.com', dan satu NULL. Ketiga email NULL dilebur menjadi satu. Aturan yang sama berlaku untuk GROUP BY dan operasi himpunan seperti UNION, jadi berguna untuk diingat saat kamu mencari tahu "kenapa baris NULL itu muncul sekali, bukan tiga kali?"

DISTINCT Berjalan Sebelum ORDER BY dan LIMIT

Klausa dalam SELECT mengikuti urutan logis: FROM → WHERE → GROUP BY → HAVING → SELECT/DISTINCT → ORDER BY → LIMIT. Jadi DISTINCT menyaring duplikat lebih dulu, lalu ORDER BY mengurutkan yang tersisa, lalu LIMIT memangkasnya.

WHERE menyisakan empat baris, DISTINCT melebur duplikat milik Boris, ORDER BY mengurutkan secara alfabetis, dan LIMIT mengembalikan dua yang pertama. Layak ditelusuri sekali: kebingungan soal urutan hasil biasanya muncul karena lupa langkah mana yang terjadi kapan.

DISTINCT vs GROUP BY

Kalau hanya untuk menghapus duplikat, kedua query ini mengembalikan baris yang sama:

Hasilnya sama. Bedanya ada di apa yang bisa kamu lakukan selanjutnya:

  • DISTINCT untuk "beri saya baris yang unik", tidak lebih.
  • GROUP BY untuk "kelompokkan baris dan hitung sesuatu per kelompok": COUNT(*), SUM(amount), MAX(created_at), dan seterusnya.

Kalau kamu memakai DISTINCT lalu sadar bahwa kamu juga butuh total per customer, itulah tanda untuk beralih ke GROUP BY:

Satu baris per customer, dengan agregat yang kamu inginkan. DISTINCT tidak bisa melakukan ini, karena ia tidak punya cara untuk menyatakan "satu baris per kelompok ditambah jumlahnya."

Beberapa Hal yang Perlu Diwaspadai

  • Performa. DISTINCT biasanya mengharuskan SQLite mengurutkan atau melakukan hash pada baris untuk menemukan duplikat. Pada hasil query yang besar, index pada kolom yang dihapus duplikatnya membantu. Kalau kamu menjalankan SELECT DISTINCT pada setiap kolom dari tabel yang lebar, tanyakan apakah kamu benar-benar butuh semua kolom itu.
  • DISTINCT * jarang dipakai. Sintaks ini sah, SELECT DISTINCT * FROM t menghapus duplikat seluruh baris, tapi kalau tabelmu punya primary key, setiap baris sudah unik, jadi ini tidak melakukan apa pun yang berguna.
  • Jangan tertukar dengan UNIQUE. UNIQUE adalah constraint pada tabel yang mencegah nilai duplikat dimasukkan sejak awal. DISTINCT adalah filter saat query yang menyembunyikan duplikat di hasil. Alatnya berbeda, tugasnya berbeda.

Berikutnya: Ekspresi CASE

Begitu kamu bisa membentuk baris hasil dengan SELECT, WHERE, ORDER BY, dan DISTINCT, langkah berikutnya adalah logika percabangan di dalam query. Ekspresi CASE memungkinkanmu mengembalikan nilai yang berbeda berdasarkan kondisi, padanan SQL untuk rangkaian if/else, dan halaman berikutnya membahasnya.

Pertanyaan yang sering diajukan

Bagaimana cara kerja SELECT DISTINCT di SQLite?

SELECT DISTINCT menghapus baris duplikat dari hasil query. SQLite membandingkan setiap kolom di daftar select dan menyimpan satu baris untuk setiap kombinasi yang unik. Ia diterapkan setelah WHERE dan JOIN, tapi sebelum ORDER BY dan LIMIT.

Bisakah saya memakai DISTINCT pada banyak kolom di SQLite?

Bisa. DISTINCT selalu berlaku untuk seluruh daftar select, bukan satu kolom saja. SELECT DISTINCT city, country FROM users mengembalikan setiap pasangan (city, country) yang unik. Tidak ada sintaks DISTINCT(city) yang mengabaikan kolom lain; kalau kamu butuh itu, pakai GROUP BY dengan fungsi agregat.

Bagaimana DISTINCT menangani nilai NULL di SQLite?

DISTINCT menganggap NULL sama dengan NULL lain untuk keperluan menghapus duplikat, jadi beberapa baris dengan NULL dilebur menjadi satu. Ini berbeda dengan cara kerja = di klausa WHERE, tempat NULL = NULL bernilai tidak diketahui. Ini aturan khusus hanya untuk DISTINCT, GROUP BY, dan UNION.

Apa bedanya DISTINCT dan GROUP BY di SQLite?

Kalau hanya untuk menghapus duplikat, SELECT DISTINCT col dan SELECT col FROM t GROUP BY col menghasilkan hasil yang sama persis. Bedanya ada di tujuan: pakai DISTINCT kalau kamu hanya ingin baris yang unik, dan GROUP BY kalau kamu juga ingin menghitung agregat seperti COUNT(*) atau SUM(amount) per kelompok.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai