อธิบายการตรวจสอบ NULL ใน MySQL: IS NULL, IS NOT NULL, และแนวปฏิบัติที่ดีที่สุด

目次

1. บทนำ: ทำไมการตรวจสอบ NULL ถึงสำคัญใน MySQL

NULL คืออะไร?

ใน MySQL, NULL แสดงถึงการไม่มีข้อมูล มันแตกต่างจาก “ค่าที่ว่างเปล่า” หรือ “ศูนย์” และบ่งบอกถึงค่าที่ไม่ทราบหรือหายไปในฐานข้อมูล เนื่องจาก NULL แสดงถึงค่าที่ไม่มีอยู่จริง จึงต้องระมัดระวังเป็นพิเศษเมื่อตั้งค่าโครงสร้างฐานข้อมูลและเขียนคำสั่ง SQL

ตัวอย่างเช่น ในฐานข้อมูลลูกค้า หากคอลัมน์ “phone_number” มีค่าเป็น NULL หมายความว่าลูกค้ายังไม่ได้ให้หมายเลขโทรศัพท์หรือค่าดังกล่าวยังไม่ได้ถูกบันทึกไว้ NULL มักถูกเข้าใจผิดว่าเป็นเพียง “ค่าว่าง” แต่จริง ๆ แล้วมันมีความหมายพิเศษที่แตกต่างจากสตริงว่างหรือศูนย์

ความสำคัญของการตรวจสอบ NULL

หากจัดการกับ NULL อย่างไม่ถูกต้อง คำสั่ง SQL อาจทำงานไม่เป็นไปตามที่คาดหวัง ตัวอย่างเช่น การใช้ตัวดำเนินการเปรียบเทียบมาตรฐานโดยไม่ได้ตรวจสอบ NULL อย่างเหมาะสมอาจให้ผลลัพธ์ที่ผิดพลาด ซึ่งอาจทำให้เกิดข้อผิดพลาดหรือบั๊กที่ไม่คาดคิด ดังนั้น การเข้าใจวิธีตรวจสอบ NULL อย่างถูกต้องใน SQL จึงเป็นสิ่งจำเป็นสำหรับการทำงานของฐานข้อมูลที่เชื่อถือได้

พิจารณาคำสั่ง SQL ต่อไปนี้:

SELECT * FROM customers WHERE phone_number = NULL;

คำสั่งนี้ไม่ให้ผลลัพธ์ตามที่ต้องการ เนื่องจาก NULL ไม่สามารถเปรียบเทียบด้วยตัวดำเนินการเท่ากับได้ ต้องใช้ตัวดำเนินการพิเศษเพื่อเช็คค่าของ NULL

การจัดการ NULL อย่างไม่เหมาะสมส่งผลไม่เพียงต่อการดึงข้อมูลเท่านั้น แต่ยังส่งผลต่อความสมบูรณ์และความน่าเชื่อถือของข้อมูลด้วย ด้วยเหตุนี้ การเข้าใจวิธีทำงานกับ NULL อย่างถูกต้องใน SQL จึงเป็นพื้นฐานสำคัญของการจัดการฐานข้อมูลที่มีประสิทธิภาพ

2. พื้นฐานการตรวจสอบ NULL: ตัวดำเนินการที่ใช้ใน MySQL

พื้นฐาน IS NULL และ IS NOT NULL

ใน MySQL คุณไม่สามารถใช้ตัวดำเนินการเปรียบเทียบเช่น = (เท่ากับ) หรือ <> (ไม่เท่ากับ) เพื่อตรวจสอบค่าของ NULL ได้ ต้องใช้ตัวดำเนินการ IS NULL และ IS NOT NULL แทน

  • IS NULL : ตรวจสอบว่าค่าของคอลัมน์เป็น NULL หรือไม่
  • IS NOT NULL : ตรวจสอบว่าค่าของคอลัมน์ไม่เป็น NULL

ตัวอย่างเช่น หากต้องการค้นหาลูกค้าที่หมายเลขโทรศัพท์เป็น NULL คุณจะเขียนว่า:

SELECT * FROM customers WHERE phone_number IS NULL;

คำสั่งนี้จะคืนค่าลูกค้าทั้งหมดที่ phone_number เป็น NULL หากต้องการค้นหาลูกค้าที่หมายเลขโทรศัพท์ไม่เป็น NULL ให้ใช้:

SELECT * FROM customers WHERE phone_number IS NOT NULL;

เมื่อทำงานกับค่าของ NULL ควรใช้ IS NULL หรือ IS NOT NULL เสมอ

ความแตกต่างระหว่าง NULL กับค่าต่าง ๆ (สตริงว่าง, ศูนย์)

