Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การคำนวณคณิตศาสตร์ใน MySQL กรณีมีค่า NULL และไม่เป็น NULL

เมื่อทำการคำนวณคณิตศาสตร์ (บวก ลบ คูณ หาร) บนคอลัมน์ที่มีค่า NULL ผลลัพธ์จะเป็น NULL เสมอ (เพราะ NULL + Anything = NULL) ต้องใช้ IFNULL() หรือ COALESCE() แปลง NULL เป็น 0 (หรือค่าอื่น) ก่อนคำนวณ

ตัวอย่างการใช้งาน

สร้างตารางและเพิ่มข้อมูล (มี NULL):

mysql> CREATE TABLE DemoTable1462 (Value1 INT, Value2 INT);
mysql> INSERT INTO DemoTable1462 VALUES (10, 20), (50, NULL), (NULL, 70);

ดูข้อมูล:

mysql> SELECT * FROM DemoTable1462;
+--------+--------+
| Value1 | Value2 |
+--------+--------+
|     10 |     20 |
|     50 | NULL   |
| NULL   |     70 |
+--------+--------+

คำนวณผลรวม โดยแปลง NULL เป็น 0:

mysql> SELECT IFNULL(Value1, 0) + IFNULL(Value2, 0) FROM DemoTable1462;

ผลลัพธ์:

+-----------------------------------+
| IFNULL(Value1,0)+IFNULL(Value2,0) |
+-----------------------------------+
|                                30 |
|                                50 |
|                                70 |
+-----------------------------------+

ฟังก์ชันจัดการ NULL ในการคำนวณ

ฟังก์ชันไวยากรณ์คำอธิบายตัวอย่าง
IFNULLIFNULL(expr, val)MySQL Specific คืนค่า val หาก expr เป็น NULLIFNULL(col, 0)
COALESCECOALESCE(v1, v2, ..., vn)มาตรฐาน SQL คืนค่าแรกที่ไม่เป็น NULLCOALESCE(col1, col2, 0)
NULLIFNULLIF(expr1, expr2)คืน NULL หาก expr1 = expr2NULLIF(price, 0)

ตัวอย่างการคำนวณหลากหลาย

-- บวก
SELECT IFNULL(a, 0) + IFNULL(b, 0) AS SumAB FROM t;

-- ลบ
SELECT IFNULL(a, 0) - IFNULL(b, 0) AS DiffAB FROM t;

-- คูณ (NULL * Anything = NULL → ต้อง IFNULL ทั้งคู่)
SELECT IFNULL(a, 1) * IFNULL(b, 1) AS ProdAB FROM t;

-- หาร (ระวังหารศูนย์)
SELECT IFNULL(a, 0) / NULLIF(IFNULL(b, 0), 0) AS DivAB FROM t;

-- ค่าเฉลี่ยข้าม NULL
SELECT AVG(IFNULL(score, 0)) FROM t;  -- นับ NULL เป็น 0
SELECT AVG(score) FROM t;              -- ข้าม NULL (Default AVR Behavior)

แนวทางปฏิบัติที่ดี

  • ใช้ COALESCE แทน IFNULL เพื่อ Portability (มาตรฐาน SQL)
  • กำหนด DEFAULT 0 ตอนสร้างตาราง หากค่าว่างหมายถึงศูนย์
  • ใช้ NULLIF ป้องกัน Division by Zero
  • โครงสร้าง Schema ให้ถูกต้อง: NOT NULL + DEFAULT 0 สำหรับคอลัมน์ตัวเลขที่บังคับ