

**対象のテーブル定義と内容**

[code]

    CREATE TABLE r
        (`id` int, `age` int)
    ;
    
    INSERT INTO r
        (`id`, `age`)
    VALUES
        (1, 1),
        (2, 2),
        (3, 5),
        (4, 7),
        (5, 9)
    ;
    
[/code]

**抽出したい結果**  
「idが3ではない」または「ageが2ではない」レコード

1, 1  
4, 7  
5, 9

**試したSQL1**  
意図しない結果になりました。  
下記はどういう意味になるのですか？

[code]

     SELECT * FROM `r` WHERE  `id` != 3 OR `age` != 2;
    
[/code]

**試したSQL2**  
意図した結果を取得できたのですが、(ANDなのに)なぜですか？  
これは否定の論理和ですか？？

[code]

    SELECT * FROM `r` WHERE  `id` != 3 AND `age` != 2;
    
[/code]


CC BY-SA 4.0
2019-06-13T11:05:13.363
55754
2019-06-14T00:58:04.727
2019-06-14T00:58:04.727
3060
7886
question
mysql
WHERE句で否定の論理和？


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のベン図を書いてみて、その逆のベン図を描いてみるのもわかりやすいかもしれません。


CC BY-SA 4.0
2019-06-13T13:21:13.337
55761
2019-06-13T13:21:13.337
30796
55754
answer