IS NULL และ IS NOT NULL
ตรวจสอบค่าที่หายไปอย่างถูกต้อง
IS NULL และ IS NOT NULL เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
การตรวจสอบค่าที่ขาดหายไป
เนื่องจากการเปรียบเทียบกับ NULL ให้ผลเป็นไม่ทราบเสมอ SQL จึงมีตัวดำเนินการเฉพาะสองตัวสำหรับตรวจสอบค่าที่ขาดหายไป ได้แก่ IS NULL และ IS NOT NULL
สองตัวนี้เป็นวิธีที่เชื่อถือได้เพียงวิธีเดียวในการค้นหาหรือตัด NULL ออก ในบทนี้ คุณจะได้เรียนรู้วิธีใช้ตัวดำเนินการเหล่านี้อย่างถูกต้อง
-- Rows where phone is missing
SELECT name FROM customers WHERE phone IS NULL;
-- Rows where phone is present
SELECT name FROM customers WHERE phone IS NOT NULL;เหตุใด = NULL จึงใช้ไม่ได้
แม้จะดูน่าเขียนว่า WHERE phone = NULL แต่คำสั่งนี้จะไม่ตรงกับสิ่งใดเลย เงื่อนไขจะประเมินผลเป็น unknown สำหรับทุกแถว และ WHERE จะเก็บเฉพาะแถวที่เป็นจริง
ผลลัพธ์จึงเป็นชุดว่าง — เป็นข้อผิดพลาดที่ไม่แสดงอาการ เนื่องจากไม่มีการแจ้งข้อผิดพลาด
-- Always returns 0 rows, even if NULLs exist
SELECT * FROM customers WHERE phone = NULL;
-- The fix
SELECT * FROM customers WHERE phone IS NULL;การใช้งาน IS NULL
IS NULL จะคืนค่า true เมื่อค่านั้นขาดหายไปพอดี และคืนค่า false ในกรณีอื่น โดยจะไม่คืนค่า unknown เลย
จึงสามารถใช้ได้อย่างปลอดภัยทุกที่ที่ต้องการผลลัพธ์จริงหรือเท็จที่ชัดเจน
SELECT id, name, (phone IS NULL) AS missing_phone
FROM customers;
-- id | name | missing_phone
-- ---+-------+--------------
-- 1 | Alice | f
-- 2 | Bob | t
-- 3 | Carol | tการใช้งาน IS NOT NULL
IS NOT NULL เป็นสิ่งที่ตรงข้ามกันพอดี โดยให้ค่า true เมื่อมีค่าอยู่ และให้ค่า false เมื่อค่านั้นขาดหายไป
ใช้เพื่อกรองให้เหลือเฉพาะแถวที่มีข้อมูลจริง เช่น ลูกค้าที่สามารถโทรติดต่อได้
SELECT name, phone
FROM customers
WHERE phone IS NOT NULL;
-- name | phone
-- ------+----------
-- Alice | 555-0101การใช้ร่วมกับ AND / OR
คุณสามารถรวมการตรวจสอบ NULL เข้ากับเงื่อนไขอื่นโดยใช้ AND และ OR ได้
ตัวอย่างเช่น ค้นหาลูกค้าที่ใช้งานอยู่และยังไม่มีหมายเลขโทรศัพท์ในข้อมูล ซึ่งเป็นคำสั่งค้นหาที่ใช้ตรวจสอบคุณภาพข้อมูลได้บ่อย
SELECT id, name
FROM customers
WHERE is_active = true
AND phone IS NULL;
-- Active customers missing a phone numberNULL ใน NOT IN: กับดัก
NOT IN จะทำงานผิดคาดเมื่อรายการมี NULL หากค่าใด ๆ ในชุดเป็น NULL NOT IN อาจคืนค่า unknown สำหรับทุกแถว ทำให้ผลลัพธ์ที่คาดว่าจะได้ถูกตัดออก
ควรเลือกใช้ NOT EXISTS หรือตัด NULL ออกจากคำสั่งค้นหาย่อยก่อน
-- Risky: if blocked_ids contains a NULL, this returns nothing
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked);
-- Safer
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM blocked WHERE user_id IS NOT NULL);IS DISTINCT FROM
PostgreSQL มี IS DISTINCT FROM และ IS NOT DISTINCT FROM ซึ่งเป็นตัวดำเนินการเปรียบเทียบที่รองรับ NULL
ต่างจาก = ตรงที่ตัวดำเนินการเหล่านี้ถือว่า NULL สองค่ามีค่าเท่ากัน และถือว่า NULL กับค่าหนึ่งค่าแตกต่างกัน โดยจะคืนค่าเป็น true หรือ false เสมอ และไม่คืนค่า unknown
SELECT
NULL IS NOT DISTINCT FROM NULL AS a, -- true: both NULL = same
NULL IS DISTINCT FROM 5 AS b, -- true: NULL differs from 5
5 IS DISTINCT FROM 5 AS c; -- false: same valueการเปรียบเทียบคอลัมน์ที่อาจเป็น NULL สองคอลัมน์
เมื่อเปรียบเทียบคอลัมน์สองคอลัมน์ที่อาจเป็น NULL ทั้งคู่ การใช้ = ตามปกติจะพลาดกรณีที่ทั้งสองค่าเป็น NULL ส่วน IS NOT DISTINCT FROM จะจัดการกรณีนี้ได้อย่างเหมาะสม
วิธีนี้เหมาะสำหรับค้นหาแถวที่ไม่มีการเปลี่ยนแปลง แม้ค่าจะไม่ทราบก็ตาม
-- Rows where old and new phone are 'the same',
-- counting NULL = NULL as same
SELECT id
FROM customer_changes
WHERE old_phone IS NOT DISTINCT FROM new_phone;การนับ NULL
การใช้ IS NULL ที่เป็นประโยชน์อย่างหนึ่งคือการตรวจสอบคุณภาพข้อมูล โดยนับว่ามีกี่แถวที่ขาดค่าใดค่าหนึ่ง
ใช้ร่วมกับ FILTER (PostgreSQL) หรือใช้ CASE ภายใน COUNT เพื่อแยกนับ NULL และค่าที่ไม่ใช่ NULL ได้ในเวลาเดียวกัน
SELECT
count(*) AS total,
count(*) FILTER (WHERE phone IS NULL) AS missing,
count(*) FILTER (WHERE phone IS NOT NULL) AS present
FROM customers;การตรวจสอบ NULL ในข้อจำกัด CHECK
คุณสามารถใช้การตรวจสอบ NULL ภายในข้อจำกัด CHECK เพื่อบังคับใช้กฎ เช่น "หากรายการถูกจัดส่ง จะต้องมีวันที่จัดส่ง"
โปรดทราบว่า ข้อจำกัด CHECK จะผ่านเมื่อเงื่อนไขเป็น true หรือ unknown ดังนั้นควรพิจารณากรณีที่เป็น NULL อย่างรอบคอบ
CREATE TABLE orders (
id integer PRIMARY KEY,
status text NOT NULL,
ship_date date,
CHECK (status <> 'shipped' OR ship_date IS NOT NULL)
);แนวทางปฏิบัติที่ดีที่สุด
ปฏิบัติตามนิสัยเหล่านี้เพื่อความปลอดภัยเมื่อทำงานกับ NULL:
- ตรวจสอบด้วย
IS NULL/IS NOT NULLเสมอ และอย่าใช้= NULL - ระวังการใช้
NOT INกับคำสั่งค้นหาย่อยที่อาจมี NULL - ใช้
IS DISTINCT FROMสำหรับการตรวจสอบความเท่ากันที่รองรับ NULL - ตรวจสอบข้อมูลที่ขาดหายด้วย
count(*) FILTER (...)
-- The reliable toolkit
WHERE col IS NULL
WHERE col IS NOT NULL
WHERE a IS DISTINCT FROM b
WHERE a IS NOT DISTINCT FROM bตรวจสอบความเข้าใจ
คุณต้องการลูกค้าทุกรายที่คอลัมน์ phone ไม่มีค่า คำสั่ง WHERE ใดถูกต้อง
ทบทวน
คุณได้เรียนรู้วิธีที่ถูกต้องในการตรวจสอบค่าที่หายไปด้วย IS NULL และ IS NOT NULL รวมถึงเหตุผลที่ = NULL ไม่เคยใช้ได้
นอกจากนี้ คุณยังได้รู้จักกับกับดักของ NOT IN ตัวดำเนินการ IS DISTINCT FROM ที่จัดการ NULL ได้อย่างปลอดภัย และวิธีตรวจสอบค่า NULL ด้วย FILTER ต่อไปคุณจะเรียนรู้การแทนที่ค่า NULL ด้วยค่าเริ่มต้นที่เหมาะสมโดยใช้ COALESCE และ NULLIF
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;คำถามที่พบบ่อย
บทเรียน “IS NULL และ IS NOT NULL” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “IS NULL และ IS NOT NULL” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “IS NULL และ IS NOT NULL”
ตรวจสอบค่าที่หายไปอย่างถูกต้อง คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “IS NULL และ IS NOT NULL” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ความหมายที่แท้จริงของ NULL
- IS NULL และ IS NOT NULL
- COALESCE และ NULLIF
- NULL ในการรวมค่าและการเชื่อมตาราง