こんにちは!2025年に新卒で入社したWebアプリケーショングループの田嶋です!
はじめに
昨年12月の記事で宣言した通り、新卒の田嶋・外囿とテックリードの伊尾木の3人でデータベーススペシャリスト試験に挑戦しています!
今回はその月次連載の第1回目として、3月号をお届けします。
今月は午前IIの過去問を中心に勉強を進めていたのですが、平成29年度 午前II 問9の3値論理の問題で間違えてしまいました。
解説の真理値表を見ても「え?どういうこと?」という状態でした。
unknown AND unknown → unknown は「不明同士だから不明」と納得できたものの、 unknown AND false → false や unknown OR true → true のように片方が確定値のときに結果が変わるのは理解できませんでした。
その後、伊尾木さんにロジックを教えてもらってようやく腑に落ちたので、今回はその内容を整理してみます。
SQLにおけるNULL
3値論理の話へ入る前に、まずNULLについて整理します。
自分はNULLを「空っぽの値」くらいに思っていたのですが、勉強してみるとNULLは「0」でも「空文字」でもなく、値そのものが不明・未定義である状態を意味するものでした。
NULLには以下の2つの意味があるとされています。
| 種類 | 意味 | 例 |
|---|---|---|
| 未知(Unknown) | 値は存在するが、現時点ではわからない | 登録されていない電話番号 |
| 適用不能(Not Applicable) | そもそも値が存在し得ない | 独身者の配偶者名 |
ただ、SQL上でこの2種類は区別されないので、大事なのは「NULLは値ではない」という点だけです。
3値論理とは
一般的なプログラミング言語では、条件式の結果はTRUEかFALSEの2つです。
これを2値論理(Two-Valued Logic)と呼びます。
一方、SQLではNULLの存在により、条件式の結果がTRUE・FALSE・UNKNOWNの3つになります。
これが3値論理(Three-Valued Logic)です。
自分はどちらも問9の問題を機に初めて知りました。
例えば、以下のSQL文を考えてみます。
SELECT * FROM users WHERE age = NULL;
ageが30の行があったとして、30 = NULLの結果は何になるでしょうか。
自分は最初FALSEだと思ったのですが、答えはUNKNOWNです。
NULLは「不明な値」なので、それと比較した結果も「不明」になります。
3値論理の真理値表
3値論理を正しく理解するには、AND・ORの各演算でUNKNOWNがどう振る舞うかを把握する必要があります。
はじめにで書いた通り、自分は真理値表を見ても unknown AND false → false や unknown OR true → true がなぜそうなるのか理解できませんでした。
そこで伊尾木さんに教えてもらったのが、unknownの部分にtrueとfalseをそれぞれ代入してみるという考え方です。
例えば unknown AND false の場合。
- unknownにtrueを入れてみる → true AND false → false。
- unknownにfalseを入れてみる → false AND false → false。
- どちらでもfalse → 結果はfalse確定。
次に unknown AND true の場合。
- unknownにtrueを入れてみる → true AND true → true。
- unknownにfalseを入れてみる → false AND true → false。
- 結果が割れる → 結果はunknown。
このように、両方代入して結果が同じなら確定、割れたらunknownになります。
この考え方でAND・ORの真理値表を改めて見ると、すべて納得できました。
AND
| x AND y | TRUE | FALSE | UNKNOWN |
|---|---|---|---|
| TRUE | TRUE | FALSE | UNKNOWN |
| FALSE | FALSE | FALSE | FALSE |
| UNKNOWN | UNKNOWN | FALSE | UNKNOWN |
OR
| x OR y | TRUE | FALSE | UNKNOWN |
|---|---|---|---|
| TRUE | TRUE | TRUE | TRUE |
| FALSE | TRUE | FALSE | UNKNOWN |
| UNKNOWN | TRUE | UNKNOWN | UNKNOWN |
WHERE句とUNKNOWN
WHERE句は、評価結果がTRUEの行だけを返します。
FALSEだけでなく、UNKNOWNの行も除外されるということは理解できたのですが、次の例で引っかかりました。
-- テーブル: employees -- | id | name | department | -- |----|--------|------------| -- | 1 | 田中 | 開発 | -- | 2 | 佐藤 | NULL | -- | 3 | 鈴木 | 営業 | SELECT * FROM employees WHERE department = '開発'; -- → 田中のみ返る(佐藤はUNKNOWNなので除外) SELECT * FROM employees WHERE department <> '開発'; -- → 鈴木のみ返る(佐藤はUNKNOWNなので除外)
2つ目のクエリで、自分は佐藤さんも返ってくると思っていました。
「開発じゃないんだから、NULLの佐藤さんも含まれるでしょ」と。
でも NULL <> '開発' の結果はFALSEではなくUNKNOWNなので、佐藤さんはここでも除外されます。
勉強の進捗
3月はそれぞれのペースで過去問や参考書を進めていました。
3値論理以外だと、候補キーを全て洗い出す問題に田嶋・外囿の2人で苦戦しています。
まだ完全に理解できていないので、来月は候補キーについて深掘りしていく予定です。
Studyplus Engineering Podcast
ほぼ毎週1回、Studyplus Engineering Podcastにてデータベーススペシャリスト試験の勉強進捗や議論を配信しています!
データベーススペシャリストを勉強されている方、少しでも興味のある方はぜひご視聴ください。
creators.spotify.com
おわりに
今回は3値論理について、自分がつまずいたポイントと伊尾木さんに教わった考え方を中心にまとめました。
1人で勉強していたら真理値表を丸暗記して終わっていたはずなので、3人で取り組んでいるメリットを早速感じています。
来月は候補キーについて書く予定です。
次回の更新もお楽しみに!