แม้ว่า NULL, สตริงว่าง ('') และศูนย์ (0) อาจดูคล้ายกัน แต่ในฐานข้อมูลแต่ละค่ามีความหมายที่แตกต่างกัน

  • NULL : บ่งบอกว่าไม่มีค่าอยู่หรือค่าที่ไม่ทราบ
  • สตริงว่าง ('') : สตริงที่มีความยาวศูนย์; ค่ามีอยู่แต่เป็นค่าว่าง
  • ศูนย์ (0) : ค่าตัวเลขที่แสดงถึงศูนย์

ตัวอย่าง:

SELECT * FROM products WHERE price = 0;

คำสั่งนี้ค้นหาผลิตภัณฑ์ที่ราคาตั้งเป็นศูนย์ แต่จะไม่รวมผลิตภัณฑ์ที่ราคามีค่าเป็น NULL หากต้องการดึงผลิตภัณฑ์ที่มีราคาเป็น NULL ต้องใช้:

SELECT * FROM products WHERE price IS NULL;

การเข้าใจความแตกต่างนี้เป็นขั้นตอนแรกในการจัดการค่า NULL อย่างถูกต้อง

3. การเปรียบเทียบ NULL กับประเภทข้อมูลอื่น: จุดที่มักมองข้าม

ความแตกต่างระหว่าง NULL, สตริงว่าง, และศูนย์

เมื่อทำงานกับ NULL ใน MySQL มักจะสับสนระหว่าง NULL กับสตริงว่างหรือศูนย์ อย่างไรก็ตาม ค่าต่าง ๆ เหล่านี้มีแนวคิดที่แตกต่างกัน NULL หมายถึง “ไม่มีค่าอยู่” สตริงว่างหมายถึง “มีสตริงที่ว่างเปล่า” และศูนย์หมายถึง “ค่าตัวเลขเป็นศูนย์”

  • NULL : บ่งบอกว่าข้อมูลไม่มีอยู่หรือไม่ทราบ
  • สตริงว่าง ('') : บ่งบอกว่ามีสตริงความยาวศูนย์อยู่
  • ศูนย์ (0) : บ่งบอกว่าค่าตัวเลขเป็นศูนย์

ตัวอย่าง:

SELECT * FROM users WHERE name = '';

คำสั่งนี้คืนผู้ใช้ที่ชื่อเป็นสตริงว่าง อย่างไรก็ตาม หากต้องการดึงผู้ใช้ที่ชื่อเป็น NULL ต้องเขียนว่า:

SELECT * FROM users WHERE name IS NULL;

NULL และสตริงว่างต้องได้รับการจัดการแยกกันอย่างชัดเจน

ความแตกต่างระหว่าง NULL และ FALSE

NULL และ FALSE มักจะสับสนกันบ่อยครั้ง แต่จริง ๆ แล้วไม่เหมือนกัน FALSE แสดงค่าตรรกะเท็จ ในขณะที่ NULL แสดงถึงการไม่มีค่าใด ๆ

สำหรับตัวอย่าง:

SELECT * FROM users WHERE is_active = FALSE;

คำสั่งนี้จะคืนผู้ใช้ที่ไม่ได้ใช้งาน อย่างไรก็ตาม ผู้ใช้ที่ค่าของ is_active เป็น NULL จะไม่ถูกรวมอยู่ในผลลัพธ์ เพื่อให้รวมค่า NULL ด้วย คุณต้องเพิ่มเงื่อนไขเพิ่มเติม:

SELECT * FROM users WHERE is_active IS NULL OR is_active = FALSE;

เนื่องจาก NULL และ FALSE มีความหมายที่แตกต่างกัน จึงต้องจัดการอย่างเหมาะสมในคำสั่ง SQL

4. การจัดการ NULL อย่างเป็นประโยชน์: เทคนิคสำหรับการสืบค้นในโลกจริง

การตรวจสอบ NULL ในหลายคอลัมน์

ในแอปพลิเคชันจริงหลายคอลัมน์อาจมีค่า NULL ตัวอย่างเช่น ในตารางการจัดการลูกค้า ทั้ง “phone_number” และ “email” อาจเป็น NULL ในกรณีเช่นนี้ คุณอาจต้องตรวจสอบหลายคอลัมน์พร้อมกัน

ตัวอย่างเช่น การค้นหาลูกค้าที่หมายเลขโทรศัพท์หรืออีเมลเป็น NULL:

SELECT * FROM customers
WHERE phone_number IS NULL OR email IS NULL;

คำสั่งนี้จะดึงข้อมูลลูกค้าที่หมายเลขโทรศัพท์หรืออีเมลเป็น NULL หากต้องการค้นหาลูกค้าที่ไม่มีค่าใด ๆ เป็น NULL ให้ใช้ตัวดำเนินการ AND:

SELECT * FROM customers
WHERE phone_number IS NOT NULL AND email IS NOT NULL;

