では、なぜ私の答えは間違っているのでしょうか?
あなたの答えは正しいです。
先生が間違っているとマークした理由は、その質問で結合の使用を練習しようとしたためだと思います。しかし、それが意図されていた場合、それは問題の一部であったはずです.
これらのクエリの違いは何ですか
技術的には、それらは実際には異なります。単純なクエリ オプティマイザーを備えた DBMS は、教師の回答からの結合とは異なる方法でサブセレクトを取得します。
優れたオプティマイザーを備えた DBMS が実際に両方のクエリに対して同じ実行計画を考え出すことができても、私は驚かないでしょう。
編集
50000 冊の本、50000 人の著者、および 7 つの異なるジャンルをテストするテストデータを作成しました (オプティマイザは単純にテーブル全体を取得する傾向があるため、数字が小さいほど意味がありません)。このステートメントは 7144 行を返します。
PostgreSQL
実行計画は、「結合」メソッドのいくつかの小さな変更を除いてほぼ同じです。
サブセレクト バージョンの計画は次のとおりです: http://explain.depesz.com/s/eov
結合バージョンの計画は次のとおりです: http://explain.depesz.com/s/aTI
驚くべきことに、結合バージョンのコスト値はわずかに高くなります。
オラクル
どちらのプランも 100% 同一です。
-------------------------------------------------- ------------------------------------
| | ID | 操作 | 名前 | 行 | 行 バイト |TempSpc| コスト (%CPU)| 時間 |
-------------------------------------------------- ------------------------------------
| | 0 | ステートメントを選択 | | | 6815 | 399K| | | 273 (2)| 00:00:04 |
| | 1 | ハッシュユニーク| | | 6815 | 399K| 464K| 273 (2)| 00:00:04 |
|* 2 | ハッシュ結合 | | | 6815 | 399K| | | 172 (2)| 00:00:03 |
|* 3 | テーブルへのアクセスがいっぱい| 予約 | 6815 | 166K| | | 69 (2)| 00:00:01 |
| | 4 | テーブルへのアクセスがいっぱい| 著者 | 50000 | 1708K| | | 103 (1)| 00:00:02 |
-------------------------------------------------- ------------------------------------
使用時の統計を見ると、autotrace
何の違いもありません。違いが見られるとは思わないので、トレース ファイルを実際に作成して分析することは気にしませんでした。
book.genre
インデックス onが追加されても、状況は実際には変わりません。Oracle は、(100000 行であっても) フル テーブル スキャンに固執します。おそらく、テーブルの幅があまり広くなく、多くの行が 1 ページに収まるためです。
PostgreSQL は両方のステートメントにインデックスを使用しますが、計画間に実際の違いはまだありません。