منطق سه ارزشی چیست؟

آیا می دانستید که ارزش شرط های WHERE، HAVING و ON در SQL یا درست است، یا نادرست و یا نامشخص؟ بله SQL برای ارزیابی تمامی شرط ها از منطق سه ارزشی استفاده می کند.
در SQL، مقادیر خالی یا گم شده را با NULL نشان می دهیم. یعنی اگر شما رکوردی را اینسرت کنید ولی برای فیلد خاصی، مقداری را مشخص نکنید مقدار آن فیلد با NULL نمایش داده می شود. به طور مثال در جدول Person.Person بسیاری از افراد دارای نام میانی نیستند. بنابراین نام میانی آن ها NULL می باشد. حال اگر بخواهیم کویری ای بنویسیم که این افراد را نمایش دهد، چه کنیم؟
این کویری را در نظر بگیرید:
SELECT * FROM Person.Person WHERE MiddleName = NULL
کویری بالا بر خلاف تصور ما، هیچ رکوردی را بر نمی گرداند. در صورتی که بیش از 8000 رکورد در این جدول، شامل افرادی است که نام میانی ندارند. علت چیست؟
ما عادت کرده ایم که عبارت های منطقی را به دسته های درست و نادرست ارزیابی کنیم. اما در دنیای ریاضیات، منطق های چند ارزشی وجود دارند که ارزیابی یک گزاره را در بیش از این دو دسته قرار می دهند. منطق سه ارزشی یکی از منطق های چند ارزشی است که دارای سه ارزش درست، نادرست و نامشخص است.
مقادیر NULL

در SQL، مقدار NULL نماینده مقادیر خالی یا گمشده می باشد. این که بخواهیم هنگام مقایسه یک مقدار مشخص یا یک مقدار NULL به ارزش درست یا نادرست برسیم کار غیر ممکنی است. این جاست که منطق سه ارزشی به میدان می آید. SQL برای پشتیبانی از مقادیر NULL در ارزیابی گزاره ها، از منطق سه ارزشی استفاده می کند.
ارزش تمام گزاره های زیر نامشص می باشد:
NULL = 1 NULL <> 1 NULL > 1 NULL = NULL
برای همین SQL از گزاره IS NULL برای یافتن مقادیر NULL استفاده می کند.
SELECT * FROM Person.Person WHERE MiddleName IS NULL
در قسمت های مختلف یک دستور SELECT، امکان فیلتر کردن و انتخاب مقادیر، رکورد ها یا گروه ها بر اساس یک شرط خاص فراهم می شود. شما این شرط ها را در دستورات CASE، ON، WHERE و HAVING مشاهده می کنید. تمامی گزاره ها در SQL امکان ترکیب شدن و ساخت یک گزاره منطقی بزرگتر را دارا هستند. برای این منظور از دستورات AND، OR و NOT استفاده می کنیم.
اما گزاره های ترکیبی، که هر کدام می توانند درست، نادرست یا نامشخص باشند؛ چگونه ارزیابی می شوند:
منطق دو ارزشی VS منطق سه ارزشی

بگذارید در ابتدا منطق دو ارزشی کلاسیک را مرور بکنیم.
جدول ارزشی این منطق به شکل زیر می باشد (T= TRUE, F = FALSE):
p OR q | p AND q | p = q | q | p |
T | T | T | T | T |
T | F | F | F | T |
T | F | F | T | F |
F | F | T | F | F |
NOT p | p |
F | T |
T | F |
در منطق سه ارزشی جداول فوق به صورت زیر تغییر می کنند:
(T= TRUE, F = FALSE, U = UNKNOWN):
p OR q | p AND q | p = q | q | p |
T | T | T | T | T |
T | F | F | F | T |
T | U | U | U | T |
T | F | F | T | F |
F | F | T | F | F |
U | F | U | U | F |
T | U | U | T | U |
U | F | U | F | U |
U | U | U | U | U |
NOT p | p |
F | T |
T | F |
U | U |
و اما نکته آخر
در تمامی شرط های موجود در کویری (CASE، ON، WHERE و HAVING) تنها گزاره هایی که مقدارشان با درست (TRUE) ارزیابی می شوند انتخاب شده و نادرست ها (FALSE) و نامشخص ها (UNKNOWN) حذف می شوند.