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.の結果は変わるのでしょうか?
基本的な質問をしてしまいますが、宜しくお願いします。
No.5ベストアンサー
- 回答日時:
>テーブルの中に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.の文」です。
chie65535様、回答ありがとうございます。
また、基本的な内容に対し、
時間を割いて集合(逆条件で考える)所から教えてくださり
基本情報で学習した集合のベン図を思い出しながら、
思わずうなずきながら理解する事が出来ました。
どうもありがとうございました。
No.4
- 回答日時:
SQLのことはよく知りませんが、
DEPTNO<>10の結果は、[5,15,20,25]
DEPTNO<>20の結果は、[5,10,15,25]
orの場合はすべての値が抽出されるので[5,10,15,20,25]
andの場合は両方の結果に含まれる値のみ抽出されるので[5,15,25]
という結果になると思います。
No.3
- 回答日時:
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は全てが選択されますね
No.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.の方)は全ての判定で真ならば抽出されると言う事なのですね。
おかげでさまですっきりする事が出来ました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- 英語 L-PRF can be obtained by manual or automated metho 1 2022/04/08 09:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ORMについて
-
これをSQL文で出来るでしょうか?
-
AccessのSQL文で1件のみヒット...
-
SQL*Loader Append
-
アクセスのレポートでレコード...
-
【PL/SQL】FROM区に変数を使う方法
-
group byの並び順を変えるだけ...
-
【SQL】日付が最大のレコード群...
-
ANDとORの正確な理解が出来ませ...
-
Oracle9iデータベースの削除に...
-
一気に複数のレコードをinsert...
-
Oracle10gからkeySQLで集計データ
-
単一グループのグループ関数で...
-
SQL文の構築について教えてくだ...
-
引数によってwhere句を切り替え...
-
SQL文(重複データを省く)
-
1の行を固定した上でVBAを用い...
-
複数のテーブルから値を合計出...
-
2回実行のSQL文を1回にしたい
-
count関数の値をwhere句で使用...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
単一グループのグループ関数で...
-
【PL/SQL】FROM区に変数を使う方法
-
SELECT FOR UPDATE で該当レコ...
-
AccessのSQL文で1件のみヒット...
-
アクセスのレポートでレコード...
-
where句中のtrim関数について
-
group byの並び順を変えるだけ...
-
引数によってwhere句を切り替え...
-
SQL*Loader Append
-
SQLで条件にヒットしたレコード...
-
updateで複数行更新したい
-
データ
-
トランザクションログを出力せ...
-
「数字で始まらない」ものを抽...
-
大量レコードをTRUNCATEせずに...
-
osqleditについて
-
BLOB型項目をSQLの検索条件に指...
-
これをSQL文で出来るでしょうか?
-
ACCESS レコードの並び順について
-
【SQL】違うフィールド同士の集...
おすすめ情報