【新人教育 資料】第2章 SQLへの道 〜3値論理編〜

# 【新人教育 資料】第2章 SQLへの道 〜3値論理編〜
## あらすじ
新人がいっぱい入ってくる。新人のレベルもバラバラ。教育資料も古くなっているので、更新しましょう。
どうせなら、公開しちゃえばいいじゃん。という流れになり、新人教育用の資料を順次更新していくことにしました。

※後々、リクエストに応じて更新することが多いのでストックしておくことをおすすめします。

自分は[TEMONA株式会社](http://temona.co.jp/recruit/)でCTOをしていますが、頭でっかちに理論ばっかり学習するよりは、イメージがなんとなく掴めるように学習し、実践の中で知識を深めていく方が効率的に学習出来ると考えています。

※他の登壇やインタビュー記事は[Wantedly](https://www.wantedly.com/users/105935)から見てください。


教育スタイルとしては正しい事をきっちりかっちり教えるのではなく、未経験レベルの人がなんとなく掴めるように、資料を構成していきます。

以下のようなシリーズネタで進めます。

|No.|記事|
|:-----------|-----------|
|1|[【新人教育 資料】第1章 SQLへの道 〜DB編〜](http://qiita.com/devopsCoordinator/items/9b70e506150888e190be)|
|2|[【新人教育 資料】第2章 SQLへの道 〜3値論理編〜](http://qiita.com/devopsCoordinator/items/9c10410b50f8fcc2ba79)|
|3|[【新人教育 資料】第3章 SQLへの道 〜基本数学編〜](http://qiita.com/devopsCoordinator/items/08e405a9c58cc203d016)|
|4|[【新人教育 資料】第4章 SQLへの道 〜SQL基本操作編〜](http://qiita.com/devopsCoordinator/items/0f742158caf0fdb533e3)|
|5|[【新人教育 資料】第5章 SQLへの道 〜絞込編〜](http://qiita.com/devopsCoordinator/items/dca5aa9c155292f1c6ea)|
|6|[【新人教育 資料】第6章 SQLへの道 〜ソート編〜](http://qiita.com/devopsCoordinator/items/8cad032aa035dc1cdbc0)|
|7|[【新人教育 資料】第7章 SQLへの道 〜集合関数（SUM、MAX、MIN、AVG、COUNT）編〜](http://qiita.com/devopsCoordinator/items/85918c8508dddf19586f)|
|8|[【新人教育 資料】第8章 SQLへの道 〜グループ編〜](http://qiita.com/devopsCoordinator/items/f74228615982932c914b)|
|9|[【新人教育 資料】第9章 SQLへの道 〜結合編〜](http://qiita.com/devopsCoordinator/items/3ba154429973a4ddc9e0)|

では、今回もはじめていきましょう！

## 2値論理と3値論理
SQLを勉強していく中で、躓くポイントに３値理論というものがあるので、説明をしていきます。
ここで聞き慣れない「NULL(読み方はヌル)」というものにも触れて徐々に説明していくのでついてきてください。

###2値論理とは
ある命題にについて、真であるか否かを真偽値で示す論理。いやぁ日本語で書くともうそっとページを閉じたくなりますね。
論理学で**命題**をproposition と呼ぶ。そして正しい命題は真である true と呼ばれ, 正しくない命題は偽である false と呼ばれる。
２値論理は命題の結果を真偽値すなわち真(TRUE)と偽(FALSE)の２つの値で表現しましょうってことです。

 - TRUE：真
 - FALSE：偽

###3値論理とは
3値論理とは、真(TRUE)と偽(FALSE)の2つの真理値に加え第3の値「不明(UNKNOWN)」という値を加えた３つ値で表現されます。
SQLはこの3値論理が採用されています。一旦ここでは、ふーんというレベルで理解しておきましょう。

 - TRUE：真
 - UNKNOWN：不明
 - FALSE：偽

## NULLとNULLの種類
さぁ前段でSQLは3値論理を採用していると言いましたが、その元凶となっているNULL(読み方はヌル)です。
SQL上では、NULLという表現は1つしかありませんが
厳密に言うと、NULLには「未知（Unknown）」と、「適用不能（Not Applicable, Inapplicable）」と２つの種類が存在します。

###『未知（Unknown）』
では未知(Unknown)とは何でしょうか？未知(Unknown)とは現地点で知らないという事です。

例えば
「箱の中にある1枚のトランプ・カード」が入れている状況において

- カードのマークは？
- カードの数字は？

と聞かれたとしましょう。

箱をあけて見ない限りはトランプ・カードのマークや数字が何かは分かりません。

※超能力者なら分かってしまうかもしれませんが。。。

これが、『未知(Unknown)』です。

そこにトランプ・カードがあるならば、マークや数字が記載されているのは明らかですが
現時点において、未だ知らない状況なので『**未知(Unknown)**』といえます。

このような状況もSQLの世界ではNULLで表現されます。
 
###『適用不能（Not Applicable, Inapplicable）』
そしてもう1つ、SQLの世界でNULLと表現されるものに『適用不能（Not Applicable, Inapplicable）』があります。

さきほどの
「箱の中にある1枚のトランプ・カード」を例にとってみると

- カードの職歴は?

と聞かれたらどうでしょう？

思わず、知らんがなって言いたくなりますよね？
これが、『適用不能（Not Applicable, Inapplicable）』です。

今回のケースも「分からない」と状況でありますが、そもそもトランプ・カードに職歴という概念が存在しません。
聞かれたところで、適用が出来ない状況、『適用不能（Not Applicable, Inapplicable）』といえます。

２種類のNULLを整理すると、
「未知」のNULLは現状は不明だが、「いずれ分かる可能性があるもの」
「適用不能」のNULLは「そもそも分かる可能性がないもの」。

SQLでは双方がNULLと表現されます。

ちなみに言うとNULLはNULLです。NULLという状況を示すラベル表記だと思ってください。

## NOTとANDとOR
2値論理と3値論理をNOT、AND、ORの真理表にすると下記のようになります。

![2値論理と3値論理比較(AND,OR,NOT)](https://qiita-image-store.s3.amazonaws.com/0/74153/f4033c09-616d-2575-e6ee-854b6cf99ead.png "2値論理と3値論理比較(AND,OR,NOT)")


## 3値論理におけるANDとORの優先順位
上記の3値論理の図を覚えるのはなかなか大変です。
考え方のコツとして、3つの真理値の間に次のような優先順位があると考えましょう。
 ■ **ANDの場合 ： false ＞ unknown ＞ true**
 ■ **ORの場合　： true ＞ unknown ＞ false**

強い方が弱い方を打ち消します。

【例】
「true AND unknown」だと、unknownの方が強いので、結果はunknownになります。
「true OR unknown」だと、trueの方が強いので、結果はtrueになります。

「false AND unknown」だと、falseの方が強いので、結果はfalseになります。
「false OR unknown」だと、unknown方が強いので、結果はunknownになります。

この順位を覚えておけば、3値論理演算も計算がしやすくなります。

特に、ANDの演算に**unknown**が含まれた場合、
結果が絶対に**trueにならない**という特徴をよく覚えておいてください。

## あとがき
[TEMONAに興味持ってくれると嬉しいです](https://www.green-japan.com/company/4109)