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
-- 200Fungsi 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; -- 100COUNT(*) 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 countedAgregat pada Himpunan Kosong
Ketika fungsi agregat dijalankan pada nol baris, hasilnya bergantung pada fungsi tersebut:
COUNT(...)mengembalikan0.SUM,AVG,MIN,MAXmengembalikanNULL.
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 rowsGROUP 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 groupNULL 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 ordersMenghitung 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×NULLMenyaring 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/AVGpada himpunan kosong adalah NULL — bungkus denganCOALESCE.- LEFT JOIN menghasilkan NULL untuk baris tanpa kecocokan; hitung kunci sisi kanan.
- Filter tabel kanan harus berada dalam
ON, bukanWHERE.
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
- Makna Sebenarnya NULL
- IS NULL dan IS NOT NULL
- COALESCE dan NULLIF
- NULL dalam Agregat dan JOIN