0Pricing
SQL Interview Prep · Pelajaran

Agregat Tanpa GROUP BY

Pelajari cara agregat sederhana meringkas seluruh tabel menjadi satu baris.

Agregat Tanpa GROUP BY adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Interview Prep mencakup 4 pelajaran total.

Satu Agregat, Satu Baris

Pewawancara menguji gagasan mendasar melalui pertanyaan ini: "Apa yang terjadi ketika Anda menggunakan fungsi agregat tanpa GROUP BY?"

Jawabannya: seluruh tabel dipadatkan menjadi satu baris. Agregat memperlakukan semua baris yang memenuhi syarat sebagai satu grup implisit yang besar. Memahami model "grup implisit" ini menjelaskan banyak aturan berikutnya, jadi mari kita membangunnya dengan cermat.

Satu Grup Implisit

Ketika Anda menulis agregat langsung tanpa GROUP BY, SQL berperilaku seolah-olah ada satu grup yang berisi setiap baris. Hasilnya selalu tepat satu baris, berapa pun jumlah baris dalam tabel — bahkan jika tabelnya kosong.

Jadi, SELECT COUNT(*) FROM employees mengembalikan satu baris dengan satu angka yang merangkum seluruh tabel.

SELECT COUNT(*) AS total_employees
FROM employees;
-- always returns exactly one row

Beberapa Agregat Bersamaan

Anda dapat mencantumkan beberapa agregat dalam satu SELECT. Semuanya merangkum grup implisit yang sama, sehingga Anda tetap mendapatkan tepat satu baris dengan beberapa kolom.

Inilah kueri standar untuk "berikan statistik ringkasnya". Keempat angka tersebut menggambarkan kumpulan baris lengkap yang sama.

SELECT
  COUNT(*)     AS num_rows,
  SUM(salary)  AS total_pay,
  AVG(salary)  AS avg_pay,
  MAX(salary)  AS top_pay
FROM employees;

Kesalahan Pencampuran

Inilah aturan yang paling sering diuji. Anda tidak dapat mencampur agregat langsung dengan kolom yang tidak diagregasikan dalam SELECT yang sama tanpa GROUP BY.

Mengapa? Agregat menghasilkan satu baris, sedangkan kolom biasa memiliki banyak nilai — nilai yang mana yang harus ditampilkan? Hal itu ambigu, sehingga SQL standar menghasilkan kesalahan.

-- ERROR: name is not aggregated and there is no GROUP BY
SELECT name, MAX(salary)
FROM employees;

Mengapa Hal Ini Ambigu

Mari telusuri dengan tabel kita. MAX(salary) memadatkan semua baris menjadi satu nilai. Namun, name memiliki nilai yang berbeda pada setiap baris. Satu baris ringkasan tidak dapat memuat lima nama dalam satu sel.

Basis data menolak untuk menebak. Inilah prinsip yang sama di balik aturan GROUP BY: setiap kolom yang dipilih harus diagregasikan atau menjadi bagian dari grup. Tanpa GROUP BY, hanya agregat yang diizinkan.

Pengecualian Longgar MySQL

Ada satu kekhasan dialek yang perlu disebutkan: MySQL versi lama atau yang tidak ketat akan mengizinkan kueri pencampuran dan mengembalikan nama yang sembarang — belum tentu nama penerima gaji tertinggi.

MySQL modern dengan ONLY_FULL_GROUP_BY yang diaktifkan (sekarang merupakan bawaan) menolaknya seperti basis data lainnya. Menyebutkan hal ini menunjukkan pemahaman lintas dialek, tetapi selalu perlakukan kueri pencampuran sebagai sesuatu yang keliru.

Mendapatkan Baris di Balik Nilai MAX

Jadi, bagaimana cara mendapatkan nama karyawan dengan gaji tertinggi? Bukan dengan mencampur kolom. Gunakan ORDER BY + LIMIT, atau subkueri yang membandingkan nilai dengan agregat.

Versi ORDER BY/LIMIT adalah yang paling sederhana. Versi subkueri dapat digunakan dengan baik pada kasus yang lebih umum dan mengembalikan semua karyawan yang memiliki nilai MAX yang sama.

