ความหมายที่แท้จริงของ 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 | NULLNULL ไม่ใช่ศูนย์
ข้อผิดพลาดที่พบบ่อยคือการปฏิบัติต่อ NULL เหมือนกับเลข 0 ทั้งสองอย่างแตกต่างกันโดยสิ้นเชิง
0คือค่าที่ทราบ ซึ่งก็คือศูนย์NULLหมายความว่าค่านั้นขาดหายไปหรือไม่ทราบค่า
หากยอดเงินในบัญชีเป็น 0 ลูกค้าไม่มีเงิน แต่หากเป็น NULL เราเพียงยังไม่ทราบยอดเงินในบัญชี
SELECT id, balance
FROM accounts;
-- id | balance
-- ---+--------
-- 1 | 0 <- known: empty wallet
-- 2 | NULL <- unknown: not recorded yetNULL ไม่ใช่สตริงว่าง
สำหรับคอลัมน์ข้อความ 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; -- unknownNULL = 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 AliceNULL แพร่ผ่านการคำนวณ
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ความหมายที่แท้จริงของ NULL
- IS NULL และ IS NOT NULL
- COALESCE และ NULLIF
- NULL ในการรวมค่าและการเชื่อมตาราง