問題集の答えが腑に落ちないのでどなたかわかりやすく説明いただけますでしょうか?
EMP表
EMPNO ENAME SAL MGR DEPTNO
--------------------------------------
1000 SCOTT 1000 NULL 10
1010 ADAMS 2000 1000 10
1030 TAYLOR 600 1000 30
1050 MILLER 800 1030 10
以下の副問い合わせを使ったSELECT文を実行した。検索されるデータ件数を選びなさい。
select empno,ename from emp where empno not in (select mgr from emp);
A:0件
B:1件
C:2件
D:3件
解答はAの0件なのですが、なぜ0件なのでしょうか?
当方の解釈ですと、副問い合わせでmgrが(NULL,1000,1030)となり
where empno not in (NULL,1000,1030)
で
「empnoがNULLでも1000でも1030でもない件数」
となり、empnoが1010と1050の行が検索され、cの2件が正解なのでは?
と思っているのですが・・・
間違いをわかりやすく教えていただけますでしょうか?
宜しくお願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
他の解答者さんもおっしゃっているように、論理演算子「AND」の問題ですね。
(質問者さんは、どうやら比較演算子「NOT IN」の方は理解されているようですし。)>nullが検索されるとなぜ0件なのか教えていただけますでしょうか。
通常は、0『偽(FALSE)』か1『真(TRUE)』 のどちらかなのですが、NULLがきた場合、AND演算子では検索の処理を強制終了したような感じとなって「0件」、つまり該当する件数無しとする訳ですね。
where empno <> NULL
AND empno <> 1000
AND empno <> 1030
は、0です。
参考URL:http://www.rfs.jp/sb/sql/02/02.html#AND
No.3
- 回答日時:
こういうときはマニュアルを参照しましょう。
以下に解説されております。マニュアルどおりの動きですよ。http://otndnld.oracle.co.jp/document/products/or …
>NOT IN演算子に続くリストの中のいずれかの項目がNULLの場合は、すべての行はFALSEまたは不明(UNKNOWN)と評価されます(行は戻されません)。
>たとえば、次の文ではそれぞれの行に対して文字列'True'が戻されます。
>
>SELECT 'True' FROM employees
> WHERE department_id NOT IN (10, 20);
>
>ただし、次の文では行は戻されません。
>
>SELECT 'True' FROM employees
> WHERE department_id NOT IN (10, 20, NULL);
>
>この例で行が戻されないのは、WHERE句の条件が次のように評価されるためです。
>
>department_id != 10 AND department_id != 20 AND department_id != null
>
>3番目の条件でdepartment_idとNULLの比較が行われるため、この条件の結果がUNKNOWNとなり、
>式全体の結果がFALSE(department_idを持つ行が10または20と等しいため)となります。
>特に、NOT IN演算子が副問合せを参照するときは、
>このような動作を見逃してしまう可能性があることに注意してください。
>
>また、NOT IN条件が、行を戻さない副問合せを参照する場合は、
>次のように、すべての行が戻されます。
>
>SELECT 'True' FROM employees
> WHERE department_id NOT IN (SELECT 0 FROM DUAL WHERE 1=2);
No.2
- 回答日時:
No.1
- 回答日時:
意地悪な引っ掛け問題に、見事に引っかかってる感じだな。
select empno,ename from emp where empno not in (select mgr from emp);
は、0件。
select empno,ename from emp where empno not in (select mgr from emp where mgr is not null);
は、2件。
という結果になるのですが、これで理解できるんじゃないですか?
この回答への補足
回答ありがとうございます。
しかし、私の理解不足ですが
(select mgr from emp where mgr is not null);
はnull以外のmgrを検索するので1000と1030が検索され、
結果、empnoが1010と1050の2件
と同じ答えになってしまいます。
nullが検索されるとなぜ0件なのか教えていただけますでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
selectの単純繰り返し
-
フラグをたてるってどういうこ...
-
sqlに記述できない文字
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
オラクルのUPDATEで複数テーブル
-
PostgreSQLのtimestamp型で時間...
-
テーブル名が可変の場合のクエ...
-
【VB】セルが空になるまで処理...
-
Excel VBAのユーザーフォームで...
-
UPDATEで既存のレコードに文字...
-
truncate tableを使って複数の...
-
Accessの構成をコピーしたい
-
ADO+ODBCでテーブルに接続する...
-
2つのテーブルをLIKE演算子のよ...
-
MySQLで数字の値のもののみを取...
-
既存データをINSERT文にして出...
-
SELECT文で足し算をした場合、N...
-
データ無し時は空白行にしたい...
-
追加クエリで重複データなしで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
selectの単純繰り返し
-
SELECT文の結果をDEFINEの値と...
-
SQL Server:UNIONで結合した結...
-
SQL WHERE文のノットイコール...
-
RANK関数で順位付けする方法
-
文字例の比較について WHERE句
-
SQLの問題で解答を見ても腑に落...
-
詳細設計書でselect文の導き方
-
oracle シーケンスの欠番を確認...
-
SQLのIF文
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
既存データをINSERT文にして出...
-
UPDATEで既存のレコードに文字...
-
PostgreSQLのtimestamp型で時間...
-
エラーを起こす方法
おすすめ情報