0Pricing
SQL Academy · Pelajaran

NULL dalam Agregat dan JOIN

Pelajari perilaku NULL dalam COUNT, SUM, dan JOIN.

NULL dalam Agregat dan JOIN adalah pelajaran SQL Academy 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 Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.

NULL Mengubah Perhitungan

Fungsi agregat dan JOIN sama-sama memperlakukan NULL secara khusus. Jika Anda tidak mengetahui aturannya, total dan hitungan Anda dapat diam-diam menjadi salah.

Pelajaran ini menunjukkan cara COUNT, SUM, AVG, GROUP BY, dan JOIN luar berinteraksi dengan nilai yang hilang.

SELECT amount FROM payments;
-- amount
-- -------
--    100
--   NULL   <- missing
--    200

Fungsi Agregat Mengabaikan NULL

Sebagian besar fungsi agregat — SUM, AVG, MIN, MAX — cukup melewatkan nilai NULL. Fungsi-fungsi tersebut hanya mengagregasikan baris yang memiliki data.

Jadi, jumlah yang bernilai NULL tidak mengganggu SUM; nilai tersebut hanya tidak disertakan dalam total.

-- Using amounts 100, NULL, 200
SELECT
  SUM(amount) AS total,  -- 300 (NULL skipped)
  MIN(amount) AS lo,     -- 100
  MAX(amount) AS hi      -- 200
FROM payments;

AVG Juga Melewati NULL

AVG membagi total nilai yang bukan NULL dengan banyaknya nilai yang bukan NULL. NULL dikecualikan dari keduanya.

Hal ini penting: rata-rata dari {100, NULL, 200} adalah 150, bukan 100 — NULL tidak dihitung sebagai nol.

-- (100 + 200) / 2 = 150, the NULL row is ignored
SELECT AVG(amount) AS avg_amount FROM payments;

-- If you WANT NULLs counted as 0, COALESCE first:
SELECT AVG(COALESCE(amount, 0)) AS avg_with_zeros FROM payments; -- 100

COUNT(*) dibandingkan dengan COUNT(column)

Perbedaan ini sering membingungkan banyak orang:

  • COUNT(*) menghitung baris, termasuk baris yang berisi NULL.
  • COUNT(column) hanya menghitung baris yang kolom tersebut bukan NULL.
-- 3 rows total, but only 2 have a non-NULL amount
SELECT
  COUNT(*)       AS row_count,    -- 3
  COUNT(amount)  AS has_amount    -- 2
FROM payments;

COUNT(DISTINCT) dan NULL

COUNT(DISTINCT col) menghitung banyaknya nilai berbeda yang bukan NULL. NULL sepenuhnya dikecualikan — tidak pernah menambah hitungan nilai berbeda.

Ingat hal ini saat mengukur "berapa banyak X yang unik".

-- statuses: 'paid', NULL, 'paid', 'void'
SELECT COUNT(DISTINCT status) AS distinct_statuses
FROM payments;
-- 2  (paid, void) -- NULL not counted

Agregat pada Himpunan Kosong

Ketika fungsi agregat dijalankan pada nol baris, hasilnya bergantung pada fungsi tersebut:

  • COUNT(...) mengembalikan 0.
  • SUM, AVG, MIN, MAX mengembalikan NULL.

Gunakan COALESCE untuk mengubah jumlah NULL menjadi 0 jika sesuai.

-- No rows match -> SUM is NULL, not 0
SELECT COALESCE(SUM(amount), 0) AS total
FROM payments
WHERE status = 'refunded';  -- no such rows

GROUP BY Mengelompokkan NULL Bersama-sama

Meskipun NULL = NULL tidak diketahui di tempat lain, GROUP BY menempatkan semua NULL dalam satu grup.

Jadi, kategori NULL menjadi kelompok tersendiri dalam hasil, sehingga Anda dapat merangkum baris dengan data yang hilang secara bersamaan.

SELECT category, COUNT(*) AS n
FROM products
GROUP BY category;

-- category | n
-- ---------+---
-- books    | 5
-- toys     | 3
-- NULL     | 2   <- all NULL categories in one group

