私はあなたが次のようなものを書くことができることを発見しました
SELECT NULL IS UNKNOWN
を返します1
。
他に使える場所はありますUNKNOWN
か?キーワードではないようです (できませんSELECT UNKNOWN
)。NULL IS NULL
も真である場合、どのような目的がUNKNOWN
ありますか?
私はあなたが次のようなものを書くことができることを発見しました
SELECT NULL IS UNKNOWN
を返します1
。
他に使える場所はありますUNKNOWN
か?キーワードではないようです (できませんSELECT UNKNOWN
)。NULL IS NULL
も真である場合、どのような目的がUNKNOWN
ありますか?
UNKNOWN
はBOOLEAN
NULL
... の単なるエイリアスです。これTRUE
は の単なるエイリアスで1
あり、のFALSE
エイリアスでもあります。MySql自体は の単なるエイリアスであるためです。0
BOOLEAN
TINYINT(1)
なぜそこにあるのですか?これは SQL-92 標準の一部であるためです。
<truth value> ::=
TRUE
| FALSE
| UNKNOWN
なぜあなたSELECT NULL
はSELECT TRUE
、、、できSELECT FALSE
ないのSELECT UNKNOWN
ですか?それ自体は MySql の新しいバージョンまでサポートされていなかったためUNKNOWN
、おそらく単なるバグです。
私には、MySQL では、ブールの意味で使用されるUNKNOWN
のエイリアスのようです。NULL
この参照を見つけることができました:
SQL では、すべての論理演算子が TRUE、FALSE、または NULL (UNKNOWN) に評価されます。
一般的な SQL NULL および UNKNOWN に関するその他の情報:
NOT NULL 制約によって制限されている場合、SQL BOOLEAN は他の言語のブール型のように機能します。ただし、BOOLEAN データ型は、その名前にかかわらず、TRUE、FALSE、および UNKNOWN の真理値を保持できます。これらはすべて、標準に従ってブール値リテラルとして定義されています。この規格はまた、NULL と UNKNOWN は「まったく同じことを意味するために交換可能に使用される可能性がある」と主張しています。
既知の値を持たないブール値を記述する場合にのみ使用します。最初の例で述べたように、これは と同等のブール値ですNULL
。
比較に NULL が含まれる場合、そのような場合に問題unknown
が発生します。
たとえば、次のクエリを考えてみましょう。
select* from tbl
where x>5
ここで、一部のタプルにx
列の null 値が含まれている可能性があると仮定します。さて、各タプルを評価しながら:
x>5
は true と評価されますx>5
は false と評価されます。x>5
評価されるでしょうか? (答え不明)ケース 3 については、true または false のいずれかを言うのは間違っています。したがって、ケース 3 を処理するために、別の論理値が sql に存在しunknown
ます。
(したがって、SQL には 3 つの論理値があります: true、false、unknown)
さて、ルールは次のとおりです。
where 句の述語がタプルに対して false または unknown と評価される場合、そのタプルは結果に追加されません。
したがって、上記の例では、ケース 1 のタプルのみが結果に追加されます。
このように、SQL は内部的に未知のものを扱います。
また、where 句の述語に複数の論理式が含まれている場合にも、いくつかの結果が得られます。
true and unknown
はunknown
false and unknown
はfalse
unknown and unknown
はunknown
true or unknown
はtrue
false or unknown
はunknown
unknown or unknown
はunknown
not unknown
はunknown