読者です 読者をやめる 読者になる 読者になる

SQLにおける存在仮定の原理

またもやSQLで??????ってなったのちに納得したので書く。

混乱したこと

要素が全てNULLのテーブル

user_id user_name
NULL NULL
NULL NULL
NULL NULL

ここで、「NullTableにuser_id=1のレコードが1つでも存在するか?」を確認する以下のSQL

SELECT (1 = ANY(SELECT user_id FROM NullTable)) AS any_null_result;
any_null_result
UNKNOWN

また、「NullTableのすべてのuser_idは1であるか?」を確認するSQLとその結果は以下になる。

SELECT (1 = ALL(SELECT user_id FROM NullTable)) AS all_null_result;
all_null_result
UNKNOWN

all_null_resultもany_null_resultもUNKNOWNとなる。SQLにおけるNULLは、「将来的に値が決まるかもしれないけど現時点では不明」を表すので、直感的にも正しい。

空のテーブル

では次は、要素が空のテーブルを考える。

user_id user_name

ここで、さきほどと同様に、まずは、「EmptyTableにuser_id=1のレコードが1つでも存在するか?」を確認するSQLとその結果は以下のようになる。

SELECT (1 = ANY(SELECT user_id FROM EmptyTable)) AS any_empty_result;
any_empty_result
FALSE

EmptyTableにレコードが存在しないので、当然user_id=1のレコードも存在しないので、これは当たり前。

問題は次。「EmptyTableのすべてのuser_idは1であるか?」を確認するSQLとその結果。

SELECT (1 = ALL(SELECT user_id FROM EmptyTable)) AS all_empty_result;
all_empty_result
TRUE

???

SQL「すべてのユーザのIDは1です!(ユーザがいるとは言っていない)」

みたいなね。きっつー。でもこれは正しい。

なんでこうなるか

SQLは存在仮定の原理に従うから。

例えば、ぼくは好きな人と付き合えるのかという命題を考えるときに、好きな人がいることを前提としていいのか?でも命題でちゃんと言ってないやん?空気読めってこと?厳密性皆無やん?ということで、古く論理学において議論の種だったらしい。

現代ではそれは「前提としない」ということになっている。好きな人が存在しない場合というのは、単に部分命題にすぎないという整理。

例えば、「ぼくは好きな人と付き合える」という文がTRUEだとすると、以下のように帰納的に理解できる。

  • 好きな人が3人いる場合: 3人と付き合える => TRUE
  • 好きな人が2人いる場合: 2人と付き合える => TRUE
  • 好きな人が1人いる場合: 1人と付き合える => TRUE
  • 好きな人が0人いる場合: 0人と付き合える => TRUE (好きな人が存在しない場合)

3人と付き合えるなら2人とも当然付き合えるし、それなら1人と付き合えるってことだし、じゃあ0人とも付き合える!みたいなね。

これを前段での例に当てはめると以下になる。

  • ユーザが0人いる場合: 0人のuser_idが1 => TRUE

そういうかんじ。

スマブラ強いやつが偉い

ニンテンドウオールスター! 大乱闘 スマッシュブラザーズ

ニンテンドウオールスター! 大乱闘 スマッシュブラザーズ

同世代の共通認識だと思うけど、スマブラ強いやつが一番偉い。なんだかんだで。スマブラ弱いやつが何を言っても説得力がない。スマブラ弱いくせに、ってなる。

ガーリィレコードという芸人コンビの、スマブラのワンシーンを再現した動画がTwitterで流れてきた。爆笑した。で、昨日無限大ホールで生のネタをみた。ファルコンとマリオの漫才。爆笑した。

参考

サブクエリ中のNULL比較

だれにも気づかれないレベルでさりげなくブログのタイトルを変えた。

それはどうでもいいとして、サブクエリにNULL比較を含むときの挙動で混乱したので書く。たぶんみんな知ってること。ぼくは知らなかった。なぜならポンコツだから。

続きを読む

ORDER BY句におけるNULLの同値性

アホすぎてSQLにおけるNULLの扱いが???ってなったので書く。

続きを読む

次に買うキーボード

いま使ってるキーボードはThinkPad USB Tracepoint Keyboardの旧型。Altキーが外れてカパカパしてて使いにくい。キーボード自体は気に入っているので同じのを買いたいけど、もう絶版で買えない。新型は微妙らしくて、次に何を買おうか悩みどころ。

続きを読む

プログラミング言語『Menhera(メンヘラ)』

土日の予定が清々しいほどにスカスカなので、クソみたいなプログラミング言語を作りました。
言語処理系に対する理解度がヤドカリのそれと同等なことに危機感をおぼえ、なんとなくお勉強しようと思ってやってみました。

続きを読む

2016年に買ってよかったもの(暗号化済)

セキュリティ意識が抜群なので、AES(256bit)で暗号化しました。

続きを読む

アプリケーション開発のアンチパターン

はいはいメリクリメリクリ。

O'Reilly Japan - SQLアンチパターン を、真夏の車中に放置された果汁グミくらいの柔らかさに噛み砕くシリーズ、最終回。

「Ⅳ部 アプリケーション開発のアンチパターン」です。

続きを読む