回答編集履歴

3

より厳密にしました。

2019/04/26 09:56

投稿

xebme
xebme

スコア1083

test CHANGED
@@ -12,9 +12,9 @@
12
12
 
13
13
  ```
14
14
 
15
- Bar が空集合の場合 False になります。
15
+ Bar が空集合の場合~~False になります。~~ True になりません。
16
16
 
17
- Bar のすべてのレコードの pid が NULL ならば False になります。
17
+ Bar ~~のすべてのレコード~~の pid が NULL ならば ~~False になります。~~ Trueになりません。
18
18
 
19
19
  それ以外は True です。
20
20
 
@@ -23,3 +23,49 @@
23
23
  **追記**
24
24
 
25
25
  B.pid が NULL の場合は、厳密にいうと、NULL in (... ) なので、3値論理の Unknown だと思います。
26
+
27
+
28
+
29
+ **追記2**
30
+
31
+ この in は、内部結合にすれば不要になります。そして、内部結合すら不要になり、Foo.pid の NOT NULL 制約に行きつくのでしょう。
32
+
33
+
34
+
35
+ **三値論理**
36
+
37
+
38
+
39
+ 今の時代、三値論理は必須ですね。短絡評価と併せて追記しておきます。
40
+
41
+ [三値論理](https://ja.wikipedia.org/wiki/3%E5%80%A4%E8%AB%96%E7%90%86)
42
+
43
+
44
+
45
+ SQLはクリーネの三値論理を採用している。
46
+
47
+ 三値論理は、True,Unknown,Falseの三値を使う論理である。三値には論理演算ごとに以下の規則がある。
48
+
49
+ - OR: True > Unknown > False (> 左側が優先度が高い)
50
+
51
+ - AND: False > Unknown > True (> 左側が優先度が高い)
52
+
53
+ - NOT: Unknown は Unknownに評価。その他は二値論理に同じ。
54
+
55
+
56
+
57
+ 三値論理でも二値論理と同様、短絡評価 (short circuit evaluation) が可能。
58
+
59
+ - 選言標準形(ORだけで構成された論理式): Trueが出現した時点で式全体がTrueになるので評価終了。
60
+
61
+ - 連言標準形(ANDだけで構成された論理式): Falseが出現した時点で式全体がFalseになるので評価終了。
62
+
63
+
64
+
65
+ ついでに、SQLにおいて、以下の比較演算子は True/False の2値を返す。
66
+
67
+ - IS NULL
68
+
69
+ - IS TRUE
70
+
71
+ - IS FALSE

2

Unknown を追加。難しくなってきた。

2019/04/26 09:55

投稿

xebme
xebme

スコア1083

test CHANGED
@@ -17,3 +17,9 @@
17
17
  Bar のすべてのレコードの pid が NULL ならば False になります。
18
18
 
19
19
  それ以外は True です。
20
+
21
+
22
+
23
+ **追記**
24
+
25
+ B.pid が NULL の場合は、厳密にいうと、NULL in (... ) なので、3値論理の Unknown だと思います。

1

追加、Bar のすべてのレコードの pid が NULL ならば False になります。

2019/04/22 18:08

投稿

xebme
xebme

スコア1083

test CHANGED
@@ -12,4 +12,8 @@
12
12
 
13
13
  ```
14
14
 
15
- Bar が空集合の場合に限り False になります。それ以外は True です。
15
+ Bar が空集合の場合 False になります。
16
+
17
+ Bar のすべてのレコードの pid が NULL ならば False になります。
18
+
19
+ それ以外は True です。