Assalamu’alaikum…

Selamat datang kawan… kali ini saya akan membahas atau mempelajari tentang fungsi GROUP BY dan HAVING pada SQL. Mungkin kalian belum tau atau sudah tau terus ingin lebuah memahami lagi fungsi-fungsi tersebut, mari kita lihat uraian di bawah ini.

Pengertian
Fungsi GROUP BY dan HAVING sangat berkaitan dengan fungsi agregat. Fungsi agregat merupakan kelompok fungsi di MySQL yang memungkinkan untuk memiliki parameter berupa kelompok data.

Ltar Belakang
Memahami tentang fungsi GROUP BY dan HAVING.

Uraian
Database MySQL merupakan salah perangkat lunak untuk penyimpanan data yang sangat populer untuk saat ini. Salah satu alasan banyak orang memilih MySQL adalah keunggulan dan kelengkapan fitur-fitur di dalamnya. Salah satu fitur dari MySQL adalah dukungan terhadap berbagai fungsi agregat GROUP BY dan HAVING untuk pengelompokkan data. Pada tutorial ini dijelaskan mengenai fitur GROUP BY dan HAVING tersebut, disertai contohnya.

Sebagai contoh dari fungsi agregat adalah fungsi SUM() yang akan menjumlahkan seluruh nilai yang menjadi parameternya. Contoh lain adalah fungsi MAX() yang akan menghasilkan nilai terbesar dari keseluruhan nilai yang menjadi parameternya.

Untuk memudahkan pemahaman bagaimana fungsi GROUP BY dan HAVING digunakan, kita akan menggunakan contoh data di MySQL. Buatlah tabel nilai yang menyimpan data nilai mahasiswa.

Syntax :



CREATE TABLE nilai (
nim varchar(10) NOT NULL,
nama varchar(30) NOT NULL,
matkul varchar(20) NOT NULL,
nilai int(3) NOT NULL);







Hasil :










Selanjutnya isi tabel tersebut dengan beberapa data. Bagi yang ga mau repot bikin, ini sudah disiapkan perintah untuk bikin tabel dan mengisi datanya :


Syntaks :


CREATE TABLE nilai (
nim VARCHAR(10) not null,
nama VARCHAR(30) not null,
matkul VARCHAR(20) not null,
nilai INT(3) not null,
primary key(nim, nama, matkul)
);


INSERT INTO `nilai` (`nim`, `nama`, `matkul`, `nilai`) VALUES
('0911500101', 'ADI', 'ALGORITMA', 90),
('0911500102', 'IDA', 'ALGORITMA', 80),
('0911500103', 'EDI', 'ALGORITMA', 85),
('0911500104', 'INA', 'ALGORITMA', 75),
('0911500105', 'ANI', 'ALGORITMA', 92),
('0911500101', 'ADI', 'PTI', 75),
('0911500102', 'IDA', 'PTI', 90),
('0911500103', 'EDI', 'PTI', 88),
('0911500104', 'INA', 'PTI', 72),
('0911500105', 'ANI', 'PTI', 90),
('0911500101', 'ADI', 'KALKULUS', 65),
('0911500102', 'IDA', 'KALKULUS', 70),
('0911500103', 'EDI', 'KALKULUS', 60),
('0911500104', 'INA', 'KALKULUS', 50),
('0911500105', 'ANI', 'KALKULUS', 68),
('0911500101', 'ADI', 'PEMROGRAMAN WEB', 90),
('0911500102', 'IDA', 'PEMROGRAMAN WEB', 85),
('0911500103', 'EDI', 'PEMROGRAMAN WEB', 85),
('0911500104', 'INA', 'PEMROGRAMAN WEB', 80),
('0911500105', 'ANI', 'PEMROGRAMAN WEB', 92),
('0911500101', 'ADI', 'PBO', 90),
('0911500102', 'IDA', 'PBO', 80),
('0911500103', 'EDI', 'PBO', 85),
('0911500104', 'INA', 'PBO', 75),
('0911500105', 'ANI', 'PBO', 80);




Hasil :










Menampilkan rata-ratanilai dari seluruh mahasiswa


Untuk menyelesaikannya tidak perlu menggunakan GROUP BY karena yang diminta adalah seluruh mahasiswa. Untuk mendapatkan rata-rata nilai, kita dapat menggunakan fungsi AVG().


SELECT AVG(nilai) as rata_rata FROM nilai;




Hasil :














Menampilkan rata-rata nilai untuk setiap mahasiswa

Karena yang diminta adalah rata-ratauntuk setiap mahasiswa, maka kita harus menggunakan GROUP BY untuk mengelompokkan rata-rata berdasarkan field tertentu.




SELECT nim, nama, AVG(nilai) as rata_rata FROM nilai GROUP BY nim;






Hasil :












Menampilkan nilai terbesar dan terkecil untuk setiap mahasiswa


Query untuk menyelesaikan kasus ketiga di atas sebenarnya sama saja dengan yang sebelumnya. Perbedaannya hanya pada fungsi agregat yang digunakan untuk menampilkan nilai terbesar dan terkecil yaitu MAX() dan MIN(). Berikut ini query dan hasil query-nya.


SELECT nim, nama, MAX(nilai) as terbesar, MIN(nilai) as terkecil FROM nilai GROUP BY nim;




Hasil :
















Menampilkan rata-rata nilai yang didapat mahasiswa untuk setiap matakuliah

sama dengan kasus di atas namun pengelompokkan data berdasarkan matakuliah, bukan berdasarkan mahasiswa.


Syntax :




SELECT matkul, AVG(nilai) as rata_rata FROM nilai GROUP BY matkul;




Hasil :




















Menampilkan rata-rata nilai untuk setiap mahasiswa, yang rata-rata nilai lebih besar dari 80

Perhatikan kembali kasus kedua di atas. Hasil query menunjukkan bahwa untuk setiap mahasiswa akan ditampilkan nilai rata-rata yang diperoleh. Nah pada kasus ke-5 ini yang ingin ditampilkan adalah hanya mahasiswa yang nilainya lebih dari 80. maka mahasiswa yang bernama “IDA” dan “INA” tidak ditampilkan karena nilai mereka dibawah 80. Nah, jika kondisi suatu query terkait dengan fungsi agregat, maka kita tidak bisa menggunakan kondisi WHERE. Penggunaan WHERE pada fungsi agregat akan menyebabkan error.

Contoh error :

SELECT nim, nama, AVG(nilai) as rata_rata FROM nilai GROUP BY nim WHERE AVG(nilai)>80;



Hasil :





Lalu bagaimana solusinya jika tidak bisa menggunakan WHERE ? MySQL (dan juga database yang lainnya) memiliki struktur kondisi khusus terkait fungsi agregat yaitu HAVING. Jika query diatas diperbaiki dan menggunakan HAVING, maka hasilnya sebagai berikut:


Syntax :

SELECT nim, nama, AVG(nilai) as rata_rata FROM nilai GROUP BY nim HAVING AVG(nilai)>80;



Hasil :



Sebenarnya masih banyak variasi perintah query di MySQL yang menggunakan fungsi GROUP BY dan HAVING akan tetapi hanya ini yang saya pelajari dan saya tau.

Semoga bermanfaat… ;)



Maksud dan Tujuan
lebih memahami fungsi pada MySQL.

Alat dan Bahan
  • Laptop
  • File Items
  • Phpmyadmin

Referensi