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

このQ&Aのポイント
  • ANDとORの正確な理解が出来ません。
  • 問題文のSQLのWHERE句は「DEPTNOが10でも20でもない物」を取ると理解しています。
  • b.の文は「10でない、かつ20でない」という条件を満たすレコードを取得するため、b.のみが正解です。
回答を見る
  • ベストアンサー

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

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.の結果は変わるのでしょうか? 基本的な質問をしてしまいますが、宜しくお願いします。

  • Oracle
  • 回答数6
  • ありがとう数20

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8516/19358)
回答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.の文」です。

wendy0303
質問者

お礼

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

その他の回答 (5)

  • chie65535
  • ベストアンサー率43% (8516/19358)
回答No.6

訂正。 >これが「a.の文」です。 >これが「b.の文」です。 a.、b.が逆になってました。訂正してお詫び致します。

wendy0303
質問者

お礼

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

  • sknbsknb2
  • ベストアンサー率38% (1125/2898)
回答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] という結果になると思います。

wendy0303
質問者

お礼

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

回答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のデータ以外を抽出するからです。 説明分かりにくかったらすいません><

wendy0303
質問者

お礼

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

回答No.1

「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」になります。

wendy0303
質問者

お礼

aenvgielle様、非常に判りやすい説明をありがとうございます。 すっきり、納得する事が出来ました。 ありがとうございました。

