「達人に学ぶSQL徹底指南書」を読む(1) − 集合演算子は nullとnullを「等しい」とみなす。なぜ?

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

これは名著。論理学と集合論の基礎的な用語をほんの少し導入することで、SQLというものの見通しが断然よくなるのな。
まだ読み終わってないんだけど、思うところをぽつぽつ書いていきます。


P-125で、2つのテーブルの内容が等しいかどうかをチェックするクエリ*1

select count(*) 
from (
   select * from tbl_A
   union 
   select * from tbl_B
) TMP

について、

このクエリは、NULLを含むテーブルにも正しく動作しますし、列数や列名、データ型を
一切指定せずに使えるのが便利なところです。

てサラッと書いてあるんだけど、太字にしたところで軽いショックを受けた。
考えたこと無かったんだけど、言われてみれば集合演算子では NULLイコールNULL だ。NULL≠NULLであるNULLイコールNULLではない比較演算子と挙動が違う理由がわからない。
たぶん集合演算子と比較演算子は背景の理論が違うからなのだと思うが、集合演算子が NULLイコールNULL と判断する、数学的・論理学的な裏付けとはいったい何でしょう。

*1:このクエリと、select count(*) from tbl_A と、select count(*) from tbl_B が全部同じ結果を返したら、2つのテーブルの内容が等しいという話