ที่นี่ฉันหวังว่าจะชี้แจงตำแหน่งของฉัน
NULL = NULL
ประเมินว่าFALSE
ผิด แฮ็กเกอร์และ Mister NULL
ตอบได้อย่างถูกต้อง นี่คือเหตุผล Dewayne Christensen เขียนถึงฉันในความคิดเห็นที่Scott Ivey :
ตั้งแต่เดือนธันวาคมลองใช้ตัวอย่างตามฤดูกาล ฉันมีของขวัญสองชิ้นใต้ต้นไม้ ตอนนี้คุณบอกฉันว่าฉันได้สองอย่างเดียวกันหรือไม่
พวกเขาอาจจะแตกต่างกันหรือพวกเขาจะเท่ากันคุณไม่รู้จนกว่าจะเปิดของขวัญทั้งสอง ใครจะรู้? คุณเชิญคนสองคนที่ไม่รู้จักซึ่งกันและกันและทั้งคู่ได้ทำของขวัญให้กับคุณ - หายาก แต่ไม่ใช่เป็นไปไม่ได้§ §
ดังนั้นคำถาม: UNKNOWN สองรายการนี้นำเสนอเหมือนกัน (เท่ากับ =) หรือไม่ คำตอบที่ถูกต้องคือ: UNKNOWN (เช่นNULL
)
ตัวอย่างนี้มีจุดประสงค์เพื่อแสดงให้เห็นว่า ".. (false
หรือnull
ขึ้นอยู่กับระบบของคุณ) .. " เป็นคำตอบที่ถูกต้อง - ไม่เพียง แต่ NULL
ถูกต้องใน 3VL (หรือไม่เป็นไรที่คุณจะยอมรับระบบที่ให้คำตอบที่ผิด) )
คำตอบที่ถูกต้องสำหรับคำถามนี้ต้องเน้นสองประเด็นนี้:
- ตรรกะสามค่า (3VL) เป็นเรื่องง่าย (ดูคำถามอื่น ๆ อีกมากมายในหัวข้อนี้ใน Stackoverflow และในฟอรัมอื่นเพื่อให้แน่ใจ);
- DBMS ที่ใช้ SQL มักจะไม่เคารพแม้แต่ 3VL พวกเขาให้คำตอบที่ผิดบางครั้ง (เช่นการยืนยันโปสเตอร์ดั้งเดิม, SQL Server ทำในกรณีนี้)
ดังนั้นฉันจึงย้ำ: SQL ไม่ได้บังคับให้แปลความหมายของความเท่าเทียมซึ่งเป็นสิ่งที่ดี:
for any x, x = x
§§ (ในภาษาอังกฤษธรรมดา: ไม่ว่าเอกภพแห่งวาทกรรมอะไรจะเป็น "สิ่ง" เสมอไป )
.. ใน 3VL A ( TRUE
, FALSE
, NULL
) ความคาดหวังของผู้คนจะสอดคล้องกับ 2VL ( TRUE
, FALSE
ซึ่งแม้ใน SQL จะใช้ได้สำหรับค่าอื่น ๆ ทั้งหมด) เช่นx = x
ประเมินเสมอ TRUE
สำหรับค่าใด ๆ เป็นไปได้ของ x - ไม่มีข้อยกเว้น
โปรดทราบว่า NULL นั้นถูกต้อง " ไม่ใช่ค่าที่ " ที่ (เนื่องจากคำขอโทษของพวกเขาแสร้งทำเป็นว่า) เป็นสิ่งที่เราสามารถกำหนดให้เป็นค่าแอตทริบิวต์ (??) เป็นส่วนหนึ่งของตัวแปรความสัมพันธ์ ดังนั้นจึงเป็นค่าที่ยอมรับได้ของทุกประเภท (โดเมน) ไม่เพียง แต่ประเภทของการแสดงออกทางตรรกะ
และนี่คือจุดของฉัน : NULL
ตามตัวอักษรคือ "สัตว์ประหลาด" ฉันชอบพูดว่า:ไร้สาระเรื่องไร้สาระ
ฉันคิดว่าสูตรนี้ชัดเจนกว่าและเป็นที่ถกเถียงกันน้อยกว่า - ขอโทษสำหรับความสามารถด้านภาษาอังกฤษของฉัน
นี่เป็นเพียงหนึ่งในปัญหาของ NULLs ดีกว่าที่จะหลีกเลี่ยงพวกเขาทั้งหมดเมื่อเป็นไปได้
§เรามีความกังวลเกี่ยวกับคุณค่าที่นี่ดังนั้นความจริงที่ว่าของขวัญทั้งสองมักเป็นวัตถุทางกายภาพที่แตกต่างกันสองรายการไม่ใช่การคัดค้านที่ถูกต้อง ถ้าคุณไม่มั่นใจฉันขอโทษที่นี่ไม่ใช่สถานที่ที่จะอธิบายความแตกต่างระหว่างค่าและความหมาย "วัตถุ" (พีชคณิตเชิงสัมพันธ์มีค่าความหมายจากจุดเริ่มต้น - ดูหลักการข้อมูลของ Codd ฉันคิดว่าผู้ใช้ SQL DBMS don ไม่สนใจเกี่ยวกับความหมายทั่วไป)
§§ความรู้ของฉันนี้เป็นความจริงที่ยอมรับ (ในรูปแบบหรืออื่น แต่ตีความเสมอใน 2VL ก) มาตั้งแต่สมัยโบราณและที่ว่าเพราะใช้งานง่ายเพื่อให้ 3VLs (เป็นตระกูลของ logics ในความเป็นจริง) เป็นการพัฒนาเมื่อเร็ว ๆ นี้ (แต่ฉันไม่แน่ใจว่าเมื่อไหร่ที่ถูกพัฒนาขึ้นครั้งแรก)
บันทึก Side:ถ้ามีคนจะแนะนำล่าง , หน่วยและตัวเลือกประเภทเป็นความพยายามในการที่จะปรับ SQL NULLs ผมจะเชื่อเฉพาะหลังจากการตรวจสอบรายละเอียดค่อนข้างที่จะแสดงให้เห็นถึงวิธีการใช้งาน SQL กับ NULLs มีระบบประเภทเสียงและจะชี้แจงในที่สุด NULL ใด ("ค่าที่ไม่ได้ค่อนข้างคุ้มค่า") เหล่านี้คืออะไรจริงๆ
ในสิ่งที่ติดตามฉันจะพูดผู้เขียนบางคน ข้อผิดพลาดหรือการละเว้นอาจเป็นของฉันและไม่ใช่ของผู้เขียนต้นฉบับ
Joe Celko บน SQL NULLs
ฉันเห็น Joe Celko มักอ้างถึงในฟอรัมนี้ เห็นได้ชัดว่าเขาเป็นนักเขียนที่เคารพนับถือมากที่นี่ ดังนั้นฉันจึงพูดกับตัวเองว่า: "เขาเขียนอะไรเกี่ยวกับ SQL NULLs เขาอธิบายปัญหา NULLs ได้อย่างไร" หนึ่งในเพื่อนของฉันมีSQL ebook ของJoe Celko สำหรับ smartiesรุ่น ebook การเขียนโปรแกรม SQL ขั้นสูงรุ่นที่ 3ขั้นสูงรุ่นที่ มาดูกัน.
ก่อนสารบัญ สิ่งที่ทำให้ฉันประทับใจมากที่สุดคือจำนวนครั้งที่ NULL ถูกกล่าวถึงและในบริบทที่หลากหลายที่สุด:
3.4 เลขคณิตและ NULLs 109
3.5 การแปลงค่าไปยังและจาก NULL 110
3.5.1 NULLIF () ฟังก์ชัน 110
6 NULLs: ข้อมูลที่ขาดหายไปใน SQL 185
6.4 การเปรียบเทียบ NULLs 190
6.5 NULLs และตรรกะ 190
6.5.1 NULLS ในแบบสอบถามย่อย 191
6.5.2 มาตรฐาน โซลูชัน SQL 193
6.6 คณิตศาสตร์และ NULLs 193
6.7 ฟังก์ชันและ NULLs 193
6.8 NULL และภาษาโฮสต์ 194
6.9 คำแนะนำการออกแบบสำหรับ NULLs 195
6.9.1 หลีกเลี่ยง NULLs จากโปรแกรมโฮสต์ 197
6.10 หมายเหตุเกี่ยวกับค่า NULL หลายค่า 198
10.1 IS NULL Predicate 241
10.1 1 แหล่งที่มาของ NULLs 242
...
และอื่น ๆ มันดัง "กรณีพิเศษที่น่ารังเกียจ" ให้ฉัน
ฉันจะเข้าไปดูบางส่วนของหนังสือเหล่านี้พร้อมข้อความที่ตัดตอนมาจากหนังสือเล่มนี้พยายาม จำกัด ตัวเองให้จำเป็นสำหรับเหตุผลด้านลิขสิทธิ์ ฉันคิดว่าคำพูดเหล่านี้ตกอยู่ในหลักคำสอน "การใช้อย่างเป็นธรรม" และพวกเขาสามารถกระตุ้นให้ซื้อหนังสือได้ - ดังนั้นฉันหวังว่าจะไม่มีใครบ่นได้ นอกจากนี้ฉันจะละเว้นจากการรายงานข้อมูลโค้ดด้วยเหตุผลเดียวกัน ขอโทษด้วยกับเรื่องนั้น. ซื้อหนังสือเพื่ออ่านเหตุผลเกี่ยวกับการบันทึกข้อมูล
หมายเลขหน้าระหว่างวงเล็บในสิ่งที่ตามมา
ข้อ จำกัด ไม่เป็นโมฆะ (11)
ข้อ จำกัด ของคอลัมน์ที่สำคัญที่สุดคือ NOT NULL ซึ่งห้ามการใช้ NULL ในคอลัมน์ ใช้ข้อ จำกัด นี้เป็นประจำและลบออกเมื่อคุณมีเหตุผลที่ดีเท่านั้น มันจะช่วยให้คุณหลีกเลี่ยงภาวะแทรกซ้อนของค่า NULLเมื่อคุณทำการสอบถามกับข้อมูล
มันไม่ได้เป็นค่า ; มันเป็นเครื่องหมายที่ถือสถานที่ที่ค่าอาจไป
อีกครั้ง "ค่านี้ แต่ไม่ค่อนข้างค่า" ไร้สาระ ที่เหลือดูเหมือนจะสมเหตุสมผลสำหรับฉัน
(12)
กล่าวโดยย่อ NULL ทำให้เกิดคุณสมบัติที่ผิดปกติจำนวนมากใน SQL ซึ่งเราจะกล่าวถึงในภายหลัง ทางออกที่ดีที่สุดของคุณคือการจดจำสถานการณ์และกฎของ NULL เมื่อคุณไม่สามารถหลีกเลี่ยงได้
เรื่องของ SQL, NULL และอนันต์:
(104) บทที่ 3: ข้อมูลตัวเลขใน SQL
SQL ไม่ยอมรับโมเดล IEEE สำหรับคณิตศาสตร์ด้วยเหตุผลหลายประการ
...
หากกฎ IEEE สำหรับคณิตศาสตร์ได้รับอนุญาตใน SQL เราจะต้องใช้กฎการแปลงประเภทสำหรับอนันต์และวิธีการแสดงค่าตัวเลขที่แน่นอนหลังจากการแปลง ผู้คนมีปัญหากับ NULL มากพอดังนั้นอย่าไปที่นั่น
การปรับใช้ SQL ที่ไม่ได้ตัดสินใจเกี่ยวกับความหมายของ NULL ในบริบทเฉพาะ:
3.6.2 ฟังก์ชันเลขชี้กำลัง (116)
ปัญหาคือลอการิทึมจะไม่ได้กำหนดเมื่อ (x <= 0) การใช้ SQL บางตัวส่งคืนข้อความแสดงข้อผิดพลาดบางคนส่งคืนNULLและ DB2 / 400 เวอร์ชัน 3 รีลีส 1 ส่งคืน * NEGINF (ย่อมาจาก“ infinity เชิงลบ”) ตามผลลัพธ์
Joe Celko อ้างถึง David McGoveran และ CJ Date:
6 NULLs: ไม่มีข้อมูลใน SQL (185)
ในหนังสือของพวกเขาA Guide to Sybase และ SQL Server David McGoveran และ CJ Date กล่าวว่า“ มันเป็นความเห็นของนักเขียนคนนี้มากกว่า NULLs อย่างน้อยที่กำหนดไว้ในปัจจุบันและนำไปใช้ใน SQL นั้นมีปัญหามากกว่าที่ควรและควรหลีกเลี่ยง พวกเขาแสดงพฤติกรรมที่แปลกและไม่สอดคล้องกันมากและอาจเป็นแหล่งที่มาของข้อผิดพลาดและความสับสน (โปรดทราบว่าความคิดเห็นและการวิพากษ์วิจารณ์เหล่านี้ใช้กับระบบใด ๆ ที่สนับสนุน NULL แบบ SQL ไม่ใช่เฉพาะกับ SQL Server โดยเฉพาะ)”
NULLs เป็นการติดยา :
(186/187)
ในส่วนที่เหลือของหนังสือเล่มนี้ฉันจะแนะนำให้คุณไม่ใช้พวกเขาซึ่งอาจดูขัดแย้ง แต่ไม่ใช่ คิดว่าเป็นโมฆะเป็นยาเสพติด; ใช้อย่างถูกต้องและใช้งานได้สำหรับคุณ แต่ใช้งานในทางที่ผิดและสามารถทำลายทุกสิ่งได้ นโยบายที่ดีที่สุดของคุณคือการหลีกเลี่ยงค่า NULL เมื่อคุณสามารถและใช้อย่างถูกต้องเมื่อคุณต้องการ
ข้อคัดค้านที่ไม่ซ้ำกันของฉันคือการ "ใช้อย่างถูกต้อง" ซึ่งโต้ตอบกับพฤติกรรมการใช้งานที่ไม่ดี
6.5.1 NULLS ในภาคย่อยแบบสอบถาม (191/192)
คนลืมว่าแบบสอบถามย่อยมักจะซ่อนการเปรียบเทียบกับ NULL พิจารณาสองตารางนี้:
...
ผลลัพธ์จะว่างเปล่า นี่คือcounterintuitiveแต่ถูกต้อง
(คั่น)
6.5.2 โซลูชัน SQL มาตรฐาน (193)
SQL-92 แก้ไขปัญหา 3VL (ตรรกะสามค่า) บางส่วนโดยการเพิ่มเพรดิเคตใหม่ของแบบฟอร์ม:
<เงื่อนไขการค้นหา> คือ [ไม่ใช่] TRUE | เท็จ UNKNOWN
แต่ UNKNOWN เป็นแหล่งของปัญหาในตัวของมันเองดังนั้น CJ Date ในหนังสือของเขาที่อ้างถึงด้านล่างจึงแนะนำอีกครั้งในบทที่4.5 หลีกเลี่ยง Nulls ใน SQL :
- อย่าใช้คำว่าไม่รู้จักไม่ว่าในกรณีใด ๆ
อ่าน"ASIDE"บน UNKNOWN และลิงก์ด้านล่าง
6.8 NULLs และภาษาโฮสต์ (194)
อย่างไรก็ตามคุณควรรู้ว่าจะจัดการ NULL อย่างไรเมื่อต้องผ่านไปยังโปรแกรมโฮสต์ ไม่มีภาษาโฮสต์มาตรฐานที่กำหนดการฝังรองรับ NULL ซึ่งเป็นอีกเหตุผลที่ดีที่จะหลีกเลี่ยงการใช้ใน schema ฐานข้อมูลของคุณ
(คั่น)
6.9 คำแนะนำการออกแบบสำหรับ NULLs (195)
มันเป็นความคิดที่ดีที่จะประกาศตารางฐานทั้งหมดของคุณด้วยข้อ จำกัด ไม่เป็นโมฆะในทุกคอลัมน์เมื่อทำได้ NULLs สร้างความสับสนให้กับคนที่ไม่รู้จัก SQL และค่า NULL นั้นมีราคาแพง
การคัดค้าน: NULLs สร้างความสับสนแม้กระทั่งผู้ที่รู้จัก SQL เป็นอย่างดีดูด้านล่าง
(195)
ควรหลีกเลี่ยงค่า NULL ในคีย์ต่างประเทศ SQL ช่วยให้ความสัมพันธ์นี้ "ประโยชน์ของข้อสงสัย" แต่อาจทำให้ข้อมูลสูญหายในการสืบค้นที่เกี่ยวข้องกับการรวม ตัวอย่างเช่นกำหนดรหัสหมายเลขชิ้นส่วนในสินค้าคงคลังที่อ้างถึงเป็นคีย์ต่างประเทศโดยตารางคำสั่งซื้อคุณจะมีปัญหาในการรับรายชื่อของชิ้นส่วนที่มีค่า NULL นี่คือความสัมพันธ์ที่บังคับ; คุณไม่สามารถสั่งซื้อชิ้นส่วนที่ไม่มีอยู่ได้
(คั่น)
6.9.1 หลีกเลี่ยง NULL จากโปรแกรมโฮสต์ (197)
คุณสามารถหลีกเลี่ยงการใส่ NULL ลงในฐานข้อมูลจากโปรแกรมโฮสต์ด้วยวินัยการเขียนโปรแกรมบางอย่าง
...
- กำหนดผลกระทบของข้อมูลที่หายไปในการเขียนโปรแกรมและการรายงาน:
คอลัมน์ตัวเลขที่มีค่า NULL เป็นปัญหาเนื่องจากแบบสอบถามที่ใช้ฟังก์ชันการรวมสามารถให้ผลลัพธ์ที่ทำให้เข้าใจผิด
(คั่น)
(227)
SUM () ของชุดว่างเปล่าเป็น NULL เสมอ หนึ่งในข้อผิดพลาดทั่วไปของการเขียนโปรแกรมที่เกิดขึ้นเมื่อใช้เคล็ดลับนี้คือการเขียนเคียวรีที่อาจส่งคืนมากกว่าหนึ่งแถว หากคุณไม่ได้คิดคุณอาจเขียนตัวอย่างสุดท้ายเป็น: ...
(คั่น)
10.1.1 แหล่งที่มาของ NULLs (242)
เป็นสิ่งสำคัญที่ต้องจำตำแหน่งที่ NULL สามารถเกิดขึ้นได้ พวกเขาเป็นมากกว่าเพียงแค่ค่าที่เป็นไปในคอลัมน์ ฟังก์ชันการรวมในชุดว่าง, OUTER JOIN, นิพจน์ทางคณิตศาสตร์ที่มี NULLs, และตัวดำเนินการ OLAP ส่งคืน NULL ทั้งหมด โครงสร้างเหล่านี้มักปรากฏเป็นคอลัมน์ใน VIEW
(คั่น)
(301)
พบปัญหาอื่นของ NULL เมื่อคุณพยายามแปลง IN predicates เป็น EXISTS predicates
(คั่น)
16.3 ฟังก์ชั่นการเพรดิเคตและ Extrema (313)
ในตอนแรกมันเป็นเรื่องธรรมดาที่ทั้งสองเพรดิเคตนั้นไม่เหมือนกันใน SQL:
...
แต่คุณต้องจำกฎสำหรับฟังก์ชั่น extrema - พวกมันดรอป NULL ทั้งหมดก่อนที่จะคืนค่าที่มากกว่าหรือน้อยกว่า เพรดิเคต ALL จะไม่ปล่อย NULL ดังนั้นคุณสามารถรับได้ในผลลัพธ์
(คั่น)
(315)
อย่างไรก็ตามความหมายในมาตรฐานจะถูกเขียนในเชิงลบเพื่อให้ NULL ได้รับประโยชน์จากข้อสงสัย ...
อย่างที่คุณเห็นมันเป็นความคิดที่ดีที่จะหลีกเลี่ยง NULL ในข้อ จำกัด ที่ไม่เหมือนใคร
การสนทนากลุ่มตาม:
NULL ได้รับการปฏิบัติราวกับว่าพวกเขาทุกคนเท่าเทียมกันและจัดตั้งกลุ่มของตัวเอง แต่ละกลุ่มจะถูกลดขนาดเป็นแถวเดียวในตารางผลลัพธ์ใหม่ที่แทนที่กลุ่มเก่า
ซึ่งหมายความว่าสำหรับ GROUP BY clause NULL = NULL ไม่ได้ประเมินเป็น NULL เช่นเดียวกับใน 3VL แต่จะประเมินเป็น TRUE
มาตรฐาน SQL สับสน:
คำสั่งซื้อและค่า NULL (329)
ไม่ว่าจะเป็นค่าคีย์การเรียงลำดับที่เป็นโมฆะถือว่ามากกว่าหรือน้อยกว่าค่าที่ไม่เป็นโมฆะคือการกำหนดใช้งาน แต่ ...
... มีผลิตภัณฑ์ SQL ที่ใช้วิธีใดวิธีหนึ่ง
ในเดือนมีนาคมปี 1999 คริสฟาร์รานำขึ้นคำถามจากหนึ่งในนักพัฒนาของเขาว่าทำให้เขาต้องตรวจสอบส่วนหนึ่งของมาตรฐาน SQL ที่ฉันคิดว่าฉันเข้าใจ คริสพบความแตกต่างระหว่างความเข้าใจทั่วไปและถ้อยคำที่เกิดขึ้นจริงของสเปค
และอื่น ๆ ฉันคิดว่าเพียงพอโดย Celko
CJ Date บน SQL NULLs
CJ Date มีความรุนแรงมากขึ้นเกี่ยวกับ NULLs: หลีกเลี่ยง NULL ใน SQL ระยะเวลา ในความเป็นจริงบทที่ 4 ของSQL และทฤษฎีเชิงสัมพันธ์ของเขา: วิธีการเขียนรหัส SQL ที่ถูกต้องมีชื่อว่า "NO DUPLICATES, NO NULLS" พร้อมกับบทย่อย
"4.4 มีอะไรผิดปกติกับ Nulls" และ "4.5 การหลีกเลี่ยงค่า Null ใน SQL" (ไปตามลิงก์: ขอบคุณ Google หนังสือคุณสามารถอ่านหน้าออนไลน์ได้บางหน้า)
Fabian Pascal บน SQL NULLs
จากปัญหาการปฏิบัติในการจัดการฐานข้อมูล - การอ้างอิงสำหรับผู้ประกอบการคิด (ไม่มีข้อความที่ตัดตอนมาขอโทษออนไลน์):
10.3 ผลกระทบเชิง Pratical
10.3.1 SQL NULLs
... SQL ทนทุกข์ทรมานจากปัญหาที่เกิดขึ้นใน 3VL เช่นเดียวกับจากนิสัยใจคอ, ความยุ่งเหยิง, การต่อต้านการตอบโต้และข้อผิดพลาดทันที [10, 11]; ในหมู่พวกเขามีดังต่อไปนี้:
- ฟังก์ชันการรวม (เช่น SUM (), AVG ()) จะละเว้นค่า NULL (ยกเว้น COUNT ())
- นิพจน์สเกลาร์บนตารางที่ไม่มีแถวจะประเมินค่าเป็น NULL ไม่ถูกต้องแทนที่จะเป็น 0
- นิพจน์ "NULL = NULL" ประเมินเป็น NULL แต่จริง ๆ แล้วไม่ถูกต้องใน SQL ORDER BY ถือว่า NULL เท่ากัน (สิ่งที่พวกเขานำหน้าหรือติดตามค่า "ปกติ" จะถูกปล่อยให้ผู้ขาย DBMS)
- นิพจน์ "x IS NOT NULL" ไม่เท่ากับ "NOT (x IS NULL)" เช่นเดียวกับในกรณี 2VL
...
ทั้งหมดดำเนินการในเชิงพาณิชย์ภาษา SQL ตามนี้วิธี 3VL และจึงไม่เพียง แต่พวกเขา exibits ปัญหาเหล่านี้ แต่พวกเขายังมีปัญหาการใช้ spefic ซึ่งแตกต่างกันไปในผลิตภัณฑ์