0Pricing
Coding Interview Prep · Pelajaran

Aturan GROUP BY untuk Kolom SELECT

Mengapa setiap kolom yang tidak diagregasikan harus muncul dalam GROUP BY dan mode only-full-group-by.

Aturan GROUP BY untuk Kolom SELECT adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 1 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 Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Mengapa Pewawancara Memulai dengan GROUP BY

GROUP BY adalah bagian yang membedakan kandidat tingkat pemula dari kandidat tingkat menengah dalam wawancara. Satu aturan yang paling sering diuji adalah: setiap kolom dalam daftar SELECT Anda harus berada di dalam fungsi agregat atau dicantumkan dalam GROUP BY.

Jika Anda melanggar aturan ini, mesin tidak dapat menentukan nilai mana yang harus ditampilkan untuk kelompok yang memiliki banyak baris. Pewawancara sengaja menyisipkan kesalahan ini untuk melihat apakah Anda memahami apa sebenarnya sebuah kelompok.

Apa Sebenarnya Kelompok Itu

GROUP BY meringkas banyak baris menjadi satu baris untuk setiap kunci yang berbeda. Setelah pengelompokan, mesin tidak lagi memiliki baris satu per satu. Mesin hanya memiliki satu baris ringkasan untuk setiap kelompok.

  • Kolom yang digunakan untuk pengelompokan memiliki satu nilai yang jelas untuk setiap kelompok.
  • Agregat seperti COUNT, SUM, AVG meringkas banyak nilai menjadi satu.
  • Kolom mentah lainnya bersifat ambigu: nilai mana dari sekian banyak nilai yang harus ditampilkan?
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

Kesalahan Klasik

Berikut kesalahan yang disukai pewawancara. Anda mengelompokkan berdasarkan department, tetapi juga memilih name, yaitu kolom yang tidak diagregasi dan tidak tercantum dalam GROUP BY.

Setiap departemen memiliki banyak karyawan, sehingga ada banyak nama dalam setiap kelompok. Mesin tidak dapat memilih salah satunya, jadi SQL standar menolak kueri tersebut.

-- ERROR: name is not in GROUP BY and not aggregated
SELECT department, name, COUNT(*)
FROM employees
GROUP BY department;

Dua Cara untuk Memperbaikinya

Ada dua perbaikan yang benar, dan pewawancara ingin mendengar bahwa Anda mengetahui keduanya menghasilkan jawaban yang berbeda:

  • Tambahkan kolom ke GROUP BY jika Anda memang menginginkan pengelompokan yang lebih terperinci (satu baris untuk setiap departemen dan nama).
  • Bungkus kolom dalam fungsi agregat seperti MAX(name) atau COUNT(name) jika Anda menginginkan satu nilai untuk setiap kelompok yang sudah ada.
-- Finer grouping
SELECT department, name, COUNT(*) AS rows_for_person
FROM employees
GROUP BY department, name;

ONLY_FULL_GROUP_BY dalam MySQL

Jebakan favorit: MySQL versi lama mengizinkan pemilihan kolom yang tidak dikelompokkan dan secara diam-diam mengembalikan nilai sembarang dari kelompok tersebut. Akibatnya, laporan yang salah dapat terlihat baik-baik saja.

MySQL modern mengaktifkan ONLY_FULL_GROUP_BY secara bawaan, yang menegakkan aturan standar. Postgres, SQL Server, dan Oracle selalu menegakkannya. Jika ditanya mengapa sebuah kueri 'berfungsi di server lama tetapi sekarang gagal,' inilah jawabannya.

-- Legal under ONLY_FULL_GROUP_BY because every
-- selected column is grouped or aggregated
SELECT department, MAX(hire_date) AS latest_hire
FROM employees
GROUP BY department;

Pengecualian Dependensi Fungsional

Ada suatu nuansa yang digunakan pewawancara untuk menguji pemahaman mendalam. Jika Anda mengelompokkan berdasarkan kunci utama sebuah tabel, setiap kolom lain dalam tabel tersebut bergantung secara fungsional pada kunci itu, sehingga memiliki tepat satu nilai untuk setiap kelompok.

Postgres dan MySQL modern mengizinkan pemilihan kolom yang bergantung tersebut tanpa mencantumkannya. Kunci yang dikelompokkan menentukan nilainya secara unik, sehingga tidak ada ambiguitas.

-- Legal: id is the PK, so name is determined by it
SELECT e.id, e.name, COUNT(o.id) AS orders
FROM employees e
LEFT JOIN orders o ON o.employee_id = e.id
GROUP BY e.id;

Contoh Penerapan: Penjualan per Wilayah

Misalkan Anda harus melaporkan total penjualan per wilayah. Kunci pengelompokan adalah region; metriknya adalah SUM(amount). Semua hal lainnya harus diagregasi atau dihilangkan.

