Bab 5 dari 6 · 25 menit

Fungsi Agregasi, Pengelompokan, dan Relasi Tabel

Pengolahan data tingkat lanjut membutuhkan kemampuan untuk merangkum baris data numerik serta menghubungkan entitas data yang tersebar di beberapa tabel yang saling berhubungan.

Fungsi Agregat

Fungsi agregat SQL memproses sekumpulan baris nilai untuk menghasilkan satu nilai ringkasan. Fungsi agregat utama yang sering digunakan meliputi:

  • COUNT(): Menghitung banyaknya baris. COUNT(*) menghitung seluruh baris termasuk baris dengan data kosong, sedangkan COUNT(kolom) mengabaikan nilai NULL.
  • SUM(): Menghitung total penjumlahan nilai numerik.
  • AVG(): Menghitung nilai rata-rata numerik.
  • MIN(): Mengambil nilai paling kecil.
  • MAX(): Mengambil nilai paling besar.
SELECT
  COUNT(*)     AS jumlah_produk,
  SUM(stok)    AS total_stok,
  AVG(harga)   AS rata_harga,
  MAX(harga)   AS termahal
FROM produk;

GROUP BY dan HAVING

Untuk menyusun ringkasan berdasarkan kategori tertentu, kamu menggabungkan fungsi agregat dengan klausa GROUP BY. Bila kamu ingin menyaring data hasil pengelompokan tersebut, kamu harus menggunakan HAVING, bukan WHERE.

Perbedaan pentingnya adalah:

  • WHERE menyaring baris individual sebelum data dikelompokkan.
  • HAVING menyaring hasil kelompok setelah fungsi agregat dihitung.
SELECT kategori, COUNT(*) AS jumlah
FROM produk
GROUP BY kategori
HAVING COUNT(*) > 5;

Teknik JOIN

Dalam basis data relasional, informasi umumnya dinormalisasi ke beberapa tabel terpisah. Kamu menyatukan kembali data tersebut menggunakan teknik JOIN dengan memanfaatkan kecocokan kolom penghubung pada klausa ON:

  • INNER JOIN: Mengembalikan baris jika terdapat kecocokan di kedua belah tabel.
  • LEFT JOIN: Mengembalikan seluruh baris dari tabel kiri beserta data yang cocok dari tabel kanan (bernilai NULL jika tidak berpadanan).
  • RIGHT JOIN: Mengembalikan seluruh baris dari tabel kanan beserta data yang cocok dari tabel kiri.
  • FULL JOIN: Mengembalikan seluruh baris dari kedua tabel tanpa terkecuali.
SELECT p.id, u.nama, p.total
FROM pesanan AS p
INNER JOIN pengguna AS u
  ON p.user_id = u.id;

Subquery

Selain JOIN, kamu dapat memanfaatkan Subquery (query bersarang di dalam query lain). Subquery dieksekusi terlebih dahulu oleh basis data, kemudian hasilnya dijadikan parameter masukan bagi query luar:

-- Menampilkan produk dengan harga di atas rata-rata
SELECT nama, harga
FROM produk
WHERE harga > (
  SELECT AVG(harga) FROM produk
);

Cek pemahaman

  1. 1. Klausa manakah yang harus kamu gunakan jika ingin memfilter data kelompok berdasarkan hasil fungsi agregasi?

  2. 2. Penggunaan COUNT(*) dan COUNT(nama_kolom) selalu menghasilkan nilai angka yang persis sama dalam semua kondisi data.

  3. 3. Hasil apa yang diberikan oleh operasi INNER JOIN antar dua tabel?