「SQL」カテゴリーアーカイブ

相関サブクエリで行と行を比較する

CodeZine:相関サブクエリで行と行を比較する(SQL, DB)

3値論理とNULL

http://codezine.jp/a/article/aid/532.aspx

 しかし、NOTの場合は単純だからいいとして、ANDとORの組み合わせを全部覚えるのはなかなか大変です。そこで、3つの真理値の間に次のような優先順位があると考えてください。
* ANDの場合: false > unknown > true
* ORの場合 : true > unknown > false
 強い方が弱い方を呑み込みます。例えば、「true AND unknown」なら、unknownの方が強いので、結果もunknownになります。ところが、「true OR unknown」の場合、今度はtrueの方が強くなるので、結果はtrueになります。この順位を覚えておけば、3値論理演算も見通しがよくなります。特に、ANDの演算にunknownが含まれた場合、結果が絶対にtrueにならないという特徴をよく覚えておいてください。後でこれが重要なキーになります。

http://codezine.jp/a/article.aspx?aid=532&p=2

NOT INのサブクエリで使用されるテーブルの選択列にNULLが存在する場合、SQL全体の結果は常に空になります。これは恐ろしい現象です。
正しい結果を得るには、EXISTS述語を使って書きます。
EXISTS述語が絶対にunknownを返さないからです。EXISTSは、trueとfalseしか返しません。そのために、INとEXISTSは同値変換が可能なのに、NOT INとNOT EXISTSは同値ではないという紛らわしい状況が生じています。

http://codezine.jp/a/article.aspx?aid=532&p=2

...これは、入力が空テーブル(空集合)だった場合はNULLを返すという極値関数の仕様によります。...入力が空テーブルだった場合にNULLを返すのは、極値関数だけではありません。COUNT関数以外の集約関数もそうです。