0Pricing
SQL Academy · บทเรียน

ความหมายที่แท้จริงของ NULL

ไม่ทราบค่า ไม่ใช่ศูนย์ และไม่ใช่ค่าว่าง

ความหมายที่แท้จริงของ NULL เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

ทำความรู้จักกับ NULL

NULL คือวิธีที่ SQL ใช้บอกว่า"ไม่ทราบ" ไม่ใช่เลขศูนย์ ไม่ใช่สตริงว่าง และไม่ใช่ false — แต่หมายถึงการไม่มีค่า

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

-- A customers table where some phone numbers are unknown
SELECT id, name, phone
FROM customers;

-- id | name    | phone
-- ---+---------+------------
--  1 | Alice   | 555-0101
--  2 | Bob     | NULL        <- phone unknown
--  3 | Carol   | NULL

NULL ไม่ใช่ศูนย์

ข้อผิดพลาดที่พบบ่อยคือการปฏิบัติต่อ NULL เหมือนกับเลข 0 ทั้งสองอย่างแตกต่างกันโดยสิ้นเชิง

  • 0 คือค่าที่ทราบ ซึ่งก็คือศูนย์
  • NULL หมายความว่าค่านั้นขาดหายไปหรือไม่ทราบค่า

หากยอดเงินในบัญชีเป็น 0 ลูกค้าไม่มีเงิน แต่หากเป็น NULL เราเพียงยังไม่ทราบยอดเงินในบัญชี

SELECT id, balance
FROM accounts;

-- id | balance
-- ---+--------
--  1 | 0        <- known: empty wallet
--  2 | NULL     <- unknown: not recorded yet

NULL ไม่ใช่สตริงว่าง

สำหรับคอลัมน์ข้อความ NULL และสตริงว่าง '' ก็แตกต่างกันเช่นกัน

  • '' คือสตริงที่มีความยาวเป็นศูนย์ — เป็นค่าที่ทราบและมีอยู่
  • NULL หมายความว่าไม่มีการระบุสตริงไว้เลย

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

SELECT id, note, length(note) AS note_len
FROM tickets;

-- id | note | note_len
-- ---+------+----------
--  1 | ''   |        0   <- empty but present
--  2 | NULL |     NULL   <- absent; length is also unknown

ตรรกะแบบสามค่า

ตรรกะทั่วไปมีผลลัพธ์สองแบบคือ true และ false แต่ SQL เพิ่มผลลัพธ์ที่สามคือ ไม่ทราบ

การเปรียบเทียบใด ๆ ที่เกี่ยวข้องกับ NULL จะให้ผลเป็น unknown เพราะไม่สามารถเปรียบเทียบกับค่าที่ไม่มีอยู่ได้ แนวคิดนี้เรียกว่าตรรกะแบบสามค่า

-- Each comparison with NULL returns UNKNOWN, not true/false
SELECT
  NULL = 5      AS eq,      -- unknown
  NULL <> 5     AS neq,     -- unknown
  NULL = NULL   AS self_eq, -- unknown (!)
  NULL > 0      AS gt;      -- unknown

NULL = NULL ไม่เป็นจริง

กฎที่ทำให้ประหลาดใจที่สุดคือ NULL = NULL ไม่ใช่ true แต่จะประเมินผลเป็น unknown

เพราะเหตุใด? หากค่าทั้งสองไม่ทราบ เราไม่สามารถบอกได้ว่าค่าเหล่านั้นเท่ากัน เพราะอาจเป็นค่าใดก็ได้ หากต้องการตรวจสอบว่าสิ่งใดเป็น NULL ต้องใช้ IS NULL แทน =

-- Wrong: never returns rows, because NULL = NULL is unknown
SELECT * FROM customers WHERE phone = NULL;

-- Right: use IS NULL
SELECT * FROM customers WHERE phone IS NULL;

WHERE เก็บเฉพาะแถวที่เป็น TRUE

ส่วนคำสั่ง WHERE จะเก็บแถวไว้ก็ต่อเมื่อเงื่อนไขเป็นจริงเท่านั้น แถวที่เงื่อนไขเป็น false หรือ unknown จะถูกตัดออก

นี่เป็นเหตุผลที่การกรองคอลัมน์ที่มี NULL ด้วย = จะตัดแถวที่คุณอาจคาดว่าจะเห็นออกไปอย่างเงียบ ๆ

-- Bob and Carol have NULL phones, so phone = '555-0101'
-- is UNKNOWN for them and they are excluded.
SELECT name
FROM customers
WHERE phone = '555-0101';

-- Returns only Alice

NULL แพร่ผ่านการคำนวณ

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

หากไม่ทราบค่าป้อนเข้าค่าใดค่าหนึ่ง ก็ไม่สามารถทราบผลลัพธ์ได้เช่นกัน