การตรวจสอบ NULL ข้ามหลายคอลัมน์เป็นเทคนิคสำคัญสำหรับการเขียนคำสั่ง SQL ที่ยืดหยุ่น

การใช้ฟังก์ชันรวมกับ NULL

เมื่อทำการรวมข้อมูลที่มีค่า NULL อาจต้องการการจัดการพิเศษ เนื่องจากฟังก์ชันรวมส่วนใหญ่ (เช่น COUNT และ SUM) จะละเว้นค่า NULL ตัวอย่างเช่น COUNT(*) จะนับทุกแถวรวมถึงแถวที่มีค่า NULL ในขณะที่ COUNT(column_name) จะไม่รวมค่า NULL

ตัวอย่างเช่น การคำนวณยอดขายรวมโดยไม่รวมสินค้าที่จำนวนสต็อกเป็น NULL:

SELECT SUM(sales_amount) 
FROM products 
WHERE stock_quantity IS NOT NULL;

หากต้องการรวมค่า NULL ในผลลัพธ์ของฟังก์ชันรวม คุณสามารถใช้ฟังก์ชัน COALESCE เพื่อแทนที่ค่า NULL ด้วยค่าที่กำหนด ตัวอย่างเช่น การถือว่า NULL เป็น 0:

SELECT COALESCE(SUM(sales_amount), 0) 
FROM products;

การใช้ NULL ในตรรกะเชิงเงื่อนไข

คุณสามารถใช้คำสั่ง CASE ของ SQL เพื่อประยุกต์ตรรกะเชิงเงื่อนไขกับข้อมูลที่มีค่า NULL ตัวอย่างเช่น หากสต็อกของสินค้าเป็น NULL คุณอาจต้องการแสดง “Unknown”; มิฉะนั้นให้แสดงจำนวนสต็อก:

SELECT product_name,
       CASE
           WHEN stock_quantity IS NULL THEN 'Unknown'
           ELSE stock_quantity
       END AS stock_status
FROM products;

ในคำสั่งนี้ หากจำนวนสต็อกเป็น NULL จะปรากฏ “Unknown” มิฉะนั้นจะแสดงจำนวนสต็อก คำสั่ง CASE ช่วยให้จัดการค่า NULL ได้อย่างยืดหยุ่น

5. แนวปฏิบัติที่ดีที่สุดสำหรับการจัดการ NULL

ลดการใช้ NULL ในการออกแบบข้อมูล

หลักการสำคัญที่สุดเมื่อทำงานกับค่า NULL คือ ลดสถานการณ์ที่ต้องใช้ NULL ในการออกแบบฐานข้อมูล ให้หลีกเลี่ยงค่า NULL ทุกครั้งที่ทำได้และใช้ข้อจำกัด NOT NULL กับคอลัมน์ที่ต้องมีข้อมูล

ตัวอย่างเช่น ฟิลด์สำคัญในตารางลูกค้า เช่น “name” หรือ “address” ควรออกแบบให้ไม่สามารถเป็น NULL ได้ ใช้ข้อจำกัด NOT NULL กับคอลัมน์ที่จำเป็น และอนุญาตให้ใช้ NULL เฉพาะกับคอลัมน์ที่ค่าขาดหายเป็นที่ยอมรับ

CREATE TABLE customers (
    customer_id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    phone_number VARCHAR(15),
    email VARCHAR(100)
);

โดยการใช้ข้อจำกัด NOT NULL กับคอลัมน์ name คุณจะมั่นใจว่าทุกบันทึกของลูกค้าจะมีชื่อเสมอ

รักษาความสมบูรณ์ของข้อมูล

แม้สำหรับคอลัมน์ที่อนุญาตให้ใช้ NULL ก็ตาม การตั้งค่าค่าตั้งต้นที่เหมาะสมก็ยังสำคัญ เพื่อรักษาความสมบูรณ์ของข้อมูล ควรพิจารณาใช้ค่าตั้งต้นที่มีความหมาย เช่น “Not Set” หรือ “0” แทนการปล่อยให้ฟิลด์เป็น NULL.

สำหรับตัวอย่าง หากตารางสินค้าอนุญาตให้มีค่า NULL ในคอลัมน์ “release_date” คุณสามารถกำหนดค่าเริ่มต้นเช่น “1900-01-01” เพื่อป้องกันความไม่สอดคล้องที่เกิดจากค่า NULL

CREATE TABLE products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100),
    release_date DATE DEFAULT '1900-01-01'
);

โดยการตั้งค่าตัวเริ่มต้นที่มีความหมายแทนการพึ่งพา NULL คุณจะรักษาความสอดคล้องและทำให้การตรวจสอบ NULL ในอนาคตง่ายต่อการจัดการ

การเพิ่มประสิทธิภาพ