Perhatikan betapa rapinya hasil ini: satu baris per wilayah, masing-masing membawa satu nilai hasil penjumlahan. Inilah bentuk setiap laporan agregat.

SELECT region,
       SUM(amount)   AS total_sales,
       COUNT(*)      AS num_orders,
       AVG(amount)   AS avg_order
FROM sales
GROUP BY region;

Mencampur Rincian dan Ringkasan

Soal jebakan: 'Tampilkan jumlah setiap pesanan di samping total wilayahnya.' Anda tidak dapat melakukan ini hanya dengan GROUP BY, karena pengelompokan menghilangkan baris satu per satu.

Jawaban yang benar adalah fungsi jendela (SUM(amount) OVER (PARTITION BY region)) atau JOIN kembali ke subkueri yang dikelompokkan. Mengenali bahwa GROUP BY adalah alat yang keliru untuk kasus ini merupakan inti pertanyaannya.

-- Detail rows kept, region total added per row
SELECT order_id, region, amount,
       SUM(amount) OVER (PARTITION BY region) AS region_total
FROM sales;

GROUP BY dan Alias SELECT

Bisakah Anda menggunakan alias yang didefinisikan dalam SELECT pada GROUP BY? Hal ini bergantung pada dialek, dan ketidakkonsistenan itulah yang diselidiki pewawancara.

  • MySQL dan Postgres: mengizinkan pengelompokan berdasarkan alias SELECT.
  • SQL Server dan Oracle: tidak mengizinkannya; Anda harus mengulangi ekspresi lengkap.

Jawaban yang kompatibel lintas dialek adalah mengulangi ekspresi dalam GROUP BY karena cara ini berfungsi di semua tempat.

-- Portable: repeat the expression rather than the alias
SELECT EXTRACT(YEAR FROM order_date) AS yr, COUNT(*)
FROM sales
GROUP BY EXTRACT(YEAR FROM order_date);

DISTINCT vs GROUP BY untuk Keunikan

Jika Anda hanya menginginkan kombinasi unik tanpa fungsi agregat, GROUP BY tanpa fungsi agregat berperilaku seperti DISTINCT. Pewawancara mungkin bertanya mana yang lebih jelas.

Gunakan DISTINCT untuk menyatakan maksud ('Saya menginginkan baris yang unik'). Gunakan GROUP BY jika Anda juga menghitung agregat. Hasilnya sama, tetapi petunjuk keterbacaannya berbeda.

-- These return the same rows
SELECT DISTINCT department, role FROM employees;
SELECT department, role FROM employees GROUP BY department, role;

Cara Mengatakannya Saat Wawancara

Saat menghadapi pertanyaan GROUP BY, jelaskan aturannya dengan lantang: 'Setiap kolom yang dipilih adalah kunci pengelompokan atau dibungkus dalam fungsi agregat, karena pengelompokan menyisakan satu baris per kunci.'

Kemudian nyatakan kunci pengelompokan dan metrik Anda, lalu pastikan tidak ada yang lolos tanpa dikelompokkan. Jawaban yang terstruktur seperti ini menunjukkan kompetensi tingkat menengah bahkan sebelum Anda menulis kuerinya.

Pemeriksaan Singkat

Uji pemahaman Anda tentang aturan inti GROUP BY.

Rangkuman

Aturannya: setiap kolom SELECT harus berupa kunci pengelompokan atau agregat. Alasannya: GROUP BY menyisakan satu baris untuk setiap kunci, sehingga kolom mentah yang tidak dikelompokkan menjadi ambigu.

  • Perbaiki pelanggaran dengan mengelompokkan kolom tersebut atau menerapkan agregasi padanya.
  • Perilaku lama MySQL mengembalikan nilai sembarang; ONLY_FULL_GROUP_BY menerapkan standar.
  • Dependensi fungsional kunci utama adalah satu-satunya pengecualian yang sah.
  • Untuk mempertahankan baris detail di samping total grup, gunakan fungsi jendela, bukan GROUP BY.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Aturan GROUP BY untuk Kolom SELECT” gratis?

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

Apa yang akan aku pelajari di “Aturan GROUP BY untuk Kolom SELECT”?

Mengapa setiap kolom yang tidak diagregasikan harus muncul dalam GROUP BY dan mode only-full-group-by. Kamu berlatih Coding 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 Coding Interview Prep?

Tidak diperlukan pengalaman sebelumnya. Coding 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 1 dari 4.

Berapa lama pelajaran “Aturan GROUP BY untuk Kolom SELECT” 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 Coding Interview Prep ini?

Ya. Setiap pelajaran Coding 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. Aturan GROUP BY untuk Kolom SELECT
  2. HAVING vs WHERE
  3. Mengelompokkan Berdasarkan Beberapa Kolom dan Ekspresi
  4. Menghitung dan Memfilter Grup
← Kembali ke Coding Interview Prep