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

ใน SQL NULL เป็นได้ทั้งค่าและคำหลัก เรามาดูค่า NULL กันก่อน
NULL ใน คืออะไร MySQL?
ในแง่ง่ายๆ, NULL คือค่าที่ใช้แทนข้อมูลที่ไม่มีอยู่จริงเมื่อทำการเพิ่มข้อมูลลงในตาราง อาจมีบางครั้งที่ค่าในบางฟิลด์ไม่พร้อมใช้งาน
เพื่อให้เป็นไปตามข้อกำหนดของระบบการจัดการฐานข้อมูลเชิงสัมพันธ์ที่แท้จริง MySQL ใช้ค่า NULL เป็นตัวแทนสำหรับค่าที่ยังไม่ได้ป้อน ภาพหน้าจอด้านล่างแสดงให้เห็นว่าค่า NULL มีลักษณะอย่างไรในตารางฐานข้อมูล
โปรดสังเกตว่าเซลล์ว่างจะถูกทำเครื่องหมายด้วย NULL ไม่ใช่ข้อความว่างและไม่ใช่เลขศูนย์ ก่อนที่จะไปต่อ โปรดทำความเข้าใจพื้นฐานของค่า NULL ก่อน
- NULL ไม่ใช่ประเภทข้อมูล – นี่หมายความว่าไม่ได้รับการยอมรับว่าเป็น "int", "date" หรือประเภทข้อมูลอื่นใดที่กำหนดไว้
- การคำนวณทางคณิตศาสตร์ ที่เกี่ยวข้องกับ NULL เสมอ กลับเป็นโมฆะตัวอย่างเช่น 69 + NULL = NULL
- ส่วนมาก ฟังก์ชั่นรวม ละเว้นแถวที่มีค่า NULLข้อยกเว้นประการเดียวคือ COUNT(*) ซึ่งจะนับทุกแถวโดยไม่คำนึงถึงค่า NULL
ฟังก์ชันรวมจัดการกับค่าว่างอย่างไร
กฎนี้จะเปลี่ยนคำตอบที่แบบสอบถามการรายงานส่งคืน ดังนั้นเรามาพิสูจน์กัน เริ่มต้นด้วยเนื้อหาปัจจุบันของตารางสมาชิก
SELECT * FROM `members`;
เมื่อดำเนินการสคริปต์ข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้
| membership_ number | full_ names | gender | date_of_ birth | physical_ address | postal_ address | contact_ number | |
|---|---|---|---|---|---|---|---|
| 1 | Janet Jones | Female | 21-07-1980 | First Street Plot No 4 | Private Bag | 0759 253 542 | janetjones@yagoo.cm |
| 2 | Janet Smith Jones | Female | 23-06-1980 | Melrose 123 | NULL | NULL | jj@fstreet.com |
| 3 | Robert Phil | Male | 12-07-1989 | 3rd Street 34 | NULL | 12345 | rm@tstreet.com |
| 4 | Gloria Williams | Female | 14-02-1984 | 2nd Street 23 | NULL | NULL | NULL |
| 5 | Leonard Hofstadter | Male | NULL | Woodcrest | NULL | 845738767 | NULL |
| 6 | Sheldon Cooper | Male | NULL | Woodcrest | NULL | 976736763 | NULL |
| 7 | Rajesh Koothrappali | Male | NULL | Woodcrest | NULL | 938867763 | NULL |
| 8 | Leslie Winkle | Male | 14-02-1984 | Woodcrest | NULL | 987636553 | NULL |
| 9 | Howard Wolowitz | Male | 24-08-1981 | SouthPark | P.O. Box 4563 | 987786553 | lwolowitz[at]email.me |
คอลัมน์ contact_number ที่ไฮไลต์ไว้มีทั้งหมดเก้าแถว แต่มีสองแถวที่เป็นค่าว่าง (NULL) เรามานับจำนวนสมาชิกทั้งหมดที่อัปเดตหมายเลขติดต่อของตนกัน
SELECT COUNT(contact_number) FROM `members`;
การดำเนินการแบบสอบถามข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้
| COUNT(contact_number) |
|---|
| 7 |
หมายเหตุ คำตอบคือ 7 ไม่ใช่ 9 เพราะค่า NULL สองค่าไม่ได้ถูกนับรวม การใช้คำสั่ง COUNT(*) กับตารางเดียวกันจะให้ผลลัพธ์เป็น 9 เนื่องจาก COUNT(*) นับจำนวนแถว ไม่ใช่จำนวนค่า
ไม่ใช่ค่า NULL
วิธีที่ปลอดภัยกว่าคือการป้องกันไม่ให้ค่า NULL เข้าไปในคอลัมน์ที่จำเป็นทั้งหมด นั่นคือหน้าที่ของข้อจำกัด NOT NULL
สิ่งที่ไม่ใช่คืออะไร Operaทอร์?
ตัวดำเนินการตรรกะ NOT ใช้สำหรับทดสอบเงื่อนไขแบบบูลีน โดยจะคืนค่า true หากเงื่อนไขเป็นเท็จ และจะคืนค่า false หากเงื่อนไขที่กำลังทดสอบเป็นจริง
| เงื่อนไข | ไม่ Operaผลลัพธ์ของทอร์ |
|---|---|
| จริง | เท็จ |
| เท็จ | จริง |
ทำไมต้องใช้ NOT NULL?
ในบางกรณี เราอาจต้องทำการคำนวณกับชุดผลลัพธ์จากคำสั่งค้นหาและส่งคืนค่าเหล่านั้น การดำเนินการทางคณิตศาสตร์ใดๆ กับคอลัมน์ที่มีค่าเป็น NULL จะส่งคืนค่า NULL เช่นกัน เพื่อหลีกเลี่ยงสถานการณ์เช่นนี้ เราสามารถใช้คำสั่ง NOT NULL เพื่อจำกัดผลลัพธ์ที่เราจะนำไปประมวลผลได้
การสร้างตารางที่มีคอลัมน์ที่ห้ามเป็นค่าว่าง (NOT NULL)
สมมติว่าเราต้องการสร้างตารางที่มีฟิลด์บางฟิลด์ซึ่งจะต้องมีค่าเสมอเมื่อเพิ่มแถวใหม่ เราสามารถใช้คำสั่ง NOT NULL กับฟิลด์ที่กำหนดเมื่อสร้างตารางได้
ตัวอย่างด้านล่างนี้สร้างตารางใหม่ที่เก็บข้อมูลพนักงาน โดยต้องระบุหมายเลขพนักงานเสมอ
CREATE TABLE `employees`( employee_number int NOT NULL, full_names varchar(255) , gender varchar(6) );
ต่อไปนี้เราจะลองเพิ่มข้อมูลใหม่โดยไม่ระบุหมายเลขพนักงาน และดูว่าจะเกิดอะไรขึ้น
INSERT INTO `employees` (full_names,gender) VALUES ('Steve Jobs', 'Male');
ดำเนินการสคริปต์ข้างต้นใน MySQL ม้านั่งทำงานของช่างเครื่อง แสดงข้อผิดพลาดดังต่อไปนี้ เนื่องจากไม่ได้กรอกคอลัมน์ที่จำเป็น
คำหลัก IS NULL และ IS NOT NULL
ข้อจำกัดนี้จะบล็อกค่า NULL ใหม่ หากต้องการใช้งานกับค่า NULL ที่มีอยู่แล้ว จะใช้คำว่า NULL เป็นคำหลัก โดยมีไวยากรณ์ดังนี้
column_name IS NULL column_name IS NOT NULL
ที่นี่
- “เป็นโมฆะ” เป็นคำสำคัญที่ทำการเปรียบเทียบแบบบูลีน จะคืนค่าเป็นจริงหากค่าที่ให้มาเป็น NULL และจะส่งคืนค่าเป็นเท็จหากค่าที่ให้มาไม่ใช่ NULL
- “ไม่ใช่ค่าว่าง” เป็นคีย์เวิร์ดที่ทำการเปรียบเทียบในทางตรงกันข้าม โดยจะคืนค่า true หากค่าที่ป้อนไม่ใช่ NULL และคืนค่า false หากค่าที่ป้อนเป็น NULL
เรามาดูตัวอย่างการใช้งานจริงที่ใช้คำสั่ง IS NOT NULL เพื่อลบแถวทั้งหมดที่มีค่า NULL ในคอลัมน์กัน
จากตารางสมาชิกด้านบน สมมติว่าเราต้องการรายละเอียดของสมาชิกที่มีหมายเลขติดต่อไม่เป็นค่าว่าง เราสามารถเรียกใช้คำสั่งค้นหาได้ดังนี้
SELECT * FROM `members` WHERE contact_number IS NOT NULL;
การเรียกใช้คำสั่งค้นหาข้างต้นจะแสดงผลลัพธ์เพียงเจ็ดรายการที่มีหมายเลขติดต่อ ซึ่งตรงกับผลลัพธ์การนับจากส่วนก่อนหน้า
ทีนี้สมมติว่าเราต้องการสิ่งที่ตรงกันข้าม นั่นคือ ข้อมูลสมาชิกที่ไม่มีหมายเลขติดต่อ เราสามารถใช้คำสั่งค้นหาต่อไปนี้ได้
SELECT * FROM `members` WHERE contact_number IS NULL;
การเรียกใช้คำสั่งค้นหาข้างต้นจะแสดงผลลัพธ์เป็นข้อมูลสมาชิกสองรายที่มีหมายเลขติดต่อเป็นค่าว่าง (NULL)
| membership_ number | full_names | gender | date_of_birth | physical_address | postal_address | contact_ number | |
|---|---|---|---|---|---|---|---|
| 2 | Janet Smith Jones | Female | 23-06-1980 | Melrose 123 | NULL | NULL | jj@fstreet.com |
| 4 | Gloria Williams | Female | 14-02-1984 | 2nd Street 23 | NULL | NULL | NULL |
คำเตือน: เงื่อนไขเช่น WHERE contact_number = NULL จะส่งคืนชุดผลลัพธ์ว่างเปล่า แม้ว่าจะมีค่า NULL อยู่ก็ตาม ตัวดำเนินการเท่ากับไม่สามารถตรงกับค่า NULL ได้ ดังนั้น IS NULL จึงเป็นการทดสอบที่ถูกต้องเพียงอย่างเดียว
การเปรียบเทียบค่า NULL กับตรรกะสามค่า
ตรรกะสามค่า – การดำเนินการทางตรรกะแบบบูลีนกับเงื่อนไขที่เกี่ยวข้องกับค่า NULL อาจส่งค่ากลับมาเป็น “ไม่ทราบ”, “จริง” หรือ “เท็จ”.
โดยใช้คีย์เวิร์ด “IS NULL” เมื่อทำการดำเนินการเปรียบเทียบ เกี่ยวข้องกับ NULL รับคืน จริง or เท็จการใช้ตัวดำเนินการเปรียบเทียบอื่นๆ จะส่งคืนค่า “ไม่ทราบ” (NULL)ตารางด้านล่างนี้เปรียบเทียบแต่ละสำนวนแบบเคียงข้างกัน
| การแสดงออก | ผล | ความหมาย |
|---|---|---|
| เลือก 5 = 5; | 1 | TRUE |
| เลือกค่า NULL = NULL; | NULL | UNKNOWN |
| เลือก 5 > 5; | 0 | FALSE |
| เลือกค่าว่าง > ค่าว่าง; | NULL | UNKNOWN |
| SELECT 5 IS NULL; | 0 | FALSE |
| SELECT NULL IS NULL; | 1 | TRUE |
เปรียบเทียบเลขห้ากับตัวมันเอง จากนั้นทำซ้ำขั้นตอนเดียวกันกับค่าว่าง (NULL)
SELECT 5 =5; SELECT NULL = NULL;
| 5 =5 | NULL = NULL |
|---|---|
| 1 | NULL |
ผลลัพธ์แรกคือ 1 (จริง) ผลลัพธ์ที่สองคือค่าว่าง เนื่องจาก MySQL ไม่สามารถระบุได้ว่าค่าที่ไม่ทราบค่าหนึ่งเท่ากับค่าที่ไม่ทราบค่าอีกค่าหนึ่ง ตอนนี้ให้ใช้คีย์เวิร์ด IS NULL กับค่าเหล่านั้น
SELECT 5 IS NULL; SELECT NULL IS NULL;
| 5 IS NULL | NULL IS NULL |
|---|---|
| 0 | 1 |
คราวนี้คำตอบชัดเจนแล้ว คือ 0 (เท็จ) และ 1 (จริง) เฉพาะคำสั่ง IS NULL และ IS NOT NULL เท่านั้นที่จะให้คำตอบที่แน่นอนเมื่อมีค่า NULL เกี่ยวข้อง


