質問: **対象のテーブル定義と内容** ``` CREATE TABLE r (`id` int, `age` int) ; INSERT INTO r (`id`, `age`) VALUES (1, 1), (2, 2), (3, 5), (4, 7), (5, 9) ; ``` **抽出したい結果** 「idが3ではない」または「ageが2ではない」レコード 1, 1 4, 7 5, 9 **試したSQL1** 意図しない結果になりました。 下記はどういう意味になるのですか? ``` SELECT * FROM `r` WHERE `id` != 3 OR `age` != 2; ``` **試したSQL2** 意図した結果を取得できたのですが、(ANDなのに)なぜですか? これは否定の論理和ですか?? ``` SELECT * FROM `r` WHERE `id` != 3 AND `age` != 2; ```
回答: SQL1は、否定論理和(NOR)でSQL2は否定論理積(NAND)です。 逆事象で考えるとわかりやすいかと思います。 SQL1は、id=3 AND age=2(A∩B)の逆事象なので、id!=3 OR age!=2(notA ∪ notB)となります。 意味でいうと(3,2)の組み合わせの逆事象なので、(3,2)の組み合わせ以外のものをSELECTしますとなります。 SQL2は、id=3 or age=2(A∪B)の逆事象なので、id!=3 AND age!=2(notA ∩ notB)となります。 id=3 or age=2でselectされる(2, 2)(3, 5)、これの逆事象なのでそれ以外が返ってきます。 また、A and BとA or Bのベン図を書いてみて、その逆のベン図を描いてみるのもわかりやすいかもしれません。