Masalah:
Anda memiliki baris duplikat di tabel Anda, dengan hanya ID yang unik. Bagaimana Anda menemukan entri duplikat itu?
Contoh:
Basis data kami memiliki tabel bernama product
dengan data pada kolom berikut:id
, name
, dan category
.
id | nama | kategori |
---|---|---|
1 | steak | daging |
2 | kue | permen |
3 | d>steak | daging |
4 | babi | daging |
5 | kue | permen |
6 | kue | permen |
Mari temukan duplikat nama dan kategori produk. Anda dapat menemukan duplikat dengan mengelompokkan baris, menggunakan COUNT
fungsi agregat, dan menentukan HAVING
klausa yang digunakan untuk memfilter baris.
Solusi:
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
Kueri ini hanya mengembalikan rekaman duplikat—rekaman yang memiliki nama dan kategori produk yang sama:
nama | kategori |
---|---|
steak | daging |
kue | permen |
Ada dua produk duplikat di meja kami:steak dari kategori daging dan kue dari kategori manisan. Produk pertama diulang dua kali dalam tabel, sedangkan yang kedua muncul tiga kali.
Diskusi:
Untuk memilih nilai duplikat, Anda perlu membuat grup baris dengan nilai yang sama, lalu memilih grup dengan jumlah lebih dari satu. Anda dapat mencapainya dengan menggunakan GROUP BY
dan HAVING
klausa.
Langkah pertama adalah membuat grup record dengan nilai yang sama di semua kolom non-ID (dalam contoh kita, name
dan category
). Anda melakukan ini dengan GROUP BY
ayat. Setelah GROUP BY
kata kunci, Anda menempatkan nama kolom yang ingin Anda gunakan untuk pengelompokan. Kami mengecualikan id
kolom karena ini adalah kunci utama tabel kami; menurut definisi, setiap baris akan memiliki nilai yang berbeda di bawah kolom itu. Jika kami menyertakannya, maka kami tidak akan dapat mendeteksi duplikat!
Kami ingin mencari grup dengan lebih dari satu baris; grup tersebut harus berisi duplikat menurut definisi, selama kami telah mengelompokkan pada kolom yang benar. Untuk melakukan ini, kami menggunakan HAVING
ayat. Kondisi yang kita tentukan adalah jumlah elemen dalam grup—COUNT(id)
—harus lebih besar dari satu:COUNT(id) > 1
. Ingat bahwa HAVING
memungkinkan Anda untuk memfilter grup; WHERE
adalah untuk memfilter baris individual.