คิวรีที่พึ่งพาการตรวจสอบ NULL อย่างมากอาจส่งผลต่อประสิทธิภาพ โดยเฉพาะอย่างยิ่ง หากคุณใช้ IS NULL หรือ IS NOT NULL บนคอลัมน์ที่มีค่า NULL จำนวนมากบ่อยครั้ง การปรับแต่งดัชนีอย่างเหมาะสมจึงเป็นสิ่งสำคัญ การเพิ่มดัชนีให้กับคอลัมน์ที่มีเปอร์เซ็นต์ค่า NULL สูงสามารถลดประสิทธิภาพการค้นหาได้ ดังนั้นการออกแบบดัชนีต้องได้รับการพิจารณาอย่างรอบคอบ

6. คำถามที่พบบ่อย: คำถามทั่วไปเกี่ยวกับ NULL

Q1: การเปรียบเทียบ NULL ด้วยโอเปอเรเตอร์ = ทำให้เกิดข้อผิดพลาดหรือไม่?

A1: ไม่, มันไม่ทำให้เกิดข้อผิดพลาด, แต่ก็ไม่ทำงานตามที่คาดหวัง เนื่องจาก NULL แทนค่าที่ไม่ทราบ, ตัวโอเปอเรเตอร์การเปรียบเทียบมาตรฐานเช่น = หรือ <> ไม่ทำงานอย่างถูกต้องกับ NULL ควรใช้ IS NULL หรือ IS NOT NULL เสมอ

Q2: ฉันจะรวมข้อมูลที่มีค่า NULL อย่างไร?

A2: เมื่อทำการรวมข้อมูลที่มีค่า NULL คุณสามารถใช้ฟังก์ชัน COALESCE เพื่อแทนที่ NULL ด้วยค่าตั้งต้น (เช่น 0) หรือเพิ่มเงื่อนไข IS NULL ตามต้องการ สิ่งนี้ทำให้การรวมข้อมูลแม่นยำแม้ในกรณีที่มีค่า NULL อยู่

Q3: มีข้อควรระวังใดบ้างเมื่อจัดเก็บค่า NULL ในฐานข้อมูล?

A3: มี. เนื่องจาก NULL แทนการไม่มีข้อมูล คุณต้องเข้าใจความหมายของมันอย่างชัดเจนก่อนใช้งาน หลีกเลี่ยงการใช้ NULL มากเกินไป เพราะอาจทำให้การตีความข้อมูลซับซ้อนยิ่งขึ้น

Q4: ดัชนีสามารถใช้กับคอลัมน์ที่มีค่า NULL ได้หรือไม่?

A4: ได้, ดัชนีสามารถใช้กับคอลัมน์ที่มีค่า NULL ได้ อย่างไรก็ตาม หากคอลัมน์มีรายการ NULL จำนวนมาก ประสิทธิภาพของดัชนีอาจลดลง การออกแบบดัชนีอย่างเหมาะสมเป็นสิ่งสำคัญโดยเฉพาะเมื่อการค้นหา IS NULL หรือ IS NOT NULL มีบ่อยครั้ง

7. สรุป: การใช้การตรวจสอบ NULL อย่างถูกต้อง

การจัดการ NULL ใน MySQL อย่างถูกต้องเป็นทักษะสำคัญสำหรับการดำเนินงานฐานข้อมูลอย่างแม่นยำและมีประสิทธิภาพ NULL แทน “ข้อมูลที่ไม่มีอยู่” และมีความหมายพิเศษที่แตกต่างจากค่าอื่น ๆ เพื่อการตรวจสอบ NULL อย่างถูกต้อง ให้ใช้ IS NULL และ IS NOT NULL และพิจารณาการจัดการ NULL ตั้งแต่ขั้นตอนการออกแบบฐานข้อมูล

ในสถานการณ์จริง คุณต้องใช้เทคนิคเพื่อจัดการคิวรีและการรวมข้อมูลที่มีค่า NULL อย่างมีประสิทธิภาพพร้อมรักษาความสมบูรณ์ของข้อมูลและประสิทธิภาพ ตัวอย่างเช่น การใช้ COALESCE เพื่อแทนที่ค่า NULL หรือการออกแบบคิวรีที่ยืดหยุ่นซึ่งรวมการตรวจสอบ NULL สามารถเพิ่มความน่าเชื่อถือได้อย่างมาก

โดยการระบุและใช้ NULL อย่างถูกต้อง คุณจะปรับปรุงความแม่นยำและประสิทธิภาพของคิวรี SQL อย่างมีนัยสำคัญ ใช้เทคนิคที่แนะนำในบทความนี้เพื่อลดปัญหาการดำเนินงานฐานข้อมูลและสร้างระบบการจัดการข้อมูลที่น่าเชื่อถือยิ่งขึ้น