Skip to content

NULL & Aggregation

NULL ไม่ใช่ 0, ไม่ใช่ string ว่าง, ไม่ใช่ FALSE — NULL หมายถึง “ไม่ทราบค่า” หรือ “ไม่มีข้อมูล”

เหมือนช่องว่าง — ถ้าช่องว่าง SUM/COUNT จะข้ามไปเอง

กฎสำคัญ: aggregate functions ข้าม NULL ไปเสมอ (ยกเว้น COUNT(*))

-- สมมติ students มี 6 แถว, email NULL 1 แถว
SELECT COUNT(*) AS count_all, -- 6 (นับทุกแถว)
COUNT(email) AS count_email -- 5 (ข้าม NULL)
FROM students;
-- สมมติ price มีค่า: 4500, 3200, 7800, 4500, NULL, 9500
-- (ถ้า STD005 มี price = NULL)
SELECT SUM(price) AS total, -- 29500 (ข้าม NULL)
AVG(price) AS average -- 5900 (29500 / 5 ไม่ใช่ / 6)
FROM students;

COALESCE() — แทนที่ NULL ด้วยค่าอื่น

Section titled “COALESCE() — แทนที่ NULL ด้วยค่าอื่น”

COALESCE(value, fallback) คืนค่า value ถ้าไม่ใช่ NULL มิฉะนั้นคืน fallback

-- แสดง email หรือ 'ไม่มีข้อมูล' ถ้าเป็น NULL
SELECT name,
COALESCE(email, 'ไม่มีข้อมูล') AS email_display
FROM students;
nameemail_display
สมชายsomchai@mail.com
กมลไม่มีข้อมูล
-- ถ้าต้องการให้ NULL นับเป็น 0 ใน AVG
SELECT AVG(COALESCE(price, 0)) AS avg_with_null_as_zero
FROM students;
-- ตอนนี้หาร 6 แทน 5

COALESCE รับหลาย argument — คืนค่าตัวแรกที่ไม่ใช่ NULL

SELECT COALESCE(email, phone, 'ไม่มีช่องทางติดต่อ') AS contact
FROM students;
-- ลอง email ก่อน ถ้า NULL ลอง phone ถ้า NULL ทั้งคู่ใช้ fallback

NULL ถือเป็นกลุ่มเดียวกันใน GROUP BY:

SELECT email IS NOT NULL AS has_email,
COUNT(*) AS num_students
FROM students
GROUP BY email IS NOT NULL;
has_emailnum_students
TRUE5
FALSE1