-- Subquery: returns everyone earning the max
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

Agregat pada Tabel Kosong

Ini adalah kasus khusus yang sering disisipkan pewawancara: "Apa yang dikembalikan agregat langsung pada tabel kosong?"

  • COUNT(*) mengembalikan 0 (satu baris, dengan nilai 0).
  • SUM, AVG, MIN, MAX mengembalikan NULL (satu baris, dengan nilai NULL).

Yang terpenting, Anda tetap mendapatkan satu baris, bukan nol baris. Jaminan satu baris itulah inti dari agregat tanpa GROUP BY.

SELECT COUNT(*) AS c, SUM(salary) AS s, MAX(salary) AS m
FROM employees
WHERE 1 = 0;
-- one row: c=0, s=NULL, m=NULL

Agregat Tanpa WHERE

Aturan lain yang mengikuti model ini adalah bahwa Anda tidak dapat menempatkan agregat dalam klausa WHERE, karena WHERE memfilter setiap baris sebelum agregasi berlangsung.

Untuk memfilter berdasarkan hasil agregat, gunakan HAVING (bersama pengelompokan) atau bungkus agregat dalam subkueri. WHERE berjalan terlalu awal dalam urutan eksekusi sehingga tidak dapat melihat agregat.

-- ERROR: aggregate not allowed in WHERE
-- SELECT * FROM employees WHERE salary > AVG(salary);

-- Correct: compare to the aggregate via subquery
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

Agregat Langsung vs GROUP BY

Bandingkan keduanya:

  • Tanpa GROUP BY: satu grup implisit = seluruh tabel = tepat satu baris hasil.
  • Dengan GROUP BY kolom: satu grup untuk setiap nilai berbeda pada kolom tersebut = satu baris per grup.

Agregat langsung hanyalah GROUP BY dengan nol kolom pengelompokan. Mekanismenya sama, hanya menggunakan satu wadah besar.

-- Whole table: one row
SELECT AVG(salary) FROM employees;

-- Per department: one row each
SELECT department, AVG(salary)
FROM employees
GROUP BY department;

Cara Menjelaskannya

Jawaban yang jelas: "Agregat tanpa GROUP BY memperlakukan seluruh himpunan hasil sebagai satu grup implisit dan mengembalikan tepat satu baris ringkasan, bahkan pada tabel kosong. Anda tidak dapat memilih kolom yang tidak diagregasikan bersamanya karena nilainya akan ambigu. Untuk mendapatkan baris di balik MAX atau MIN, saya menggunakan ORDER BY dengan LIMIT atau subkueri yang membandingkan nilainya dengan agregat."

Pemeriksaan Singkat

Prediksikan bentuk keluarannya.

Rangkuman

Agregat tanpa GROUP BY secara ringkas:

  • Seluruh tabel menjadi satu grup implisit → tepat satu baris hasil.
  • Anda tidak dapat mencampur agregat langsung dengan kolom yang tidak diagregasikan.
  • Tabel kosong: COUNT(*) = 0, sedangkan yang lain mengembalikan NULL, tetap dalam satu baris.
  • Agregat tidak boleh muncul dalam WHERE; gunakan subkueri atau HAVING.
  • Untuk mendapatkan baris di balik MIN/MAX, gunakan ORDER BY + LIMIT atau subkueri.

Dengan demikian, latihan wawancara tentang fungsi agregat selesai.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Agregat Tanpa GROUP BY” gratis?

Ya — teks lengkap “Agregat Tanpa GROUP BY” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Agregat Tanpa GROUP BY”?

Pelajari cara agregat sederhana meringkas seluruh tabel menjadi satu baris. Kamu berlatih SQL Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai SQL Interview Prep?

Tidak diperlukan pengalaman sebelumnya. SQL Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Agregat Tanpa GROUP BY” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Interview Prep ini?

Ya. Setiap pelajaran SQL Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. COUNT(*) vs COUNT(kolom) vs COUNT(DISTINCT)
  2. SUM dan AVG dengan NULL
  3. MIN, MAX, dan Agregasi Non-Numerik
  4. Agregat Tanpa GROUP BY
← Kembali ke SQL Interview Prep