- ベストアンサー
ANDとORの正確な理解が出来ません。。
- ANDとORの正確な理解が出来ません。
- 問題文のSQLのWHERE句は「DEPTNOが10でも20でもない物」を取ると理解しています。
- b.の文は「10でない、かつ20でない」という条件を満たすレコードを取得するため、b.のみが正解です。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>テーブルの中にDEPTNOの値が 「5,10,15,20,25」だったとして、 >問題文もa.もb.も5,15,25が取られるのではないか? 5、15、25だけに注目していては、絶対に理解できない。 >なぜb.のみが正解なのか?どうしても理解できません。 >どういうレコードがあるとき、a. と b.の結果は変わるのでしょうか? DEPTNOの値が「5,10,15,20,25」の時、 <>10に一致する物は「5,15,20,25」です(20が入っている事に注目) <>20に一致する物は「5,10,15,25」です(10が入っている事に注目) a.の文は「<>10に一致する物 または <>20に一致する物」です。 「5,15,20,25」か「5,10,15,25」か、どっちか片方に1個でもあるなら、それが返って来ます。 なので、返って来る結果は「5,10,15,20,25」です。 結局、全部のデータが返って来ます。 b.の文は「<>10に一致する物 かつ <>20に一致する物」です。 「5,15,20,25」と「5,10,15,25」の「両方にある物だけ」が返って来ます。 なので、返って来る結果は「5,15,25」です。 片方だけにしか無い10,20は返って来ません。 こういう場合は「逆条件」を作ってみると、正解か不正解か判ります。 「A かつ B」の逆条件は「Aの否定 または Bの否定」になります。 「A または B」の逆条件は「Aの否定 かつ Bの否定」になります。 「赤くて甘いりんご(赤い かつ 甘い)」の逆は「赤くないか、甘くないりんご(赤くない または 甘くない)」です。 「赤いか、または、甘いりんご」の逆は「赤くなくて、甘くないりんご(赤くない かつ 甘くない)」です。 では「10でない かつ 20でない」の逆は? 逆条件は、それぞれを否定して「かつ」を「または」に変えますから「10でないの否定 または 20でないの否定」です。 「10でないの否定」は「10である」です。「20でないの否定」は「20である」です。 従って「10でないの否定 または 20でないの否定」は「10 または 20」になります。 「5,10,15,20,25の中で、10 または 20はどれですか?」の答えは「10,20」ですよね。 条件を逆にしていた訳ですから「その逆はどれですか?」の答えは「5,15,25」ですよね。 これが「a.の文」です。 では次に「10でない または 20でない」の逆は? 逆条件は、それぞれを否定して「または」を「かつ」に変えますから「10でないの否定 かつ 20でないの否定」です。 「10でないの否定 かつ 20でないの否定」は「10 かつ 20」になります。 「同時に10であり20でもある数」は存在しません。「10であれば20でない」ですし「20であれば10でない」ので「10 かつ 20」と言う値は存在しません。 「5,10,15,20,25の中で、同時に10であり20であるのはどれですか?」の答えは「そんな数は存在しない」です。 条件を逆にしていた訳ですから「その逆はどれですか?」の答えは「全部」です。 これが「b.の文」です。
その他の回答 (5)
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19841)
訂正。 >これが「a.の文」です。 >これが「b.の文」です。 a.、b.が逆になってました。訂正してお詫び致します。
お礼
訂正、把握しました。ありがとうございます。
- sknbsknb2
- ベストアンサー率38% (1158/3032)
SQLのことはよく知りませんが、 DEPTNO<>10の結果は、[5,15,20,25] DEPTNO<>20の結果は、[5,10,15,25] orの場合はすべての値が抽出されるので[5,10,15,20,25] andの場合は両方の結果に含まれる値のみ抽出されるので[5,15,25] という結果になると思います。
お礼
sknbsknb2様、ありがとうございます。 orとandの違いを明確に理解する事が出来ました。 ありがとうございます。
- Chronos198
- ベストアンサー率30% (105/349)
DEPTNO=10<>10 -- FALSE DEPTNO=10<>20 -- TRUE a FALSE or TRUE = TRUE -- 10は選ばれる b FALSE and TRUE = FALSE -- 10は選ばれない DEPTNO=20<>10 -- TRUE DEPTNO=20<>20 -- FALSE a TRUE or FALSE = TRUE -- 20は選ばれる b TRUE and FALSE = FALSE -- 20は選ばれない DEPTNO=5<>10 -- TRUE DEPTNO=5<>20 -- TRUE a TRUE or TRUE = TRUE -- 5は選ばれる b TRUE and TRUE = TRUE -- 5は選ばれる DEPTNO=X<>10 -- FALSE DEPTNO=X<>20 -- FALSE a FALSE or FALSE = FALSE -- Xは選ばれない 「10であり20でもある数字X」というのは存在しませんので、aは全てが選択されますね
- 片野 満里子(@mariko0512)
- ベストアンサー率50% (1/2)
a.SELECT * FROM EMP WHERE DEPTNO <>10 or DEPTNO <> 20; b.SELECT * FROM EMP WHERE DEPTNO <>10 AND DEPTNO <> 20; DEPTNOの値 5 10 15 20 25 a.の場合は、全てが抽出されてしまうのでは無いのでしょうか >10でない、または20でない とは 10じゃないデータ か(or) 20じゃないデータを抽出しようとしていて 1つ目の条件で10以外のデータが対象になる(5,15,20,25) けれど 2つ目の条件で20以外のデータが対象となり(5,10,15,25) 結果全部出力される結果になります。 b.の場合は、10と20以外のデータが抽出されます。 >10でない、かつ20でない とは 10のデータ と(AND) 20のデータ以外を抽出するからです。 説明分かりにくかったらすいません><
お礼
mariko0512様、判りやすい説明をありがとうございます。 orの方(a.の方)はinで書き換えるとしたら(value1,value2,…) その中のどれかで真ならばで抽出され、 AND(b.の方)は全ての判定で真ならば抽出されると言う事なのですね。 おかげでさまですっきりする事が出来ました。 ありがとうございました。
- aenvgielle
- ベストアンサー率14% (128/893)
「10」でないのは「5,15,20,25」---(A) 「20」でないのは「5,10,15,25」---(B) a.の文は(A)(B)のorつまり和なので、(A)か(B)に含まれているもので結果は「5,10,15,20,25」 b.の文は(A)(B)のandつまり積なので共通部分のみで結果は「5,15,25」になります。
お礼
aenvgielle様、非常に判りやすい説明をありがとうございます。 すっきり、納得する事が出来ました。 ありがとうございました。
お礼
chie65535様、回答ありがとうございます。 また、基本的な内容に対し、 時間を割いて集合(逆条件で考える)所から教えてくださり 基本情報で学習した集合のベン図を思い出しながら、 思わずうなずきながら理解する事が出来ました。 どうもありがとうございました。