SELECT
  10 + NULL    AS sum,    -- NULL
  100 * NULL   AS prod,   -- NULL
  NULL / 2     AS div,    -- NULL
  'Hi ' || NULL AS greet; -- NULL (string concat)

NULL มาจากไหน

NULL ปรากฏขึ้นได้ในหลายกรณีที่พบบ่อย:

  • INSERT ที่ไม่ระบุคอลัมน์ซึ่งอนุญาตให้เป็น NULL
  • การเชื่อมตารางภายนอกที่ไม่มีแถวตรงกันในฝั่งใดฝั่งหนึ่ง
  • การรวมค่าจากศูนย์แถว เช่น การใช้ SUM กับชุดว่างจะคืนค่าเป็น NULL

การทราบแหล่งที่มาจะช่วยให้ตัดสินใจได้ว่าควรจัดการกับค่าเหล่านี้อย่างไร

-- Omitting phone inserts NULL automatically
INSERT INTO customers (id, name) VALUES (4, 'Dan');

SELECT id, name, phone FROM customers WHERE id = 4;
-- 4 | Dan | NULL

การป้องกัน NULL: NOT NULL

หากคอลัมน์ควรมีค่าเสมอ ให้ประกาศคอลัมน์นั้นเป็น NOT NULL จากนั้นฐานข้อมูลจะปฏิเสธทุกแถวที่พยายามปล่อยให้คอลัมน์ไม่มีค่า

นี่เป็นวิธีที่มีประสิทธิภาพในการรักษาความสะอาดของข้อมูลและหลีกเลี่ยงปัญหาจาก NULL ในภายหลัง

CREATE TABLE users (
  id    integer PRIMARY KEY,
  email text NOT NULL,   -- must always be provided
  bio   text             -- nullable: optional
);

-- This fails: email cannot be NULL
INSERT INTO users (id, bio) VALUES (1, 'hi');

NULL กับ DISTINCT / GROUP BY

มีอยู่กรณีหนึ่งที่ SQL ถือว่า NULL มีค่าเท่ากัน นั่นคือการจัดกลุ่มและการกำจัดข้อมูลซ้ำ

ใน DISTINCT และ GROUP BY ค่า NULL ทั้งหมดจะถูกรวมไว้ในกลุ่มเดียว แม้ว่า NULL = NULL จะให้ผลเป็น unknown ในกรณีอื่น แนวทางพิเศษนี้ช่วยให้การจัดกลุ่มใช้งานได้สะดวก

SELECT phone, count(*)
FROM customers
GROUP BY phone;

-- phone    | count
-- ---------+------
-- 555-0101 |     1
-- NULL     |     2   <- all NULLs grouped together

ทบทวนกรอบความคิด

เมื่อพบ NULL ให้จำกฎเหล่านี้ไว้:

  • NULL หมายถึงไม่ทราบค่า ไม่ใช่ศูนย์หรือค่าว่าง
  • การเปรียบเทียบกับ NULL ให้ผลเป็นไม่ทราบ — ให้ใช้ IS NULL / IS NOT NULL
  • WHERE เก็บเฉพาะแถวที่เป็นจริง
  • การคำนวณกับ NULL จะให้ผลเป็น NULL
  • การจัดกลุ่มถือว่า NULL ทั้งหมดอยู่ในกลุ่มเดียว
-- The two correct NULL tests
SELECT name FROM customers WHERE phone IS NULL;
SELECT name FROM customers WHERE phone IS NOT NULL;

ตรวจสอบอย่างรวดเร็ว

นิพจน์ NULL = NULL จะประเมินผลเป็นอะไรใน SQL มาตรฐาน?

สรุปทบทวน

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

คุณได้เรียนรู้ตรรกะสามค่าของ SQL เหตุผลที่ = NULL ใช้งานไม่ได้ วิธีที่ NULL แพร่ผ่านการคำนวณ และวิธีที่ WHERE ตัดแถวที่ไม่ทราบค่าออก ถัดไป คุณจะเรียนรู้วิธีที่ถูกต้องในการตรวจสอบ NULL ด้วย IS NULL และ IS NOT NULL

-- Remember the golden rule
SELECT * FROM customers WHERE phone IS NULL;     -- correct
-- SELECT * FROM customers WHERE phone = NULL;   -- always empty!

คำถามที่พบบ่อย

บทเรียน “ความหมายที่แท้จริงของ NULL” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ความหมายที่แท้จริงของ NULL” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ความหมายที่แท้จริงของ NULL”

ไม่ทราบค่า ไม่ใช่ศูนย์ และไม่ใช่ค่าว่าง คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ความหมายที่แท้จริงของ NULL” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ความหมายที่แท้จริงของ NULL
  2. IS NULL และ IS NOT NULL
  3. COALESCE และ NULLIF
  4. NULL ในการรวมค่าและการเชื่อมตาราง
← กลับไปที่ SQL Academy