NULL dari JOIN Luar

JOIN luar merupakan sumber utama NULL. LEFT JOIN mempertahankan setiap baris kiri; jika tidak ada kecocokan di sisi kanan, kolom sisi kanan menjadi NULL.

NULL tersebut berarti "tidak ada baris yang cocok", bukan "nilai NULL yang tersimpan".

SELECT c.name, o.id AS order_id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;

-- name  | order_id
-- ------+---------
-- Alice | 10
-- Bob   | NULL     <- Bob has no orders

Menghitung Kecocokan Setelah LEFT JOIN

Untuk menghitung hanya kecocokan nyata setelah LEFT JOIN, hitung kolom bukan NULL dari tabel kanan, bukan COUNT(*).

COUNT(o.id) mengabaikan baris NULL yang dihasilkan oleh baris kiri tanpa kecocokan, sehingga memberikan jumlah pesanan yang sebenarnya.

SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;

-- Bob shows 0, not 1×NULL

Menyaring yang Tidak Cocok

Jebakan yang agak halus: menempatkan kondisi pada tabel kanan dalam WHERE setelah LEFT JOIN mengubahnya menjadi JOIN dalam, karena NULL = nilai tidak diketahui dan tersaring.

Jika ingin mempertahankan baris tanpa kecocokan, letakkan kondisi dalam klausa ON atau periksa NULL secara eksplisit.

-- Accidentally drops Bob (his o.status is NULL)
SELECT c.name FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.status = 'open';

-- Keep unmatched rows: move the test into ON
SELECT c.name FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id AND o.status = 'open';

Aturan Praktis

Bawa aturan berikut ke setiap kueri agregat dan JOIN:

  • Fungsi agregat mengabaikan NULL (kecuali COUNT(*)).
  • COUNT(col) < COUNT(*) jika col memiliki NULL.
  • SUM/AVG pada himpunan kosong adalah NULL — bungkus dengan COALESCE.
  • LEFT JOIN menghasilkan NULL untuk baris tanpa kecocokan; hitung kunci sisi kanan.
  • Filter tabel kanan harus berada dalam ON, bukan WHERE.
SELECT c.name,
  COALESCE(SUM(o.amount), 0) AS spent,
  COUNT(o.id)                AS orders
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;

Pemeriksaan Singkat

Sebuah kolom amount memiliki nilai 100, NULL, dan 200 di tiga baris. Apa yang dikembalikan oleh COUNT(*) dan COUNT(amount)?

Ringkasan

Anda mempelajari bagaimana NULL mengalir melalui agregasi dan JOIN: fungsi agregat melewati NULL, COUNT(*) menghitung baris sedangkan COUNT(col) menghitung nilai yang bukan NULL, jumlah dari himpunan kosong adalah NULL, dan GROUP BY menggabungkan NULL ke dalam satu grup.

Anda juga melihat bahwa JOIN luar menghasilkan NULL untuk baris tanpa kecocokan, serta alasan filter tabel kanan harus berada dalam ON. Dengan demikian, kursus Bekerja dengan NULL selesai — sekarang Anda dapat menangani data yang hilang dengan percaya diri.

-- A NULL-safe summary query
SELECT c.name,
  COUNT(o.id)                AS orders,
  COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name
ORDER BY total_spent DESC;

Pertanyaan yang Sering Diajukan

Apakah pelajaran “NULL dalam Agregat dan JOIN” gratis?

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

Apa yang akan aku pelajari di “NULL dalam Agregat dan JOIN”?

Pelajari perilaku NULL dalam COUNT, SUM, dan JOIN. Kamu berlatih SQL Academy 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 Academy?

Tidak diperlukan pengalaman sebelumnya. SQL Academy 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 “NULL dalam Agregat dan JOIN” 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 Academy ini?

Ya. Setiap pelajaran SQL Academy 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. Makna Sebenarnya NULL
  2. IS NULL dan IS NOT NULL
  3. COALESCE dan NULLIF
  4. NULL dalam Agregat dan JOIN
← Kembali ke SQL Academy