関連するQ&A

  • 翔泳社オラクルマスター教科書Silver

    翔泳社オラクルマスター教科書Silverを使ってシルバー取得の勉強をしていますが、どうもこの本の解答に納得のいかない点が多すぎで、このあいだから立て続けに質問してしまってごめんなさい。 何しろ知識が無さ過ぎて、本があっているのか、自分がおかしいのか、判断しかねるのです。 で、今日はこの問題です。 ---問題ここから--- 次の結合文の中で実行時にエラーになるものをひとつ選びなさい a.SELECT DEPT.DEPTNO,EMP.ENAME FROM DEPT D,EMP E WHERE DEPT.DEPTNO=EMP.DEPTNO; b.SELECT ENAME,SAL,GRADE FROM SALGTADE,EMP WHERE SAL>=LOSAL AND SAL<=HISAL; c.SELECT DEPT.DEPTNO,DMP.ENAME FROM DEPT,EMP WHERE DEPT.DEPTNO(+)=EMP.DEPTNO; D.SELECT D.DEPTNO,E.ENAME FROM DEPT D,EMP E WHERE D.DEPTNO=E.DEPTNO; ----問題ここまで---- で、この答えが選択肢aとなっているのですが、納得できません。 解説によれば、「FROM句で二つ以上の表を指定した場合、SELECT句やWHERE句で指定する列名は、どの表の列か判断できなければいけません。」 とあります。 つまり、正解は「どの表か明示的に表示していない」選択肢b だと思うのですが、やはり教科書があっていますか?? 私の考え方はどう間違っているのか、教えていただけたら嬉しいです。 どうかよろしくお願い致します☆

  • ANDとかORとかを書く位置

    ネットで調べてみても見つからないので皆さんに質問させて下さい。 SQLで結合条件を記述する際、よく仕事現場で見かけるのは以下のような 書き方です。 SELECT うんたら FROM  かんたら WHERE  A = AAA AND   B = BBB OR   C = CCC しかし、個人的にこれは嫌いです。 何故なら結合条件はWHEREの配下に存在するものであり、WHEREと同列 ではないはずだからです。 なので、私が書くとこうなります。 SELECT うんたら FROM  かんたら WHERE  A = AAA AND     B = BBB OR     C = CCC もしくは、そんな書き方しませんが・・・。 SELECT うんたら FROM  かんたら WHERE  A = AAA     AND     B = BBB     OR     C = CCC ここで、最初に示した書き方に最もな理由が知りたいと思います。 好みの問題なのかもしれませんが・・・。 投稿時のインデントが上手くいかないのでいいように解釈して下さい(笑)

  • 自分自身のテーブルを参照して更新

    ORACLEで簡単にできたのがSQLServerで上手くできなくて困っています。 下のようなSQLです。SQLServerでUPDATE時に別名を付けようとすると エラーになってしまいます。良いSQLをご教授頂ければ、と思います。 update emp e set sal=  (select max(ee.sal) from emp ee where e.deptno=ee.deptno)

  • SQL文でWhere+orを使う理由

    ItemsテーブルからValueにAという値かBという値を持ってる人のNameを取得するSQL文について調べたのですが、以下のようになってました。 SELECT Name FROM Items WHERE Value IN ('A', 'B') これで動く結果については納得できたのですが、ORを使っても良いのではないでしょうか。以下のようなやり方は出来ないのかと思ったのですが SELECT Name FROM Items WHERE Value = 'A' or 'B' のように=(イコール)の後の値にorをつけるという書き方は見当たりませんでした。これで動かない場合、以下の方法なら動くはずだと思います。 SELECT Name FROM Items WHERE Value = 'A' or Value = 'B' おそらく結果はINを使った場合と同じだと思うのですが、これはどのようにして使い分けられているのでしょうか?文の短さで言えば値が複数の場合はINの方がはるかに短くなってスマートですが、単数でもINの方が短く済みそうな気がします。INの後のカッコ内に更にSQL文を書くことも出来ますし、Where+orの意義がよく分からなくなってきました。

  • SQL文について(ANDとORの論理演算について)

    下記の質問についてご教授お願い致します [設問] 国語と数学の試験を実施し、2教科の成績は氏名とともに、得点表に記録されている。 1教科は平均点以上で、残りの1教科は平均点未満の生徒氏名を表から抽出するSQLはどれか。 A:国語の点数が国語の平均点以上 B:数学の点数が数学の平均点以上 とするときに、SQL文は SELECT 生徒氏名 FROM 得点 WHERE (A OR B) AND NOT (A AND B) となります。 このときに、 WHERE (A OR B) AND NOT (A AND B) ここの論理演算を理解することが難しいです。 論理演算を分解すると A OR B 国語または数学が平均点以上であるケース NOT (A AND B) 国語と数学の両方が平均点以上であるケース となり、この両者をANDで取ると 1教科は平均点以上で、残りの1教科は平均点未満になることになります。 この論理演算でどうしてもこのような結果を引き出すことができません。 お手数ですがご教授お願いいたします。

  • エラー「単一グループのグループ関数ではありません」

    エラーをどうやれば修正できるかわかりません。 回答のほどよろしくお願いいたします。 SELECT EMPNO, ENAME, DEPTNO, SAL FROM EMP HAVING AVG(SAL) >ANY (SELECT SAL FROM EMP WHERE HIREDATE LIKE '82%') SQL> DESCRIBE EMP; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

  • サブクエリ内のORとANDについて

    見にくくて申し訳ないです。 以下のSQLについてなのですが、 (1)のSQLでは正常にフォームが開きます、 (2)のSQLで実行しますと、 「実行時エラー3163: The field too small to accept of data you attempted to add.Try inserting less data.」 が出てしまいます。(1)と(2)SQLの違いは、2つの条件をANDかORで結んでるところなのですが なぜORだけにエラーが出るのか原因がわかりません・・ お時間がある方、よろしければご教授ください。 よろしくお願い致します。 (1) DoCmd.OpenForm formName, , , "(Q_kyogo.ID IN(select tbl_press.ID from tbl_press where tbl_press.メーカー IN('ABC'))) AND (tbl_press.UNIT = 1)" (2) DoCmd.OpenForm formName, , , "(Q_kyogo.ID IN(select tbl_press.ID from tbl_press where tbl_press.メーカー IN('ABC'))) OR (tbl_press.UNIT = 1)"

  • OR と IN の違い

    いつもお世話になります。 SQLについて質問です。 以下の2つのSQLがあります。同じ結果が得られると思ったのですが、 結果がまたくことなりました。何故か理由を教えて下さい。 (1) SELECT count(*) FROM uriage WHERE subsystem_cd = 'ABC' AND store_name = 'MISAWA' AND opend_dt = 20061130 or opten_dt = 19000101 AND id <> 108 AND begin_dt <= 20061122 (2) SELECT count(*) FROM uriage WHERE subsystem_cd = 'ABC' AND store_name = 'MISAWA' AND opend_dt in (20061130,19000101) AND id <> 108 AND begin_dt <= 20061122 ※(1)のorのところを1つずつにして実行(SQL文を2つ作成)し、その結果を合計すると(2)の結果と同等になります。

  • LEFT JOINが2つあるSQL文でANDの意味

    ■下記SQL文の意味を教えてください SELECT a.*, b.being_name FROM alive a  LEFT JOIN being b ON a.hoge_id = b.id  LEFT JOIN call c ON c.call_id = a.hoge_id   AND f.hoge_id = 12  WHERE f.hoge_id = 12 OR b.id = 12 ※12の部分は動的に切り替わります ・LEFT JOINが2つあるので、3つのテーブルを結合しているのでしょうか? ・左テーブルは「alive a」で、この右側に2つのテーブルが結合している、という認識でよいでしょうか? >SELECT フィールド名 FROM テーブル名 WHERE 条件式1 AND 条件式2 >「AND」は2つの条件式の論理積 ・上記内容をネットで見かけたのですが、「AND」は、「WHERE」の前に来てもいいのでしょうか? それともこのSQLの「AND」は違う使い方をしているのでしょうか? 何か、LEFT JOINに関係しているのでしょうか?

    • ベストアンサー
    • MySQL
  • PLSQLで条件によりSQLを動的に変えたい

    例えば、あらかじめテーブルなどを読み、その内容により、 SQLの文そのものを非常に変えたいとします。 SQLその1 select * from TABLEA where A = 1 SQLその2 select * from TABLEA where A = 1 and B = 2 and C = 3 and D = 4 上記は例ですが、内容などにより複雑な条件式を追加したい。 ベースのSQLは非常に長い為、 例えば 完全に切り分けるのでは無く、共通の部分は共通ソースとしたい。 また、プリプロセッサみたいに、条件式が追加された場合 あたかも、初めからそのSQLのみがあり、他の制御文などをSQL文自身には追加したくない。 動的SQLでは無い方法でそのような事が可能でしょうか? ----- イメージ ----- select * from TABLEA where A = 1 IF (条件がある時のみ) B = 2 and C = 3 and D = 4 END IF; ------------------- 実際には、SQL文の中にPLSQLの制御文をうまく追加できない。