Solusi masuk untuk menghapus baris duplikat dari kumpulan hasil Anda adalah dengan memasukkan kata kunci yang berbeda dalam pernyataan pemilihan Anda. Ini memberi tahu mesin kueri untuk menghapus duplikat untuk menghasilkan kumpulan hasil di mana setiap baris unik. Tahukah Anda bahwa klausa grup menurut juga dapat digunakan untuk menghapus duplikat?
Kata Kunci Distinct dan Distinctrow
Kata kunci yang berbeda datang langsung setelah SELECT dalam pernyataan kueri dan menggantikan semua kata kunci opsional, yang merupakan default. Distinctrow adalah alias untuk yang berbeda dan menghasilkan hasil yang sama persis
SELECT [ALL | DISTINCT | DISTINCTROW ] select_expr [FROM table_references [WHERE where_condition]Untuk mengilustrasikan cara kerjanya, mari pilih beberapa data dari tabel berikut, yang berisi daftar buah dan warnanya
nama
warna
apel
merah
apel
hijau
apel
kuning
pisang
kuning
pisang
hijau
anggur
merah
anggur
putih
Kueri berikut akan mengambil semua nama buah dari tabel dan mencantumkannya dalam urutan abjad
SELECT name FROM fruits; _Tanpa informasi warna, kami memiliki kelipatan dari setiap jenis buah
nama
apel
apel
apel
pisang
pisang
anggur
anggur
Sekarang mari coba kueri lagi dengan kata kunci yang berbeda
SELECT DISTINCT name FROM fruits;Seperti yang diharapkan, kami sekarang hanya memiliki satu contoh dari setiap jenis buah
nama
apel
pisang
anggur
Andai saja selalu semudah itu. Pencarian Internet cepat pada frasa "sql menghilangkan duplikat" menunjukkan bahwa ada lebih banyak untuk menghapus nilai duplikat daripada memasukkan kata kunci yang berbeda ke dalam pernyataan SELECT Anda
Kapan Baris Duplikat Bukan Baris Duplikat
Satu masalah yang tidak dapat dipecahkan oleh kata kunci yang berbeda adalah terkadang menghapus duplikat menciptakan hasil yang menyesatkan. Perhatikan skenario berikut
Klien ingin membuat daftar karyawan mereka untuk menghasilkan beberapa statistik. Inilah beberapa SQL untuk melakukan itu
SELECT name, gender, salary FROM employees ORDER BY name;Anehnya, ini menghasilkan baris duplikat untuk "Kristen Ruegg"
Nama
jenis kelamin
gaji
Allan Smithie
m
4900
Barbara Breitenmoser
f
(BATAL)
Jon Simpson
m
4500
Kirsten Ruegg
f
5600
Kristen Ruegg
f
5600
Peter Jonson
m
5200
Ralph Teller
m
5100
Klien menjawab bahwa mereka tidak menginginkan duplikat, jadi pengembang menambahkan kata kunci berbeda yang dapat dipercaya ke pernyataan SELECT. Ini menghasilkan hasil yang diinginkan, kecuali untuk satu detail kecil. Ada dua karyawan dengan nama yang sama. Menambahkan kata kunci yang berbeda membuat hasil yang salah dengan menghapus baris yang valid. Menyertakan nomor_emp_id_unik ke daftar bidang menegaskan bahwa memang ada dua Kristen Rueggs
SELECT name, gender, salary, emp_id_number FROM employees ORDER BY name; _Inilah data yang dipermasalahkan yang menunjukkan emp_id_numbers unik
nama
jenis kelamin
gaji
emp_id_number
Kirsten Ruegg
f
5600
3462
Kristen Ruegg
f
5600
2223
Moral dari cerita ini adalah ini. Saat menggunakan kata kunci yang berbeda, pastikan Anda tidak secara tidak sengaja menghapus data yang valid
Membandingkan Distinct dengan Group By
Menggunakan perbedaan secara logis setara dengan menggunakan grup dengan semua kolom yang dipilih tanpa fungsi agregat. Untuk kueri seperti itu, kelompokkan dengan hanya menghasilkan daftar nilai pengelompokan yang berbeda. Saat menampilkan dan mengelompokkan berdasarkan satu kolom, kueri menghasilkan nilai berbeda di kolom tersebut. Namun, jika Anda menampilkan dan mengelompokkan menurut beberapa kolom, kueri akan menghasilkan kombinasi nilai yang berbeda di setiap kolom. Misalnya, kueri berikut menghasilkan kumpulan baris yang sama seperti yang dilakukan SELECT pertama kami
SELECT name FROM fruits GROUP BY name;Demikian pula, pernyataan berikut menghasilkan hasil yang sama seperti SELECT yang berbeda pada tabel karyawan
SELECT name, gender, salary FROM employees GROUP BY name; _Perbedaan antara yang berbeda dan yang dikelompokkan menurut adalah bahwa kelompok menurut menyebabkan pengurutan baris. Karena itu
SELECT name, gender, salary FROM employees GROUP BY name; _…sama dengan
SELECT DISTINCT name, gender, salary FROM employees ORDER BY name; _Menghitung Duplikat
Distinct dapat digunakan dengan fungsi COUNT() untuk menghitung berapa banyak nilai berbeda yang terdapat dalam kolom. COUNT(ekspresi berbeda) menghitung jumlah nilai non-NULL yang berbeda (unik) dari ekspresi yang diberikan. Ekspresi dapat berupa nama kolom untuk menghitung jumlah nilai non-NULL yang berbeda dalam kolom
Berikut data tabel karyawan selengkapnya
Indo
dept_id
jenis kelamin
nama
gaji
emp_id_number
1
2
m
Jon Simpson
4500
1234
2
4
f
Barbara Breitenmoser
(BATAL)
9999
3
3
f
Kirsten Ruegg
5600
3462
4
1
m
Ralph Teller
5100
6543
5
2
m
Peter Jonson
5200
9747
6
2
m
Allan Smithie
4900
6853
7
4
f
Kirsten Ruegg
5600
2223
8
3
f
Kirsten Ruegg
4400
2765
Menerapkan fungsi Hitung berbeda pada bidang nama menghasilkan enam nama unik
SELECT Count(DISTINCT name) FROM employees; _Hitung (nama BERBEDA)
6
Dimungkinkan juga untuk memberikan daftar ekspresi yang dipisahkan dengan koma. Dalam hal ini, COUNT() mengembalikan jumlah kombinasi nilai berbeda yang tidak mengandung nilai NULL. Kueri berikut menghitung jumlah baris berbeda yang tidak memiliki nama maupun gaji NULL
SELECT name FROM fruits; _0Hitung(DISTINCT nama, gaji)
6
Anda juga dapat mengelompokkan jumlah duplikat per grup menggunakan sedikit matematika sehubungan dengan klausa grup demi. Berikut kueri untuk menghitung nama ganda untuk setiap departemen
SELECT name FROM fruits; _1dept_id
nama rangkap
1
0
2
0
3
1
4
0
Kueri ini membantu Anda mengkarakterisasi tingkat duplikat, tetapi tidak menunjukkan kepada Anda nilai mana yang digandakan. Untuk melihat nama mana yang digandakan dalam tabel karyawan, gunakan kueri ringkasan yang menampilkan nilai non-unik beserta hitungannya
SELECT name FROM fruits; _2dept_id
nama
nama_hitung
2
Allan Smithie
1
4
Barbara Breitenmoser
1
2
Jon Simpson
1
3
Kirsten Ruegg
2
4
Kirsten Ruegg
1
2
Peter Jonson
1
1
Ralph Teller
1
Karena kami hanya tertarik pada duplikat, kami dapat memfilter yang lainnya menggunakan klausa HAVING. Ini seperti klausa WHERE, kecuali digunakan dengan group by untuk mempersempit hasil
SELECT name FROM fruits; _3Sekarang kita bisa melihat nama mana yang digandakan, serta berapa jumlahnya
dept_id
nama
nama_hitung
3
Kirsten Ruegg
2
Menampilkan Nilai Minimum atau Maksimum Per-Grup dalam Baris Duplikat
Seperti yang kita lihat di contoh terakhir, grup dengan klausa menyebabkan fungsi agregat diterapkan untuk setiap nilai unik dalam daftar bidang. Anda harus menyadari bahwa kolom yang tidak ada dalam daftar grup menurut bidang tidak harus berada pada baris yang sama dengan nilai agregat. Sebuah contoh pasti ada di sini. Kueri berikut menampilkan gaji tertinggi untuk setiap departemen
SELECT name FROM fruits; _4Tujuannya juga untuk menampilkan informasi tentang individu yang mendapatkan gaji tertinggi. Namun, bukan itu yang dikembalikan di sini
dept_id
nama
jenis kelamin
max_salary
1
Ralph Teller
m
5100
2
Jon Simpson
m
5200
3
Kirsten Ruegg
f
5600
4
Barbara Breitenmoser
f
5600
Masalahnya adalah gaji adalah satu-satunya bidang gabungan karena fungsi agregat Max() diterapkan padanya. Akibatnya, nama depan dan nilai jenis kelamin yang ditemui untuk setiap grup menurut bidang adalah yang ditampilkan. Melihat tabel, Anda akan melihat bahwa, sementara Ralph Teller adalah satu-satunya anggota departemen 1, Jon Simpson hanya memperoleh $4.500. Peter Jonson benar-benar pemilik perbedaan itu, tetapi mesin kueri memilih nama depan dan jenis kelamin yang ditemukan memiliki dept_id 2
Solusinya adalah menggabungkan hasil GROUP_BY dengan tabel asli menggunakan bidang yang dikelompokkan. Dalam hal ini, kami hanya memiliki satu bidang, dan itu adalah gaji
SELECT name FROM fruits; _5Sekarang bidang nama dan jenis kelamin menjadi milik penerima gaji terbesar
dept_id
nama
jenis kelamin
max_salary
1
Ralph Teller
m
5100
2
Peter Jonson
m
5200
3
Kirsten Ruegg
f
5600
4
Kirsten Ruegg
f
5600
Ada teknik lain yang tidak tercakup, seperti penggunaan tabel sementara dan SQL dinamis. Berikut adalah informasi yang lebih mendalam tentang cara menghapus rekaman duplikat. Artikel ini membahas klausa group by dan HAVING secara lebih rinci