アプリ版:「スタンプのみでお礼する」機能のリリースについて

ANDとORの正確な理解が出来ません。。

お世話になっております。
現在、翔泳社の黒本を参考書にOracle11gのSQL基礎Iの学習をしております。

1点、どうしても参考書の解説を読んでも理解できない問題がありまして、
質問いたします。

問題:次のSQL文と同じ結果になるものはどちらか選びなさい
SELECT * FROM EMP WHERE DEPTNO NOT IN (10,20);

a.SELECT * FROM EMP WHERE DEPTNO <>10 or DEPTNO <> 20;
b.SELECT * FROM EMP WHERE DEPTNO <>10 AND DEPTNO <> 20;
(正答はb.)

問題のSQL文のWHERE句は「DEPTNOが10でも20でもない物」を取ると理解しています。
そしてa.の文は「10でない、または20でない」、
b.の文は「10でない、かつ20でない」、
と理解しています。

テーブルの中にDEPTNOの値が 「5,10,15,20,25」だったとして、
問題文もa.もb.も5,15,25が取られるのではないか?
なぜb.のみが正解なのか?どうしても理解できません。
どういうレコードがあるとき、a. と b.の結果は変わるのでしょうか?

基本的な質問をしてしまいますが、宜しくお願いします。

A 回答 (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.の文」です。
    • good
    • 0
この回答へのお礼

chie65535様、回答ありがとうございます。

また、基本的な内容に対し、
時間を割いて集合(逆条件で考える)所から教えてくださり
基本情報で学習した集合のベン図を思い出しながら、
思わずうなずきながら理解する事が出来ました。

どうもありがとうございました。

お礼日時:2010/06/02 20:34

訂正。



>これが「a.の文」です。
>これが「b.の文」です。

a.、b.が逆になってました。訂正してお詫び致します。
    • good
    • 0
この回答へのお礼

訂正、把握しました。ありがとうございます。

お礼日時:2010/06/02 20:35

SQLのことはよく知りませんが、



DEPTNO<>10の結果は、[5,15,20,25]
DEPTNO<>20の結果は、[5,10,15,25]

orの場合はすべての値が抽出されるので[5,10,15,20,25]
andの場合は両方の結果に含まれる値のみ抽出されるので[5,15,25]

という結果になると思います。
    • good
    • 0
この回答へのお礼

sknbsknb2様、ありがとうございます。
orとandの違いを明確に理解する事が出来ました。
ありがとうございます。

お礼日時:2010/06/02 20:28

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は全てが選択されますね
    • good
    • 0

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のデータ以外を抽出するからです。

説明分かりにくかったらすいません><
    • good
    • 0
この回答へのお礼

mariko0512様、判りやすい説明をありがとうございます。

orの方(a.の方)はinで書き換えるとしたら(value1,value2,…)
その中のどれかで真ならばで抽出され、
AND(b.の方)は全ての判定で真ならば抽出されると言う事なのですね。
おかげでさまですっきりする事が出来ました。
ありがとうございました。

お礼日時:2010/06/02 20:27

「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」になります。
    • good
    • 0
この回答へのお礼

aenvgielle様、非常に判りやすい説明をありがとうございます。

すっきり、納得する事が出来ました。
ありがとうございました。

お礼日時:2010/06/02 20:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!