NOT IN と <> ALL 演算子
右辺に列挙された値のどれとも一致しない場合に真となる。
SELECT * FROM movie WHERE genre NOT IN ('アクション', 'ホラー', 'アニメ');
SELECT * FROM movie WHERE genre <> ALL ('アクション', 'ホラー', 'アニメ');
-- genre が「アクション」でも「ホラー」でも「アニメ」でもない行を抽出
NOT IN の右辺に1つでもNULLが含まれる場合
SELECT * FROM movie WHERE genre NOT IN ('アクション', 'ホラー', NULL);
- 右辺に列挙された値を不等号を使って1つずつ比較し、全ての値と等しくないことを判定する。
SELECT * FROM movie WHERE (genre <> 'アクション') AND (genre <> 'ホラー') AND (genre <> NULL);
-
=
や<>
などの通常の比較演算子は、もともと値と値を比較するためのもの。
よって、「値ではないNULL」を比較すると、不明な結果である UNKNOWN になる。
SELECT * FROM movie WHERE (genre <> 'アクション') AND (genre <> 'ホラー') AND UNKNOWN;
- (条件式) AND UNKNOWN の結果は UNKNOWN または FALSE になる。
SELECT * FROM movie WHERE UNKNOWN(または FALSE);
- WHERE句による絞り込みは、条件式が TRUE となる行だけが選ばれる。条件式が FALSE や UNKNOWN となる行は処理対象にならない。
よって、NOT IN の右辺に1つでもNULLが含まれると、処理結果は1行も得られない。
<> ALL も同様の挙動となる。
参考図書:スッキリわかるSQL入門 第2版