Pada Tutorial Belajar MySQL kali ini kita akan membahas tentang query DISTINCT. Query ini bisa digunakan untuk menghapus atau mengeliminasi duplikasi dari hasil tampilan SELECT.
Sama seperti query AS, ORDER BY, dan LIMIT, query DISTINCT ini digunakan sebagai tambahan dari query utamanya, yakni SELECT.
Mempersiapkan Tabel Sample: daftar_dosen
Dikarenakan keperluan contoh tabel, saya akan mengupdate tabel daftar_dosen dengan data yang baru. Isi tabel daftar_dosen sekarang adalah:
Tabel daftar_dosen ver.2
NIP | Nama Dosen | No HP | Alamat |
---|---|---|---|
0160436012 | Sabrina Sari | 0812349900 | Pekanbaru |
0260432002 | Maya Ari Putri | 0812342342 | Palembang |
0275430005 | Susi Indriani | 0812656532 | Bogor |
0480432066 | Tia Santrini | 0812451177 | Padang |
0576431001 | M. Siddiq | 0812979005 | Jakarta |
0770435006 | Rubin Hadi | 0812567678 | Papua |
0869437003 | Mustalifah | 0812338877 | Aceh |
1080432007 | Arif Budiman | 0812456345 | Makasar |
0785531001 | Siswanto | 0852878006 | Padang |
0867221006 | Rudi Arwana | 0823987598 | Jakarta |
0173551078 | Aria Sulistya | 0880743523 | Jakarta |
0360432014 | Suci Syuhada | 0812341122 | Palembang |
Jika anda ingin memakai data tabel yang sama, silahkan input ke dalam tabel_daftar dosen secara manual, atau bisa juga menggunakan query LOAD DATA INFILE di bawah ini. Untuk file txt dapat diperoleh dari sample data tabel dari link berikut: daftar_dosen ver.2.
mysql> TRUNCATE daftar_dosen; Query OK, 0 rows affected (0.05 sec) mysql> LOAD DATA INFILE 'D:\\MySQL\\daftar_dosen.txt' INTO TABLE daftar_dosen FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'; Query OK, 12 rows affected (0.04 sec) Records: 12 Deleted: 0 Skipped: 0 Warnings: 0 mysql> SELECT * FROM daftar_dosen; +------------+----------------+------------+-----------+ | NIP_dosen | nama_dosen    | no_hp     | alamat   | +------------+----------------+------------+-----------+ | 0160436012 | Sabrina Sari  | 0812349900 | Pekanbaru | | 0173551078 | Aria Sulistya | 0880743523 | Jakarta  | | 0260432002 | Maya Ari Putri | 0812342342 | Palembang | | 0275430005 | Susi Indriani | 0812656532 | Bogor    | | 0360432014 | Suci Syuhada  | 0812341122 | Palembang | | 0480432066 | Tia Santrini  | 0812451177 | Padang   | | 0576431001 | M. Siddiq     | 0812979005 | Jakarta  | | 0770435006 | Rubin Hadi    | 0812567678 | Papua    | | 0785531001 | Siswanto      | 0852878006 | Padang   | | 0867221006 | Rudi Arwana   | 0823987598 | Jakarta  | | 0869437003 | Mustalifah    | 0812338877 | Aceh     | | 1080432007 | Arif Budiman  | 0812456345 | Makasar  | +------------+----------------+------------+-----------+ 12 rows in set (0.00 sec)
Cara Menggunakan Query DISTINCT Untuk Menghapus Duplikasi
Penekanan untuk judul diatas, query DISTINCT digunakan hanya untuk memanipulasi tampilan hasil dari tabel. Duplikasi yang dihapus adalah untuk tampilan data, bukan data asli yang ada di MySQL.
Misalkan dari tabel daftar_dosen kita ingin menampilkan asal kota dari seluruh dosen yang ada. Maka querynya adalah sebagai berikut:
mysql> SELECT alamat FROM daftar_dosen ORDER BY alamat; +-----------+ | alamat   | +-----------+ | Aceh     | | Bogor    | | Jakarta  | | Jakarta  | | Jakarta  | | Makasar  | | Padang   | | Padang   | | Palembang | | Palembang | | Papua    | | Pekanbaru | +-----------+ 12 rows in set (0.00 sec)
Saya menambahkan perintah ORDER BY alamat agar tampilan lebih rapi (diurutkan berdasarkan alamat).
Dari hasil query, dapat dilihat bahwa nama kota yang sama akan tampil lebih dari sekali. Ini terjadi karena terdapat beberapa dosen yang beralamat di kota yang sama. Jika kita ingin setiap kota hanya muncul 1 kali saja, bisa menggunakan query DISTINCT.
Cara Penulisan Query DISTINCT MySQL
Berikut format dasar penulisan query DISTINCT:
SELECT DISTINCT nama_kolom FROM nama_tabel;
nama_kolom
adalah nama kolom yang akan ditampilkan.nama_tabel
adalah nama tabel dari kolom yang akan ditampilkan.
Sehingga untuk menampilkan seluruh kota 1 kali saja bisa menggunakan query:
mysql> SELECT DISTINCT alamat FROM daftar_dosen ORDER BY alamat; +-----------+ | alamat   | +-----------+ | Aceh     | | Bogor    | | Jakarta  | | Makasar  | | Padang   | | Palembang | | Papua    | | Pekanbaru | +-----------+ 8 rows in set (0.00 sec)
Dengan penambahan perintah DISTINCT di awal query SELECT, maka hanya data yang unik saja yang akan tampil. Seandainya hasil query terdapat data yang sama lebih dari 1 kali tampil, perintah DISTINCT hanya akan menampilkannya 1 kali saja.
Namun jika kita menambah kolom nama_dosen, efeknya menjadi berbeda:
mysql> SELECT DISTINCT nama_dosen,alamat FROM daftar_dosen ORDER BY alamat; +----------------+-----------+ | nama_dosen    | alamat   | +----------------+-----------+ | Mustalifah    | Aceh     | | Susi Indriani | Bogor    | | Aria Sulistya | Jakarta  | | M. Siddiq     | Jakarta  | | Rudi Arwana   | Jakarta  | | Arif Budiman  | Makasar  | | Siswanto      | Padang   | | Tia Santrini  | Padang   | | Maya Ari Putri | Palembang | | Suci Syuhada  | Palembang | | Rubin Hadi    | Papua    | | Sabrina Sari  | Pekanbaru | +----------------+-----------+ 12 rows in set (0.06 sec)
Terlihat MySQL tetap menampilkan seluruh isi tabel tanpa ada yang dieliminasi. Ini disebabkan query DISTINCT hanya mengeliminasi query yang unik secara baris per baris (per record).
Dengan mengombinasikan nama_dosen dengan alamat, maka setiap baris dianggap unik, kecuali terdapat nama dosen dan alamat yang persis sama.
Query SELECT … DISTINCT yang kita pelajari kali ini cocok dipakai untuk laporan atau menampilkan sebagian data dari tabel MySQL.
Tutorial selanjutnya akan membahas tentang pengelolaan user, yang dimulai dari Mengenal Superuser root dan Pengertian Privileges MySQL.
saya suka sekali membaca artikel anda, kata-katanya mudah di pahami, saya bisa menghabiskan 5 jam sehari hanya membaca artikel anda, terima kasih. kalau bisa artikel tentang mysqlnya di tambah :-) , isinya berbobot lebih hebat daripada buku yang selama ini saya beli.
Terimakasih mas nasir, Mudah2an artikel di duniailkom ini dapat bermanfaat, tentang artikel MySQLnya akan saya tambah di lain kesempatan, ditunggu saja y mas…
mas saya mau tanya kalo menampilkan data sama di tabel mysql querynya gimana mas.?
Maksudnya kalau mau menampilkan hasil tabel jika ada data yang sama y? kalau iya, berarti kita tinggal mengabaikan perintah DISTINCT saja. Secara default, MySQL akan menampilkan seluruh hasil perintah SELECT, walaupun data yang ditampilkan ada yang sama.
thks you sangat membantu sekali artikel anda….semoga ilmu y menjadi amal ibadah
Amiin… terimakasih mbak emi, mudah-mudahan apa yang saya bagi disini bisa bermanfaat.. :)
mas mau tanya . . .
kalau tabel di atas saya tambah field (Nilai)
misal:
—————————–
Alamat | Nilai
——————————
Pekanbaru | 7
Palembang | 5
Bogor | 6
Padang | 8
Jakarta | 9
Papua | 5
Aceh | 4
Makasar | 3
Padang | 2
Jakarta | 6
Jakarta | 8
Palembang | 9
——————————-
Agar hasilnya seperti di bawah ini, penulisan Query DISTINCT nya bagaimana ya ?
—————————–
Alamat | Nilai
——————————
Aceh | 4
Bogor | 6
Jakarta | 23
Makasar | 3
Padang | 10
Palembang | 14
Papua | 5
Pekanbaru | 7
——————————-
Kalau untuk mengelompokkan hasil query seperti diatas, kita bisa menggunakan perintah GROUP BY, dan fungsi sum, kira-kira querynya sebagai berikut:
SELECT Alamat, sum(Nilai) FROM daftar_dosen GROUP BY Alamat
Perintah GROUP BY digunakan untuk menggabungkan hasil query. Mudah2an nanti saya akan buatkan tutorial yang lebih lengkap tentang penggunaan query GROUP BY ini
Semoga bisa membantu :)
ma’kasih banget mas, scriptnya . . . . .
Saya edit dikit ya mas scriptnya, jadi “SELECT Alamat, sum(Nilai)as Nilai FROM daftar_dosen GROUP BY Alamat” . . . . .
mas mau tanya lagi ya . . . .
kalau fieldnya saya tambah lagi menjadi ( alamat | nilai | bln | thn )
misal:
————————–
alamat | nilai | bln | thn
————————–
Pekanbaru | 7 | 7 | 2010
Palembang | 5 | 8 | 2010
Bogor | 6 | 2 | 2010
Padang | 8 | 2 | 2010
Padang | 15 | 4 | 2010
Jakarta | 9 | 2 | 2010
Papua | 5 | 2 | 2010
Aceh | 4 | 2 | 2010
Makasar | 3 | 2 | 2010
Padang | 2 | 2 | 2011
Jakarta | 6 | 2 | 2010
Jakarta | 8 | 3 | 2010
Jakarta | 5 | 5 | 2011
Jakarta | 6 | 3 | 2011
Jakarta | 9 | 3 | 2011
Palembang | 9 | 2 | 2010
Palembang | 50 | 2 | 2011
————————-
Agar, field (alamat | bln | thn) yg sama, akan muncul 1 aja, dan field nilai(di jumlah)
kira2 hasilnya seperti di bawah ini, penulisan Query nya bagaimana ya ?
————————–
alamat | nilai | bln | thn
————————–
Aceh | 4 | 2 | 2010
Bogor | 6 | 2 | 2010
Jakarta | 15 | 2 | 2010
Makasar | 3 | 2 | 2010
Padang | 8 | 2 | 2010
Palembang | 9 | 2 | 2010
Papua | 5 | 2 | 2010
Jakarta | 8 | 3 | 2010
Padang | 15 | 4 | 2010
Pekanbaru | 7 | 7 | 2010
Palembang | 5 | 8 | 2010
Padang | 2 | 2 | 2011
Palembang | 50 | 2 | 2011
Jakarta | 15 | 3 | 2011
Jakarta | 5 | 5 | 2011
————————-
SELECT alamat, sum(nilai), bln, thn FROM daftar_dosen GROUP BY bln;
Bagaimana kalau seperti itu?
SELECT Alamat, sum(Nilai) as Nilai, Bulan, Tahun FROM daftar_dosen GROUP BY Alamat, Bulan, Tahun
blog anda sungguh mengagumkan . . izin belajar dari semua artikel blog ini.
Silahkan gan.. :)
terimaksih atas tutorialnya . apa tidak ada tutorial tentang function pak ?
Tentang function MySQL ya, belum ada nih,.. tp akan segera di update :)
maaf gan sya mau nanya, setiap menu pada halaman website agan kok bisa dibuat berbeda2 ya…
untuk php sndri, u/ html sndri, dan mysql sndri2…
agan pke plugin wordpress ap (klo ada), atau ada caranya sndri gan…???
makasih
Maksudnya menu di samping kanan y gan? untuk ini saya menggunakan plugin Widget Logic. Setiap menu di set untuk tampil pada kategori tertentu saja. Tapi penggunaannya memang pakai coding WP dikit (untuk menentukan kategori mana menu harus muncul)
oh gtu ya gan, soalnya dri jaman jetot ane nyoba2 gk berhasil smpe download bnyk plugin menu wordpress buat nampilin halaman dengan kategorinya masing2, makasih ya gan…
Sama2 gan, dengan plugin ini seolah2 kita punya unlimited sidebar :)
agan ini programmer ya…???
Bukan gan, cuma seorang manusia biasa yang sedang mencari ilmu programming :)
tetapi bekerja di bidang komputer gan…??
atau masih mahasiswa…??
Saya programmer freelance gan, juga sekaligus mengelola duniailkom.
saya punya isi tabel seperti berikut
pjm1 | buku A |
pjm1 | buku B |
pjm1 | buku C |
biar menjadi
pjm1 | buku A |
| buku B |
| buku C |
kode mysqlnya gimana ya gan?mohon pencerahan nya
Menurut saya agak susah kalau mau dibuat seperti itu di MySQL gan. Jika menggunakan PHP MySQL, sebaiknya masalah tampilan diproses di sisi PHPnya, bukan dari MySQLnya.
Klo gini gmn?
Tgl | Nama |
1 Oktbr | Mia
| Meisya
| LIta
2 Oktober | Yuli
| Rio
dst..
Itu Solusiny gmn y? di Mysql ny atau di PHP ny? trus tolong caranya y..
tks..
Mengenai caranya cukup panjang kalau dijelaskan. Minimal mesti paham programming dengan PHP dan fungsi2 mysqli extensionnya. Ditampung dulu y gan..
om saya nanya dunk
saya punya 3 table
anggota, simpanananggota dan pinjaman
dimana keynya id_anggota disetiap table
nah permasalahan saya mas untuk sqlnya menampilkan data
semua anggota dan menjumlah total pinjaman anggota bila
di tabel pinjaman itu ada anggota telah meminjam 2 kali atau lebih
dan menampilkan semua data anggota juga
bagaimana pembuatan sqlnya penggabungan join sum dan distintc
terima kasih om sebelumnya
Di tampung dulu y gan. Analisis saya sekilas, sebaiknya logika seperti itu dipecah menjadi beberapa langkah kode program dari PHP, bukan di query SQLnya (yang akan cukup kompleks).
Atau mungkin ada rekan2 lain yang bisa bantu :)
Terima kasih Duniailkom.com, artikelnya bagus dan memberi manfaat, saya ikut merasakan manfaatnya!! Sukses selalu untuk Duniailkom.com
Siip mas, terimakasih juga untuk doanya….
saya punya permasalahan, misalkana ada 2 tabel mahasiswa nim, nama mahasiswa dan matakuliah kode mata kuliah dan nama mata kuliah kemudian saya melakukan join dimana pada tabel mahasiswa ada kode mata kuliah, permasalahannya bagaimana caranya hanya menampilkan kode matakuliah yang tidak ada di tabel mahasiswa..
|NIM |Nama | kode matkul|
|0101|ani | 001 |
|0102|yui | 002 |
jadi pada tabel mata kuliah hanya akan ditampilkan yang belum ada di tabel mahasiswa agar tidak terjadi duplikasi data saat memimilih matakuliah…
saya punya permasalahan menampilkan mysql dimana table saya berisi id,nama,nomor. dengan kondisi jika nama dan nomor sama maka akan ditampilkan satu saja. saya pake distinct dan hasilnya semua akan mucul sebab saya pake id auto increment. Tolong bantu gan…
mantap gan artikelnya solved my problem
maaf pak andre,saya mau tanya,bagaimana cara mencegah duplikat data dari sebuah kolom dalam tabel mysql ya?
saya telah membuat tabel warna dengan definisi tabel sebagai berikut:
create table warna (nomor int (3) not null auto_increment primary key,nama varchar (12) not null default '',kode varchar (12) not null default '');
ketika saya memasukkan record kedalam tabel ini,secara tidak sengaja telah terjadi dabel data pada kolom kode.
record pertamanya "","Red","#FF0000"
dan record keduanya "","Merah","#FF0000"
bagaimana caranya supaya kalau ada kode yang sama ini, mysql secara otomatis akan melewati data tersebut?
terimakasih.
Bisa menggunakan atribut tabel UNIQUE. Kalau pada saat pembuatan tabel, querynya: kode varchar(12) not null default unique. Tapi ini kalau ada data yang sama, akan tampil pesan error.
maaf pak andre … mau tanya
kalau dari 1 PC (dua database yg beda) ..
penambahan data dari tabel ke tabel bisa dg :
insert into db1.barang (kode,nama_brg,ket) select kode,nama_brg,ket from db2.barang
tapi kalau dari dua database yg beda PC querynya gimana ya ?
tolong dibantu ya
trims
Sepertinya tidak bisa. Kalau yang seperti ini sebaiknya di handle di tingkat programmingnya saja. Misalkan kalau aplikasinya nanti dibuat dari PHP, isi tabel pertama di tampung dulu kedalam 1 variabel, lalu baru diinsert ke tabel kedua.
terima kasih pencerahannya gan …sgt bermanfaat
Terima Kasih banyak…
bagaimana cara menampilkan data tanpa duplikasi ketika menggunakan innerjoin
Halo min, Saya menggunakan Hana Database (SAP) ketika di query sudah menggunakan DISTINCT akan tetapi data yang di tampilkan masih ada yang double. itu kenapa ya
Hmm.. kurang tau juga nih mas, kebetulan saya belum pernah coba Hana Database (SAP). Mungkin ada perbedaan “dialek” antara bahasa SQL di MySQL/MariaDB dengan SAP
min izin bertanya, bagaimana cara mengatasi duplikat data setiap kali menjalankan perintah select*from setelah menjalankan perintah insert into? soalnya saya setiap kali running select*from, data yang di insert into ikut nambah juga sehingga semakin banyak running, semakin bertambah dengan sendirinya datanya sehingga banyak duplikat. terimakasih
Berarti salahnya ada di logika program, bisa dipisahkan antara perintah INSERT dengan SELECT. Kalau hanya untuk melihat data saja, harusnya tidak perlu ada query INSERT di situ.
sangat membantu artikelnya, terimakasih…ijin bertanya..mengacu pada kasus distinct dosen dan kota di atas…bagaimana caranya supaya justru yg tampil hanya data kota yg sama mengacu pada nama dosennya, sedangkan data yg tidak sama tidak tampil…trimkasih sebelumnya